| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572485734857448575485764857748578485794858048581485824858348584485854858648587485884858948590485914859248593485944859548596485974859848599486004860148602486034860448605486064860748608486094861048611486124861348614486154861648617486184861948620486214862248623486244862548626486274862848629486304863148632486334863448635486364863748638486394864048641486424864348644486454864648647486484864948650486514865248653486544865548656486574865848659486604866148662486634866448665486664866748668486694867048671486724867348674486754867648677486784867948680486814868248683486844868548686486874868848689486904869148692486934869448695486964869748698486994870048701487024870348704487054870648707487084870948710487114871248713487144871548716487174871848719487204872148722487234872448725487264872748728487294873048731487324873348734487354873648737487384873948740487414874248743487444874548746487474874848749487504875148752487534875448755487564875748758487594876048761487624876348764487654876648767487684876948770487714877248773487744877548776487774877848779487804878148782487834878448785487864878748788487894879048791487924879348794487954879648797487984879948800488014880248803488044880548806488074880848809488104881148812488134881448815488164881748818488194882048821488224882348824488254882648827488284882948830488314883248833488344883548836488374883848839488404884148842488434884448845488464884748848488494885048851488524885348854488554885648857488584885948860488614886248863488644886548866488674886848869488704887148872488734887448875488764887748878488794888048881488824888348884488854888648887488884888948890488914889248893488944889548896488974889848899489004890148902489034890448905489064890748908489094891048911489124891348914489154891648917489184891948920489214892248923489244892548926489274892848929489304893148932489334893448935489364893748938489394894048941489424894348944489454894648947489484894948950489514895248953489544895548956489574895848959489604896148962489634896448965489664896748968489694897048971489724897348974489754897648977489784897948980489814898248983489844898548986489874898848989489904899148992489934899448995489964899748998489994900049001490024900349004490054900649007490084900949010490114901249013490144901549016490174901849019490204902149022490234902449025490264902749028490294903049031490324903349034490354903649037490384903949040490414904249043490444904549046490474904849049490504905149052490534905449055490564905749058490594906049061490624906349064490654906649067490684906949070490714907249073490744907549076490774907849079490804908149082490834908449085490864908749088490894909049091490924909349094490954909649097490984909949100491014910249103491044910549106491074910849109491104911149112491134911449115491164911749118491194912049121491224912349124491254912649127491284912949130491314913249133491344913549136491374913849139491404914149142491434914449145491464914749148491494915049151491524915349154491554915649157491584915949160491614916249163491644916549166491674916849169491704917149172491734917449175491764917749178491794918049181491824918349184491854918649187491884918949190491914919249193491944919549196491974919849199492004920149202492034920449205492064920749208492094921049211492124921349214492154921649217492184921949220492214922249223492244922549226492274922849229492304923149232492334923449235492364923749238492394924049241492424924349244492454924649247492484924949250492514925249253492544925549256492574925849259492604926149262492634926449265492664926749268492694927049271492724927349274492754927649277492784927949280492814928249283492844928549286492874928849289492904929149292492934929449295492964929749298492994930049301493024930349304493054930649307493084930949310493114931249313493144931549316493174931849319493204932149322493234932449325493264932749328493294933049331493324933349334493354933649337493384933949340493414934249343493444934549346493474934849349493504935149352493534935449355493564935749358493594936049361493624936349364493654936649367493684936949370493714937249373493744937549376493774937849379493804938149382493834938449385493864938749388493894939049391493924939349394493954939649397493984939949400494014940249403494044940549406494074940849409494104941149412494134941449415494164941749418494194942049421494224942349424494254942649427494284942949430494314943249433494344943549436494374943849439494404944149442494434944449445494464944749448494494945049451494524945349454494554945649457494584945949460494614946249463494644946549466494674946849469494704947149472494734947449475494764947749478494794948049481494824948349484494854948649487494884948949490494914949249493494944949549496494974949849499495004950149502495034950449505495064950749508495094951049511495124951349514495154951649517495184951949520495214952249523495244952549526495274952849529495304953149532495334953449535495364953749538495394954049541495424954349544495454954649547495484954949550495514955249553495544955549556495574955849559495604956149562495634956449565495664956749568495694957049571495724957349574495754957649577495784957949580495814958249583495844958549586495874958849589495904959149592495934959449595495964959749598495994960049601496024960349604496054960649607496084960949610496114961249613496144961549616496174961849619496204962149622496234962449625496264962749628496294963049631496324963349634496354963649637496384963949640496414964249643496444964549646496474964849649496504965149652496534965449655496564965749658496594966049661496624966349664496654966649667496684966949670496714967249673496744967549676496774967849679496804968149682496834968449685496864968749688496894969049691496924969349694496954969649697496984969949700497014970249703497044970549706497074970849709497104971149712497134971449715497164971749718497194972049721497224972349724497254972649727497284972949730497314973249733497344973549736497374973849739497404974149742497434974449745497464974749748497494975049751497524975349754497554975649757497584975949760497614976249763497644976549766497674976849769497704977149772497734977449775497764977749778497794978049781497824978349784497854978649787497884978949790497914979249793497944979549796497974979849799498004980149802498034980449805498064980749808498094981049811498124981349814498154981649817498184981949820498214982249823498244982549826498274982849829498304983149832498334983449835498364983749838498394984049841498424984349844498454984649847498484984949850498514985249853498544985549856498574985849859498604986149862498634986449865498664986749868498694987049871498724987349874498754987649877498784987949880498814988249883498844988549886498874988849889498904989149892498934989449895498964989749898498994990049901499024990349904499054990649907499084990949910499114991249913499144991549916499174991849919499204992149922499234992449925499264992749928499294993049931499324993349934499354993649937499384993949940499414994249943499444994549946499474994849949499504995149952499534995449955499564995749958499594996049961499624996349964499654996649967499684996949970499714997249973499744997549976499774997849979499804998149982499834998449985499864998749988499894999049991499924999349994499954999649997499984999950000500015000250003500045000550006500075000850009500105001150012500135001450015500165001750018500195002050021500225002350024500255002650027500285002950030500315003250033500345003550036500375003850039500405004150042500435004450045500465004750048500495005050051500525005350054500555005650057500585005950060500615006250063500645006550066500675006850069500705007150072500735007450075500765007750078500795008050081500825008350084500855008650087500885008950090500915009250093500945009550096500975009850099501005010150102501035010450105501065010750108501095011050111501125011350114501155011650117501185011950120501215012250123501245012550126501275012850129501305013150132501335013450135501365013750138501395014050141501425014350144501455014650147501485014950150501515015250153501545015550156501575015850159501605016150162501635016450165501665016750168501695017050171501725017350174501755017650177501785017950180501815018250183501845018550186501875018850189501905019150192501935019450195501965019750198501995020050201502025020350204502055020650207502085020950210502115021250213502145021550216502175021850219502205022150222502235022450225502265022750228502295023050231502325023350234502355023650237502385023950240502415024250243502445024550246502475024850249502505025150252502535025450255502565025750258502595026050261502625026350264502655026650267502685026950270502715027250273502745027550276502775027850279502805028150282502835028450285502865028750288502895029050291502925029350294502955029650297502985029950300503015030250303503045030550306503075030850309503105031150312503135031450315503165031750318503195032050321503225032350324503255032650327503285032950330503315033250333503345033550336503375033850339503405034150342503435034450345503465034750348503495035050351503525035350354503555035650357503585035950360503615036250363503645036550366503675036850369503705037150372503735037450375503765037750378503795038050381503825038350384503855038650387503885038950390503915039250393503945039550396503975039850399504005040150402504035040450405504065040750408504095041050411504125041350414504155041650417504185041950420504215042250423504245042550426504275042850429504305043150432504335043450435504365043750438504395044050441504425044350444504455044650447504485044950450504515045250453504545045550456504575045850459504605046150462504635046450465504665046750468504695047050471504725047350474504755047650477504785047950480504815048250483504845048550486504875048850489504905049150492504935049450495504965049750498504995050050501505025050350504505055050650507505085050950510505115051250513505145051550516505175051850519505205052150522505235052450525505265052750528505295053050531505325053350534505355053650537505385053950540505415054250543505445054550546505475054850549505505055150552505535055450555505565055750558505595056050561505625056350564505655056650567505685056950570505715057250573505745057550576505775057850579505805058150582505835058450585505865058750588505895059050591505925059350594505955059650597505985059950600506015060250603506045060550606506075060850609506105061150612506135061450615506165061750618506195062050621506225062350624506255062650627506285062950630506315063250633506345063550636506375063850639506405064150642506435064450645506465064750648506495065050651506525065350654506555065650657506585065950660506615066250663506645066550666506675066850669506705067150672506735067450675506765067750678506795068050681506825068350684506855068650687506885068950690506915069250693506945069550696506975069850699507005070150702507035070450705507065070750708507095071050711507125071350714507155071650717507185071950720507215072250723507245072550726507275072850729507305073150732507335073450735507365073750738507395074050741507425074350744507455074650747507485074950750507515075250753507545075550756507575075850759507605076150762507635076450765507665076750768507695077050771507725077350774507755077650777507785077950780507815078250783507845078550786507875078850789507905079150792507935079450795507965079750798507995080050801508025080350804508055080650807508085080950810508115081250813508145081550816508175081850819508205082150822508235082450825508265082750828508295083050831508325083350834508355083650837508385083950840508415084250843508445084550846508475084850849508505085150852508535085450855508565085750858508595086050861508625086350864508655086650867508685086950870508715087250873508745087550876508775087850879508805088150882508835088450885508865088750888508895089050891508925089350894508955089650897508985089950900509015090250903509045090550906509075090850909509105091150912509135091450915509165091750918509195092050921509225092350924509255092650927509285092950930509315093250933509345093550936509375093850939509405094150942509435094450945509465094750948509495095050951509525095350954509555095650957509585095950960509615096250963509645096550966509675096850969509705097150972509735097450975509765097750978509795098050981509825098350984509855098650987509885098950990509915099250993509945099550996509975099850999510005100151002510035100451005510065100751008510095101051011510125101351014510155101651017510185101951020510215102251023510245102551026510275102851029510305103151032510335103451035510365103751038510395104051041510425104351044510455104651047510485104951050510515105251053510545105551056510575105851059510605106151062510635106451065510665106751068510695107051071510725107351074510755107651077510785107951080510815108251083510845108551086510875108851089510905109151092510935109451095510965109751098510995110051101511025110351104511055110651107511085110951110511115111251113511145111551116511175111851119511205112151122511235112451125511265112751128511295113051131511325113351134511355113651137511385113951140511415114251143511445114551146511475114851149511505115151152511535115451155511565115751158511595116051161511625116351164511655116651167511685116951170511715117251173511745117551176511775117851179511805118151182511835118451185511865118751188511895119051191511925119351194511955119651197511985119951200512015120251203512045120551206512075120851209512105121151212512135121451215512165121751218512195122051221512225122351224512255122651227512285122951230512315123251233512345123551236512375123851239512405124151242512435124451245512465124751248512495125051251512525125351254512555125651257512585125951260512615126251263512645126551266512675126851269512705127151272512735127451275512765127751278512795128051281512825128351284512855128651287512885128951290512915129251293512945129551296512975129851299513005130151302513035130451305513065130751308513095131051311513125131351314513155131651317513185131951320513215132251323513245132551326513275132851329513305133151332513335133451335513365133751338513395134051341513425134351344513455134651347513485134951350513515135251353513545135551356513575135851359513605136151362513635136451365513665136751368513695137051371513725137351374513755137651377513785137951380513815138251383513845138551386513875138851389513905139151392513935139451395513965139751398513995140051401514025140351404514055140651407514085140951410514115141251413514145141551416514175141851419514205142151422514235142451425514265142751428514295143051431514325143351434514355143651437514385143951440514415144251443514445144551446514475144851449514505145151452514535145451455514565145751458514595146051461514625146351464514655146651467514685146951470514715147251473514745147551476514775147851479514805148151482514835148451485514865148751488514895149051491514925149351494514955149651497514985149951500515015150251503515045150551506515075150851509515105151151512515135151451515515165151751518515195152051521515225152351524515255152651527515285152951530515315153251533515345153551536515375153851539515405154151542515435154451545515465154751548515495155051551515525155351554515555155651557515585155951560515615156251563515645156551566515675156851569515705157151572515735157451575515765157751578515795158051581515825158351584515855158651587515885158951590515915159251593515945159551596515975159851599516005160151602516035160451605516065160751608516095161051611516125161351614516155161651617516185161951620516215162251623516245162551626516275162851629516305163151632516335163451635516365163751638516395164051641516425164351644516455164651647516485164951650516515165251653516545165551656516575165851659516605166151662516635166451665516665166751668516695167051671516725167351674516755167651677516785167951680516815168251683516845168551686516875168851689516905169151692516935169451695516965169751698516995170051701517025170351704517055170651707517085170951710517115171251713517145171551716517175171851719517205172151722517235172451725517265172751728517295173051731517325173351734517355173651737517385173951740517415174251743517445174551746517475174851749517505175151752517535175451755517565175751758517595176051761517625176351764517655176651767517685176951770517715177251773517745177551776517775177851779517805178151782517835178451785517865178751788517895179051791517925179351794517955179651797517985179951800518015180251803518045180551806518075180851809518105181151812518135181451815518165181751818518195182051821518225182351824518255182651827518285182951830518315183251833518345183551836518375183851839518405184151842518435184451845518465184751848518495185051851518525185351854518555185651857518585185951860518615186251863518645186551866518675186851869518705187151872518735187451875518765187751878518795188051881518825188351884518855188651887518885188951890518915189251893518945189551896518975189851899519005190151902519035190451905519065190751908519095191051911519125191351914519155191651917519185191951920519215192251923519245192551926519275192851929519305193151932519335193451935519365193751938519395194051941519425194351944519455194651947519485194951950519515195251953519545195551956519575195851959519605196151962519635196451965519665196751968519695197051971519725197351974519755197651977519785197951980519815198251983519845198551986519875198851989519905199151992519935199451995519965199751998519995200052001520025200352004520055200652007520085200952010520115201252013520145201552016520175201852019520205202152022520235202452025520265202752028520295203052031520325203352034520355203652037520385203952040520415204252043520445204552046520475204852049520505205152052520535205452055520565205752058520595206052061520625206352064520655206652067520685206952070520715207252073520745207552076520775207852079520805208152082520835208452085520865208752088520895209052091520925209352094520955209652097520985209952100521015210252103521045210552106521075210852109521105211152112521135211452115521165211752118521195212052121521225212352124521255212652127521285212952130521315213252133521345213552136521375213852139521405214152142521435214452145521465214752148521495215052151521525215352154521555215652157521585215952160521615216252163521645216552166521675216852169521705217152172521735217452175521765217752178521795218052181521825218352184521855218652187521885218952190521915219252193521945219552196521975219852199522005220152202522035220452205522065220752208522095221052211522125221352214522155221652217522185221952220522215222252223522245222552226522275222852229522305223152232522335223452235522365223752238522395224052241522425224352244522455224652247522485224952250522515225252253522545225552256522575225852259522605226152262522635226452265522665226752268522695227052271522725227352274522755227652277522785227952280522815228252283522845228552286522875228852289522905229152292522935229452295522965229752298522995230052301523025230352304523055230652307523085230952310523115231252313523145231552316523175231852319523205232152322523235232452325523265232752328523295233052331523325233352334523355233652337523385233952340523415234252343523445234552346523475234852349523505235152352523535235452355523565235752358523595236052361523625236352364523655236652367523685236952370523715237252373523745237552376523775237852379523805238152382523835238452385523865238752388523895239052391523925239352394523955239652397523985239952400524015240252403524045240552406524075240852409524105241152412524135241452415524165241752418524195242052421524225242352424524255242652427524285242952430524315243252433524345243552436524375243852439524405244152442524435244452445524465244752448524495245052451524525245352454524555245652457524585245952460524615246252463524645246552466524675246852469524705247152472524735247452475524765247752478524795248052481524825248352484524855248652487524885248952490524915249252493524945249552496524975249852499525005250152502525035250452505525065250752508525095251052511525125251352514525155251652517525185251952520525215252252523525245252552526525275252852529525305253152532525335253452535525365253752538525395254052541525425254352544525455254652547525485254952550525515255252553525545255552556525575255852559525605256152562525635256452565525665256752568525695257052571525725257352574525755257652577525785257952580525815258252583525845258552586525875258852589525905259152592525935259452595525965259752598525995260052601526025260352604526055260652607526085260952610526115261252613526145261552616526175261852619526205262152622526235262452625526265262752628526295263052631526325263352634526355263652637526385263952640526415264252643526445264552646526475264852649526505265152652526535265452655526565265752658526595266052661526625266352664526655266652667526685266952670526715267252673526745267552676526775267852679526805268152682526835268452685526865268752688526895269052691526925269352694526955269652697526985269952700527015270252703527045270552706527075270852709527105271152712527135271452715527165271752718527195272052721527225272352724527255272652727527285272952730527315273252733527345273552736527375273852739527405274152742527435274452745527465274752748527495275052751527525275352754527555275652757527585275952760527615276252763527645276552766527675276852769527705277152772527735277452775527765277752778527795278052781527825278352784527855278652787527885278952790527915279252793527945279552796527975279852799528005280152802528035280452805528065280752808528095281052811528125281352814528155281652817528185281952820528215282252823528245282552826528275282852829528305283152832528335283452835528365283752838528395284052841528425284352844528455284652847528485284952850528515285252853528545285552856528575285852859528605286152862528635286452865528665286752868528695287052871528725287352874528755287652877528785287952880528815288252883528845288552886528875288852889528905289152892528935289452895528965289752898528995290052901529025290352904529055290652907529085290952910529115291252913529145291552916529175291852919529205292152922529235292452925529265292752928529295293052931529325293352934529355293652937529385293952940529415294252943529445294552946529475294852949529505295152952529535295452955529565295752958529595296052961529625296352964529655296652967529685296952970529715297252973529745297552976529775297852979529805298152982529835298452985529865298752988529895299052991529925299352994529955299652997529985299953000530015300253003530045300553006530075300853009530105301153012530135301453015530165301753018530195302053021530225302353024530255302653027530285302953030530315303253033530345303553036530375303853039530405304153042530435304453045530465304753048530495305053051530525305353054530555305653057530585305953060530615306253063530645306553066530675306853069530705307153072530735307453075530765307753078530795308053081530825308353084530855308653087530885308953090530915309253093530945309553096530975309853099531005310153102531035310453105531065310753108531095311053111531125311353114531155311653117531185311953120531215312253123531245312553126531275312853129531305313153132531335313453135531365313753138531395314053141531425314353144531455314653147531485314953150531515315253153531545315553156531575315853159531605316153162531635316453165531665316753168531695317053171531725317353174531755317653177531785317953180531815318253183531845318553186531875318853189531905319153192531935319453195531965319753198531995320053201532025320353204532055320653207532085320953210532115321253213532145321553216532175321853219532205322153222532235322453225532265322753228532295323053231532325323353234532355323653237532385323953240532415324253243532445324553246532475324853249532505325153252532535325453255532565325753258532595326053261532625326353264532655326653267532685326953270532715327253273532745327553276532775327853279532805328153282532835328453285532865328753288532895329053291532925329353294532955329653297532985329953300533015330253303533045330553306533075330853309533105331153312533135331453315533165331753318533195332053321533225332353324533255332653327533285332953330533315333253333533345333553336533375333853339533405334153342533435334453345533465334753348533495335053351533525335353354533555335653357533585335953360533615336253363533645336553366533675336853369533705337153372533735337453375533765337753378533795338053381533825338353384533855338653387533885338953390533915339253393533945339553396533975339853399534005340153402534035340453405534065340753408534095341053411534125341353414534155341653417534185341953420534215342253423534245342553426534275342853429534305343153432534335343453435534365343753438534395344053441534425344353444534455344653447534485344953450534515345253453534545345553456534575345853459534605346153462534635346453465534665346753468534695347053471534725347353474534755347653477534785347953480534815348253483534845348553486534875348853489534905349153492534935349453495534965349753498534995350053501535025350353504535055350653507535085350953510535115351253513535145351553516535175351853519535205352153522535235352453525535265352753528535295353053531535325353353534535355353653537535385353953540535415354253543535445354553546535475354853549535505355153552535535355453555535565355753558535595356053561535625356353564535655356653567535685356953570535715357253573535745357553576535775357853579535805358153582535835358453585535865358753588535895359053591535925359353594535955359653597535985359953600536015360253603536045360553606536075360853609536105361153612536135361453615536165361753618536195362053621536225362353624536255362653627536285362953630536315363253633536345363553636536375363853639536405364153642536435364453645536465364753648536495365053651536525365353654536555365653657536585365953660536615366253663536645366553666536675366853669536705367153672536735367453675536765367753678536795368053681536825368353684536855368653687536885368953690536915369253693536945369553696536975369853699537005370153702537035370453705537065370753708537095371053711537125371353714537155371653717537185371953720537215372253723537245372553726537275372853729537305373153732537335373453735537365373753738537395374053741537425374353744537455374653747537485374953750537515375253753537545375553756537575375853759537605376153762537635376453765537665376753768537695377053771537725377353774537755377653777537785377953780537815378253783537845378553786537875378853789537905379153792537935379453795537965379753798537995380053801538025380353804538055380653807538085380953810538115381253813538145381553816538175381853819538205382153822538235382453825538265382753828538295383053831538325383353834538355383653837538385383953840538415384253843538445384553846538475384853849538505385153852538535385453855538565385753858538595386053861538625386353864538655386653867538685386953870538715387253873538745387553876538775387853879538805388153882538835388453885538865388753888538895389053891538925389353894538955389653897538985389953900539015390253903539045390553906539075390853909539105391153912539135391453915539165391753918539195392053921539225392353924539255392653927539285392953930539315393253933539345393553936539375393853939539405394153942539435394453945539465394753948539495395053951539525395353954539555395653957539585395953960539615396253963539645396553966539675396853969539705397153972539735397453975539765397753978539795398053981539825398353984539855398653987539885398953990539915399253993539945399553996539975399853999540005400154002540035400454005540065400754008540095401054011540125401354014540155401654017540185401954020540215402254023540245402554026540275402854029540305403154032540335403454035540365403754038540395404054041540425404354044540455404654047540485404954050540515405254053540545405554056540575405854059540605406154062540635406454065540665406754068540695407054071540725407354074540755407654077540785407954080540815408254083540845408554086540875408854089540905409154092540935409454095540965409754098540995410054101541025410354104541055410654107541085410954110541115411254113541145411554116541175411854119541205412154122541235412454125541265412754128541295413054131541325413354134541355413654137541385413954140541415414254143541445414554146541475414854149541505415154152541535415454155541565415754158541595416054161541625416354164541655416654167541685416954170541715417254173541745417554176541775417854179541805418154182541835418454185541865418754188541895419054191541925419354194541955419654197541985419954200542015420254203542045420554206542075420854209542105421154212542135421454215542165421754218542195422054221542225422354224542255422654227542285422954230542315423254233542345423554236542375423854239542405424154242542435424454245542465424754248542495425054251542525425354254542555425654257542585425954260542615426254263542645426554266542675426854269542705427154272542735427454275542765427754278542795428054281542825428354284542855428654287542885428954290542915429254293542945429554296542975429854299543005430154302543035430454305543065430754308543095431054311543125431354314543155431654317543185431954320543215432254323543245432554326543275432854329543305433154332543335433454335543365433754338543395434054341543425434354344543455434654347543485434954350543515435254353543545435554356543575435854359543605436154362543635436454365543665436754368543695437054371543725437354374543755437654377543785437954380543815438254383543845438554386543875438854389543905439154392543935439454395543965439754398543995440054401544025440354404544055440654407544085440954410544115441254413544145441554416544175441854419544205442154422544235442454425544265442754428544295443054431544325443354434544355443654437544385443954440544415444254443544445444554446544475444854449544505445154452544535445454455544565445754458544595446054461544625446354464544655446654467544685446954470544715447254473544745447554476544775447854479544805448154482544835448454485544865448754488544895449054491544925449354494544955449654497544985449954500545015450254503545045450554506545075450854509545105451154512545135451454515545165451754518545195452054521545225452354524545255452654527545285452954530545315453254533545345453554536545375453854539545405454154542545435454454545545465454754548545495455054551545525455354554545555455654557545585455954560545615456254563545645456554566545675456854569545705457154572545735457454575545765457754578545795458054581545825458354584545855458654587545885458954590545915459254593545945459554596545975459854599546005460154602546035460454605546065460754608546095461054611546125461354614546155461654617546185461954620546215462254623546245462554626546275462854629546305463154632546335463454635546365463754638546395464054641546425464354644546455464654647546485464954650546515465254653546545465554656546575465854659546605466154662546635466454665546665466754668546695467054671546725467354674546755467654677546785467954680546815468254683546845468554686546875468854689546905469154692546935469454695546965469754698546995470054701547025470354704547055470654707547085470954710547115471254713547145471554716547175471854719547205472154722547235472454725547265472754728547295473054731547325473354734547355473654737547385473954740547415474254743547445474554746547475474854749547505475154752547535475454755547565475754758547595476054761547625476354764547655476654767547685476954770547715477254773547745477554776547775477854779547805478154782547835478454785547865478754788547895479054791547925479354794547955479654797547985479954800548015480254803548045480554806548075480854809548105481154812548135481454815548165481754818548195482054821548225482354824548255482654827548285482954830548315483254833548345483554836548375483854839548405484154842548435484454845548465484754848548495485054851548525485354854548555485654857548585485954860548615486254863548645486554866548675486854869548705487154872548735487454875548765487754878548795488054881548825488354884548855488654887548885488954890548915489254893548945489554896548975489854899549005490154902549035490454905549065490754908549095491054911549125491354914549155491654917549185491954920549215492254923549245492554926549275492854929549305493154932549335493454935549365493754938549395494054941549425494354944549455494654947549485494954950549515495254953549545495554956549575495854959549605496154962549635496454965549665496754968549695497054971549725497354974549755497654977549785497954980549815498254983549845498554986549875498854989549905499154992549935499454995549965499754998549995500055001550025500355004550055500655007550085500955010550115501255013550145501555016550175501855019550205502155022550235502455025550265502755028550295503055031550325503355034550355503655037550385503955040550415504255043550445504555046550475504855049550505505155052550535505455055550565505755058550595506055061550625506355064550655506655067550685506955070550715507255073550745507555076550775507855079550805508155082550835508455085550865508755088550895509055091550925509355094550955509655097550985509955100551015510255103551045510555106551075510855109551105511155112551135511455115551165511755118551195512055121551225512355124551255512655127551285512955130551315513255133551345513555136551375513855139551405514155142551435514455145551465514755148551495515055151551525515355154551555515655157551585515955160551615516255163551645516555166551675516855169551705517155172551735517455175551765517755178551795518055181551825518355184551855518655187551885518955190551915519255193551945519555196551975519855199552005520155202552035520455205552065520755208552095521055211552125521355214552155521655217552185521955220552215522255223552245522555226552275522855229552305523155232552335523455235552365523755238552395524055241552425524355244552455524655247552485524955250552515525255253552545525555256552575525855259552605526155262552635526455265552665526755268552695527055271552725527355274552755527655277552785527955280552815528255283552845528555286552875528855289552905529155292552935529455295552965529755298552995530055301553025530355304553055530655307553085530955310553115531255313553145531555316553175531855319553205532155322553235532455325553265532755328553295533055331553325533355334553355533655337553385533955340553415534255343553445534555346553475534855349553505535155352553535535455355553565535755358553595536055361553625536355364553655536655367553685536955370553715537255373553745537555376553775537855379553805538155382553835538455385553865538755388553895539055391553925539355394553955539655397553985539955400554015540255403554045540555406554075540855409554105541155412554135541455415554165541755418554195542055421554225542355424554255542655427554285542955430554315543255433554345543555436554375543855439554405544155442554435544455445554465544755448554495545055451554525545355454554555545655457554585545955460554615546255463554645546555466554675546855469554705547155472554735547455475554765547755478554795548055481554825548355484554855548655487554885548955490554915549255493554945549555496554975549855499555005550155502555035550455505555065550755508555095551055511555125551355514555155551655517555185551955520555215552255523555245552555526555275552855529555305553155532555335553455535555365553755538555395554055541555425554355544555455554655547555485554955550555515555255553555545555555556555575555855559555605556155562555635556455565555665556755568555695557055571555725557355574555755557655577555785557955580555815558255583555845558555586555875558855589555905559155592555935559455595555965559755598555995560055601556025560355604556055560655607556085560955610556115561255613556145561555616556175561855619556205562155622556235562455625556265562755628556295563055631556325563355634556355563655637556385563955640556415564255643556445564555646556475564855649556505565155652556535565455655556565565755658556595566055661556625566355664556655566655667556685566955670556715567255673556745567555676556775567855679556805568155682556835568455685556865568755688556895569055691556925569355694556955569655697556985569955700557015570255703557045570555706557075570855709557105571155712557135571455715557165571755718557195572055721557225572355724557255572655727557285572955730557315573255733557345573555736557375573855739557405574155742557435574455745557465574755748557495575055751557525575355754557555575655757557585575955760557615576255763557645576555766557675576855769557705577155772557735577455775557765577755778557795578055781557825578355784557855578655787557885578955790557915579255793557945579555796557975579855799558005580155802558035580455805558065580755808558095581055811558125581355814558155581655817558185581955820558215582255823558245582555826558275582855829558305583155832558335583455835558365583755838558395584055841558425584355844558455584655847558485584955850558515585255853558545585555856558575585855859558605586155862558635586455865558665586755868558695587055871558725587355874558755587655877558785587955880558815588255883558845588555886558875588855889558905589155892558935589455895558965589755898558995590055901559025590355904559055590655907559085590955910559115591255913559145591555916559175591855919559205592155922559235592455925559265592755928559295593055931559325593355934559355593655937559385593955940559415594255943559445594555946559475594855949559505595155952559535595455955559565595755958559595596055961559625596355964559655596655967559685596955970559715597255973559745597555976559775597855979559805598155982559835598455985559865598755988559895599055991559925599355994559955599655997559985599956000560015600256003560045600556006560075600856009560105601156012560135601456015560165601756018560195602056021560225602356024560255602656027560285602956030560315603256033560345603556036560375603856039560405604156042560435604456045560465604756048560495605056051560525605356054560555605656057560585605956060560615606256063560645606556066560675606856069560705607156072560735607456075560765607756078560795608056081560825608356084560855608656087560885608956090560915609256093560945609556096560975609856099561005610156102561035610456105561065610756108561095611056111561125611356114561155611656117561185611956120561215612256123561245612556126561275612856129561305613156132561335613456135561365613756138561395614056141561425614356144561455614656147561485614956150561515615256153561545615556156561575615856159561605616156162561635616456165561665616756168561695617056171561725617356174561755617656177561785617956180561815618256183561845618556186561875618856189561905619156192561935619456195561965619756198561995620056201562025620356204562055620656207562085620956210562115621256213562145621556216562175621856219562205622156222562235622456225562265622756228562295623056231562325623356234562355623656237562385623956240562415624256243562445624556246562475624856249562505625156252562535625456255562565625756258562595626056261562625626356264562655626656267562685626956270562715627256273562745627556276562775627856279562805628156282562835628456285562865628756288562895629056291562925629356294562955629656297562985629956300563015630256303563045630556306563075630856309563105631156312563135631456315563165631756318563195632056321563225632356324563255632656327563285632956330563315633256333563345633556336563375633856339563405634156342563435634456345563465634756348563495635056351563525635356354563555635656357563585635956360563615636256363563645636556366563675636856369563705637156372563735637456375563765637756378563795638056381563825638356384563855638656387563885638956390563915639256393563945639556396563975639856399564005640156402564035640456405564065640756408564095641056411564125641356414564155641656417564185641956420564215642256423564245642556426564275642856429564305643156432564335643456435564365643756438564395644056441564425644356444564455644656447564485644956450564515645256453564545645556456564575645856459564605646156462564635646456465564665646756468564695647056471564725647356474564755647656477564785647956480564815648256483564845648556486564875648856489564905649156492564935649456495564965649756498564995650056501565025650356504565055650656507565085650956510565115651256513565145651556516565175651856519565205652156522565235652456525565265652756528565295653056531565325653356534565355653656537565385653956540565415654256543565445654556546565475654856549565505655156552565535655456555565565655756558565595656056561565625656356564565655656656567565685656956570565715657256573565745657556576565775657856579565805658156582565835658456585565865658756588565895659056591565925659356594565955659656597565985659956600566015660256603566045660556606566075660856609566105661156612566135661456615566165661756618566195662056621566225662356624566255662656627566285662956630566315663256633566345663556636566375663856639566405664156642566435664456645566465664756648566495665056651566525665356654566555665656657566585665956660566615666256663566645666556666566675666856669566705667156672566735667456675566765667756678566795668056681566825668356684566855668656687566885668956690566915669256693566945669556696566975669856699567005670156702567035670456705567065670756708567095671056711567125671356714567155671656717567185671956720567215672256723567245672556726567275672856729567305673156732567335673456735567365673756738567395674056741567425674356744567455674656747567485674956750567515675256753567545675556756567575675856759567605676156762567635676456765567665676756768567695677056771567725677356774567755677656777567785677956780567815678256783567845678556786567875678856789567905679156792567935679456795567965679756798567995680056801568025680356804568055680656807568085680956810568115681256813568145681556816568175681856819568205682156822568235682456825568265682756828568295683056831568325683356834568355683656837568385683956840568415684256843568445684556846568475684856849568505685156852568535685456855568565685756858568595686056861568625686356864568655686656867568685686956870568715687256873568745687556876568775687856879568805688156882568835688456885568865688756888568895689056891568925689356894568955689656897568985689956900569015690256903569045690556906569075690856909569105691156912569135691456915569165691756918569195692056921569225692356924569255692656927569285692956930569315693256933569345693556936569375693856939569405694156942569435694456945569465694756948569495695056951569525695356954569555695656957569585695956960569615696256963569645696556966569675696856969569705697156972569735697456975569765697756978569795698056981569825698356984569855698656987569885698956990569915699256993569945699556996569975699856999570005700157002570035700457005570065700757008570095701057011570125701357014570155701657017570185701957020570215702257023570245702557026570275702857029570305703157032570335703457035570365703757038570395704057041570425704357044570455704657047570485704957050570515705257053570545705557056570575705857059570605706157062570635706457065570665706757068570695707057071570725707357074570755707657077570785707957080570815708257083570845708557086570875708857089570905709157092570935709457095570965709757098570995710057101571025710357104571055710657107571085710957110571115711257113571145711557116571175711857119571205712157122571235712457125571265712757128571295713057131571325713357134571355713657137571385713957140571415714257143571445714557146571475714857149571505715157152571535715457155571565715757158571595716057161571625716357164571655716657167571685716957170571715717257173571745717557176571775717857179571805718157182571835718457185571865718757188571895719057191571925719357194571955719657197571985719957200572015720257203572045720557206572075720857209572105721157212572135721457215572165721757218572195722057221572225722357224572255722657227572285722957230572315723257233572345723557236572375723857239572405724157242572435724457245572465724757248572495725057251572525725357254572555725657257572585725957260572615726257263572645726557266572675726857269572705727157272572735727457275572765727757278572795728057281572825728357284572855728657287572885728957290572915729257293572945729557296572975729857299573005730157302573035730457305573065730757308573095731057311573125731357314573155731657317573185731957320573215732257323573245732557326573275732857329573305733157332573335733457335573365733757338573395734057341573425734357344573455734657347573485734957350573515735257353573545735557356573575735857359573605736157362573635736457365573665736757368573695737057371573725737357374573755737657377573785737957380573815738257383573845738557386573875738857389573905739157392573935739457395573965739757398573995740057401574025740357404574055740657407574085740957410574115741257413574145741557416574175741857419574205742157422574235742457425574265742757428574295743057431574325743357434574355743657437574385743957440574415744257443574445744557446574475744857449574505745157452574535745457455574565745757458574595746057461574625746357464574655746657467574685746957470574715747257473574745747557476574775747857479574805748157482574835748457485574865748757488574895749057491574925749357494574955749657497574985749957500575015750257503575045750557506575075750857509575105751157512575135751457515575165751757518575195752057521575225752357524575255752657527575285752957530575315753257533575345753557536575375753857539575405754157542575435754457545575465754757548575495755057551575525755357554575555755657557575585755957560575615756257563575645756557566575675756857569575705757157572575735757457575575765757757578575795758057581575825758357584575855758657587575885758957590575915759257593575945759557596575975759857599576005760157602576035760457605576065760757608576095761057611576125761357614576155761657617576185761957620576215762257623576245762557626576275762857629576305763157632576335763457635576365763757638576395764057641576425764357644576455764657647576485764957650576515765257653576545765557656576575765857659576605766157662576635766457665576665766757668576695767057671576725767357674576755767657677576785767957680576815768257683576845768557686576875768857689576905769157692576935769457695576965769757698576995770057701577025770357704577055770657707577085770957710577115771257713577145771557716577175771857719577205772157722577235772457725577265772757728577295773057731577325773357734577355773657737577385773957740577415774257743577445774557746577475774857749577505775157752577535775457755577565775757758577595776057761577625776357764577655776657767577685776957770577715777257773577745777557776577775777857779577805778157782577835778457785577865778757788577895779057791577925779357794577955779657797577985779957800578015780257803578045780557806578075780857809578105781157812578135781457815578165781757818578195782057821578225782357824578255782657827578285782957830578315783257833578345783557836578375783857839578405784157842578435784457845578465784757848578495785057851578525785357854578555785657857578585785957860578615786257863578645786557866578675786857869578705787157872578735787457875578765787757878578795788057881578825788357884578855788657887578885788957890578915789257893578945789557896578975789857899579005790157902579035790457905579065790757908579095791057911579125791357914579155791657917579185791957920579215792257923579245792557926579275792857929579305793157932579335793457935579365793757938579395794057941579425794357944579455794657947579485794957950579515795257953579545795557956579575795857959579605796157962579635796457965579665796757968579695797057971579725797357974579755797657977579785797957980579815798257983579845798557986579875798857989579905799157992579935799457995579965799757998579995800058001580025800358004580055800658007580085800958010580115801258013580145801558016580175801858019580205802158022580235802458025580265802758028580295803058031580325803358034580355803658037580385803958040580415804258043580445804558046580475804858049580505805158052580535805458055580565805758058580595806058061580625806358064580655806658067580685806958070580715807258073580745807558076580775807858079580805808158082580835808458085580865808758088580895809058091580925809358094580955809658097580985809958100581015810258103581045810558106581075810858109581105811158112581135811458115581165811758118581195812058121581225812358124581255812658127581285812958130581315813258133581345813558136581375813858139581405814158142581435814458145581465814758148581495815058151581525815358154581555815658157581585815958160581615816258163581645816558166581675816858169581705817158172581735817458175581765817758178581795818058181581825818358184581855818658187581885818958190581915819258193581945819558196581975819858199582005820158202582035820458205582065820758208582095821058211582125821358214582155821658217582185821958220582215822258223582245822558226582275822858229582305823158232582335823458235582365823758238582395824058241582425824358244582455824658247582485824958250582515825258253582545825558256582575825858259582605826158262582635826458265582665826758268582695827058271582725827358274582755827658277582785827958280582815828258283582845828558286582875828858289582905829158292582935829458295582965829758298582995830058301583025830358304583055830658307583085830958310583115831258313583145831558316583175831858319583205832158322583235832458325583265832758328583295833058331583325833358334583355833658337583385833958340583415834258343583445834558346583475834858349583505835158352583535835458355583565835758358583595836058361583625836358364583655836658367583685836958370583715837258373583745837558376583775837858379583805838158382583835838458385583865838758388583895839058391583925839358394583955839658397583985839958400584015840258403584045840558406584075840858409584105841158412584135841458415584165841758418584195842058421584225842358424584255842658427584285842958430584315843258433584345843558436584375843858439584405844158442584435844458445584465844758448584495845058451584525845358454584555845658457584585845958460584615846258463584645846558466584675846858469584705847158472584735847458475584765847758478584795848058481584825848358484584855848658487584885848958490584915849258493584945849558496584975849858499585005850158502585035850458505585065850758508585095851058511585125851358514585155851658517585185851958520585215852258523585245852558526585275852858529585305853158532585335853458535585365853758538585395854058541585425854358544585455854658547585485854958550585515855258553585545855558556585575855858559585605856158562585635856458565585665856758568585695857058571585725857358574585755857658577585785857958580585815858258583585845858558586585875858858589585905859158592585935859458595585965859758598585995860058601586025860358604586055860658607586085860958610586115861258613586145861558616586175861858619586205862158622586235862458625586265862758628586295863058631586325863358634586355863658637586385863958640586415864258643586445864558646586475864858649586505865158652586535865458655586565865758658586595866058661586625866358664586655866658667586685866958670586715867258673586745867558676586775867858679586805868158682586835868458685586865868758688586895869058691586925869358694586955869658697586985869958700587015870258703587045870558706587075870858709587105871158712587135871458715587165871758718587195872058721587225872358724587255872658727587285872958730587315873258733587345873558736587375873858739587405874158742587435874458745587465874758748587495875058751587525875358754587555875658757587585875958760587615876258763587645876558766587675876858769587705877158772587735877458775587765877758778587795878058781587825878358784587855878658787587885878958790587915879258793587945879558796587975879858799588005880158802588035880458805588065880758808588095881058811588125881358814588155881658817588185881958820588215882258823588245882558826588275882858829588305883158832588335883458835588365883758838588395884058841588425884358844588455884658847588485884958850588515885258853588545885558856588575885858859588605886158862588635886458865588665886758868588695887058871588725887358874588755887658877588785887958880588815888258883588845888558886588875888858889588905889158892588935889458895588965889758898588995890058901589025890358904589055890658907589085890958910589115891258913589145891558916589175891858919589205892158922589235892458925589265892758928589295893058931589325893358934589355893658937589385893958940589415894258943589445894558946589475894858949589505895158952589535895458955589565895758958589595896058961589625896358964589655896658967589685896958970589715897258973589745897558976589775897858979589805898158982589835898458985589865898758988589895899058991589925899358994589955899658997589985899959000590015900259003590045900559006590075900859009590105901159012590135901459015590165901759018590195902059021590225902359024590255902659027590285902959030590315903259033590345903559036590375903859039590405904159042590435904459045590465904759048590495905059051590525905359054590555905659057590585905959060590615906259063590645906559066590675906859069590705907159072590735907459075590765907759078590795908059081590825908359084590855908659087590885908959090590915909259093590945909559096590975909859099591005910159102591035910459105591065910759108591095911059111591125911359114591155911659117591185911959120591215912259123591245912559126591275912859129591305913159132591335913459135591365913759138591395914059141591425914359144591455914659147591485914959150591515915259153591545915559156591575915859159591605916159162591635916459165591665916759168591695917059171591725917359174591755917659177591785917959180591815918259183591845918559186591875918859189591905919159192591935919459195591965919759198591995920059201592025920359204592055920659207592085920959210592115921259213592145921559216592175921859219592205922159222592235922459225592265922759228592295923059231592325923359234592355923659237592385923959240592415924259243592445924559246592475924859249592505925159252592535925459255592565925759258592595926059261592625926359264592655926659267592685926959270592715927259273592745927559276592775927859279592805928159282592835928459285592865928759288592895929059291592925929359294592955929659297592985929959300593015930259303593045930559306593075930859309593105931159312593135931459315593165931759318593195932059321593225932359324593255932659327593285932959330593315933259333593345933559336593375933859339593405934159342593435934459345593465934759348593495935059351593525935359354593555935659357593585935959360593615936259363593645936559366593675936859369593705937159372593735937459375593765937759378593795938059381593825938359384593855938659387593885938959390593915939259393593945939559396593975939859399594005940159402594035940459405594065940759408594095941059411594125941359414594155941659417594185941959420594215942259423594245942559426594275942859429594305943159432594335943459435594365943759438594395944059441594425944359444594455944659447594485944959450594515945259453594545945559456594575945859459594605946159462594635946459465594665946759468594695947059471594725947359474594755947659477594785947959480594815948259483594845948559486594875948859489594905949159492594935949459495594965949759498594995950059501595025950359504595055950659507595085950959510595115951259513595145951559516595175951859519595205952159522595235952459525595265952759528595295953059531595325953359534595355953659537595385953959540595415954259543595445954559546595475954859549595505955159552595535955459555595565955759558595595956059561595625956359564595655956659567595685956959570595715957259573595745957559576595775957859579595805958159582595835958459585595865958759588595895959059591595925959359594595955959659597595985959959600596015960259603596045960559606596075960859609596105961159612596135961459615596165961759618596195962059621596225962359624596255962659627596285962959630596315963259633596345963559636596375963859639596405964159642596435964459645596465964759648596495965059651596525965359654596555965659657596585965959660596615966259663596645966559666596675966859669596705967159672596735967459675596765967759678596795968059681596825968359684596855968659687596885968959690596915969259693596945969559696596975969859699597005970159702597035970459705597065970759708597095971059711597125971359714597155971659717597185971959720597215972259723597245972559726597275972859729597305973159732597335973459735597365973759738597395974059741597425974359744597455974659747597485974959750597515975259753597545975559756597575975859759597605976159762597635976459765597665976759768597695977059771597725977359774597755977659777597785977959780597815978259783597845978559786597875978859789597905979159792597935979459795597965979759798597995980059801598025980359804598055980659807598085980959810598115981259813598145981559816598175981859819598205982159822598235982459825598265982759828598295983059831598325983359834598355983659837598385983959840598415984259843598445984559846598475984859849598505985159852598535985459855598565985759858598595986059861598625986359864598655986659867598685986959870598715987259873598745987559876598775987859879598805988159882598835988459885598865988759888598895989059891598925989359894598955989659897598985989959900599015990259903599045990559906599075990859909599105991159912599135991459915599165991759918599195992059921599225992359924599255992659927599285992959930599315993259933599345993559936599375993859939599405994159942599435994459945599465994759948599495995059951599525995359954599555995659957599585995959960599615996259963599645996559966599675996859969599705997159972599735997459975599765997759978599795998059981599825998359984599855998659987599885998959990599915999259993599945999559996599975999859999600006000160002600036000460005600066000760008600096001060011600126001360014600156001660017600186001960020600216002260023600246002560026600276002860029600306003160032600336003460035600366003760038600396004060041600426004360044600456004660047600486004960050600516005260053600546005560056600576005860059600606006160062600636006460065600666006760068600696007060071600726007360074600756007660077600786007960080600816008260083600846008560086600876008860089600906009160092600936009460095600966009760098600996010060101601026010360104601056010660107601086010960110601116011260113601146011560116601176011860119601206012160122601236012460125601266012760128601296013060131601326013360134601356013660137601386013960140601416014260143601446014560146601476014860149601506015160152601536015460155601566015760158601596016060161601626016360164601656016660167601686016960170601716017260173601746017560176601776017860179601806018160182601836018460185601866018760188601896019060191601926019360194601956019660197601986019960200602016020260203602046020560206602076020860209602106021160212602136021460215602166021760218602196022060221602226022360224602256022660227602286022960230602316023260233602346023560236602376023860239602406024160242602436024460245602466024760248602496025060251602526025360254602556025660257602586025960260602616026260263602646026560266602676026860269602706027160272602736027460275602766027760278602796028060281602826028360284602856028660287602886028960290602916029260293602946029560296602976029860299603006030160302603036030460305603066030760308603096031060311603126031360314603156031660317603186031960320603216032260323603246032560326603276032860329603306033160332603336033460335603366033760338603396034060341603426034360344603456034660347603486034960350603516035260353603546035560356603576035860359603606036160362603636036460365603666036760368603696037060371603726037360374603756037660377603786037960380603816038260383603846038560386603876038860389603906039160392603936039460395603966039760398603996040060401604026040360404604056040660407604086040960410604116041260413604146041560416604176041860419604206042160422604236042460425604266042760428604296043060431604326043360434604356043660437604386043960440604416044260443604446044560446604476044860449604506045160452604536045460455604566045760458604596046060461604626046360464604656046660467604686046960470604716047260473604746047560476604776047860479604806048160482604836048460485604866048760488604896049060491604926049360494604956049660497604986049960500605016050260503605046050560506605076050860509605106051160512605136051460515605166051760518605196052060521605226052360524605256052660527605286052960530605316053260533605346053560536605376053860539605406054160542605436054460545605466054760548605496055060551605526055360554605556055660557605586055960560605616056260563605646056560566605676056860569605706057160572605736057460575605766057760578605796058060581605826058360584605856058660587605886058960590605916059260593605946059560596605976059860599606006060160602606036060460605606066060760608606096061060611606126061360614606156061660617606186061960620606216062260623606246062560626606276062860629606306063160632606336063460635606366063760638606396064060641606426064360644606456064660647606486064960650606516065260653606546065560656606576065860659606606066160662606636066460665606666066760668606696067060671606726067360674606756067660677606786067960680606816068260683606846068560686606876068860689606906069160692606936069460695606966069760698606996070060701607026070360704607056070660707607086070960710607116071260713607146071560716607176071860719607206072160722607236072460725607266072760728607296073060731607326073360734607356073660737607386073960740607416074260743607446074560746607476074860749607506075160752607536075460755607566075760758607596076060761607626076360764607656076660767607686076960770607716077260773607746077560776607776077860779607806078160782607836078460785607866078760788607896079060791607926079360794607956079660797607986079960800608016080260803608046080560806608076080860809608106081160812608136081460815608166081760818608196082060821608226082360824608256082660827608286082960830608316083260833608346083560836608376083860839608406084160842608436084460845608466084760848608496085060851608526085360854608556085660857608586085960860608616086260863608646086560866608676086860869608706087160872608736087460875608766087760878608796088060881608826088360884608856088660887608886088960890608916089260893608946089560896608976089860899609006090160902609036090460905609066090760908609096091060911609126091360914609156091660917609186091960920609216092260923609246092560926609276092860929609306093160932609336093460935609366093760938609396094060941609426094360944609456094660947609486094960950609516095260953609546095560956609576095860959609606096160962609636096460965609666096760968609696097060971609726097360974609756097660977609786097960980609816098260983609846098560986609876098860989609906099160992609936099460995609966099760998609996100061001610026100361004610056100661007610086100961010610116101261013610146101561016610176101861019610206102161022610236102461025610266102761028610296103061031610326103361034610356103661037610386103961040610416104261043610446104561046610476104861049610506105161052610536105461055610566105761058610596106061061610626106361064610656106661067610686106961070610716107261073610746107561076610776107861079610806108161082610836108461085610866108761088610896109061091610926109361094610956109661097610986109961100611016110261103611046110561106611076110861109611106111161112611136111461115611166111761118611196112061121611226112361124611256112661127611286112961130611316113261133611346113561136611376113861139611406114161142611436114461145611466114761148611496115061151611526115361154611556115661157611586115961160611616116261163611646116561166611676116861169611706117161172611736117461175611766117761178611796118061181611826118361184611856118661187611886118961190611916119261193611946119561196611976119861199612006120161202612036120461205612066120761208612096121061211612126121361214612156121661217612186121961220612216122261223612246122561226612276122861229612306123161232612336123461235612366123761238612396124061241612426124361244612456124661247612486124961250612516125261253612546125561256612576125861259612606126161262612636126461265612666126761268612696127061271612726127361274612756127661277612786127961280612816128261283612846128561286612876128861289612906129161292612936129461295612966129761298612996130061301613026130361304613056130661307613086130961310613116131261313613146131561316613176131861319613206132161322613236132461325613266132761328613296133061331613326133361334613356133661337613386133961340613416134261343613446134561346613476134861349613506135161352613536135461355613566135761358613596136061361613626136361364613656136661367613686136961370613716137261373613746137561376613776137861379613806138161382613836138461385613866138761388613896139061391613926139361394613956139661397613986139961400614016140261403614046140561406614076140861409614106141161412614136141461415614166141761418614196142061421614226142361424614256142661427614286142961430614316143261433614346143561436614376143861439614406144161442614436144461445614466144761448614496145061451614526145361454614556145661457614586145961460614616146261463614646146561466614676146861469614706147161472614736147461475614766147761478614796148061481614826148361484614856148661487614886148961490614916149261493614946149561496614976149861499615006150161502615036150461505615066150761508615096151061511615126151361514615156151661517615186151961520615216152261523615246152561526615276152861529615306153161532615336153461535615366153761538615396154061541615426154361544615456154661547615486154961550615516155261553615546155561556615576155861559615606156161562615636156461565615666156761568615696157061571615726157361574615756157661577615786157961580615816158261583615846158561586615876158861589615906159161592615936159461595615966159761598615996160061601616026160361604616056160661607616086160961610616116161261613616146161561616616176161861619616206162161622616236162461625616266162761628616296163061631616326163361634616356163661637616386163961640616416164261643616446164561646616476164861649616506165161652616536165461655616566165761658616596166061661616626166361664616656166661667616686166961670616716167261673616746167561676616776167861679616806168161682616836168461685616866168761688616896169061691616926169361694616956169661697616986169961700617016170261703617046170561706617076170861709617106171161712617136171461715617166171761718617196172061721617226172361724617256172661727617286172961730617316173261733617346173561736617376173861739617406174161742617436174461745617466174761748617496175061751617526175361754617556175661757617586175961760617616176261763617646176561766617676176861769617706177161772617736177461775617766177761778617796178061781617826178361784617856178661787617886178961790617916179261793617946179561796617976179861799618006180161802618036180461805618066180761808618096181061811618126181361814618156181661817618186181961820618216182261823618246182561826618276182861829618306183161832618336183461835618366183761838618396184061841618426184361844618456184661847618486184961850618516185261853618546185561856618576185861859618606186161862618636186461865618666186761868618696187061871618726187361874618756187661877618786187961880618816188261883618846188561886618876188861889618906189161892618936189461895618966189761898618996190061901619026190361904619056190661907619086190961910619116191261913619146191561916619176191861919619206192161922619236192461925619266192761928619296193061931619326193361934619356193661937619386193961940619416194261943619446194561946619476194861949619506195161952619536195461955619566195761958619596196061961619626196361964619656196661967619686196961970619716197261973619746197561976619776197861979619806198161982619836198461985619866198761988619896199061991619926199361994619956199661997619986199962000620016200262003620046200562006620076200862009620106201162012620136201462015620166201762018620196202062021620226202362024620256202662027620286202962030620316203262033620346203562036620376203862039620406204162042620436204462045620466204762048620496205062051620526205362054620556205662057620586205962060620616206262063620646206562066620676206862069620706207162072620736207462075620766207762078620796208062081620826208362084620856208662087620886208962090620916209262093620946209562096620976209862099621006210162102621036210462105621066210762108621096211062111621126211362114621156211662117621186211962120621216212262123621246212562126621276212862129621306213162132621336213462135621366213762138621396214062141621426214362144621456214662147621486214962150621516215262153621546215562156621576215862159621606216162162621636216462165621666216762168621696217062171621726217362174621756217662177621786217962180621816218262183621846218562186621876218862189621906219162192621936219462195621966219762198621996220062201622026220362204622056220662207622086220962210622116221262213622146221562216622176221862219622206222162222622236222462225622266222762228622296223062231622326223362234622356223662237622386223962240622416224262243622446224562246622476224862249622506225162252622536225462255622566225762258622596226062261622626226362264622656226662267622686226962270622716227262273622746227562276622776227862279622806228162282622836228462285622866228762288622896229062291622926229362294622956229662297622986229962300623016230262303623046230562306623076230862309623106231162312623136231462315623166231762318623196232062321623226232362324623256232662327623286232962330623316233262333623346233562336623376233862339623406234162342623436234462345623466234762348623496235062351623526235362354623556235662357623586235962360623616236262363623646236562366623676236862369623706237162372623736237462375623766237762378623796238062381623826238362384623856238662387623886238962390623916239262393623946239562396623976239862399624006240162402624036240462405624066240762408624096241062411624126241362414624156241662417624186241962420624216242262423624246242562426624276242862429624306243162432624336243462435624366243762438624396244062441624426244362444624456244662447624486244962450624516245262453624546245562456624576245862459624606246162462624636246462465624666246762468624696247062471624726247362474624756247662477624786247962480624816248262483624846248562486624876248862489624906249162492624936249462495624966249762498624996250062501625026250362504625056250662507625086250962510625116251262513625146251562516625176251862519625206252162522625236252462525625266252762528625296253062531625326253362534625356253662537625386253962540625416254262543625446254562546625476254862549625506255162552625536255462555625566255762558625596256062561625626256362564625656256662567625686256962570625716257262573625746257562576625776257862579625806258162582625836258462585625866258762588625896259062591625926259362594625956259662597625986259962600626016260262603626046260562606626076260862609626106261162612626136261462615626166261762618626196262062621626226262362624626256262662627626286262962630626316263262633626346263562636626376263862639626406264162642626436264462645626466264762648626496265062651626526265362654626556265662657626586265962660626616266262663626646266562666626676266862669626706267162672626736267462675626766267762678626796268062681626826268362684626856268662687626886268962690626916269262693626946269562696626976269862699627006270162702627036270462705627066270762708627096271062711627126271362714627156271662717627186271962720627216272262723627246272562726627276272862729627306273162732627336273462735627366273762738627396274062741627426274362744627456274662747627486274962750627516275262753627546275562756627576275862759627606276162762627636276462765627666276762768627696277062771627726277362774627756277662777627786277962780627816278262783627846278562786627876278862789627906279162792627936279462795627966279762798627996280062801628026280362804628056280662807628086280962810628116281262813628146281562816628176281862819628206282162822628236282462825628266282762828628296283062831628326283362834628356283662837628386283962840628416284262843628446284562846628476284862849628506285162852628536285462855628566285762858628596286062861628626286362864628656286662867628686286962870628716287262873628746287562876628776287862879628806288162882628836288462885628866288762888628896289062891628926289362894628956289662897628986289962900629016290262903629046290562906629076290862909629106291162912629136291462915629166291762918629196292062921629226292362924629256292662927629286292962930629316293262933629346293562936629376293862939629406294162942629436294462945629466294762948629496295062951629526295362954629556295662957629586295962960629616296262963629646296562966629676296862969629706297162972629736297462975629766297762978629796298062981629826298362984629856298662987629886298962990629916299262993629946299562996629976299862999630006300163002630036300463005630066300763008630096301063011630126301363014630156301663017630186301963020630216302263023630246302563026630276302863029630306303163032630336303463035630366303763038630396304063041630426304363044630456304663047630486304963050630516305263053630546305563056630576305863059630606306163062630636306463065630666306763068630696307063071630726307363074630756307663077630786307963080630816308263083630846308563086630876308863089630906309163092630936309463095630966309763098630996310063101631026310363104631056310663107631086310963110631116311263113631146311563116631176311863119631206312163122631236312463125631266312763128631296313063131631326313363134631356313663137631386313963140631416314263143631446314563146631476314863149631506315163152631536315463155631566315763158631596316063161631626316363164631656316663167631686316963170631716317263173631746317563176631776317863179631806318163182631836318463185631866318763188631896319063191631926319363194631956319663197631986319963200632016320263203632046320563206632076320863209632106321163212632136321463215632166321763218632196322063221632226322363224632256322663227632286322963230632316323263233632346323563236632376323863239632406324163242632436324463245632466324763248632496325063251632526325363254632556325663257632586325963260632616326263263632646326563266632676326863269632706327163272632736327463275632766327763278632796328063281632826328363284632856328663287632886328963290632916329263293632946329563296632976329863299633006330163302633036330463305633066330763308633096331063311633126331363314633156331663317633186331963320633216332263323633246332563326633276332863329633306333163332633336333463335633366333763338633396334063341633426334363344633456334663347633486334963350633516335263353633546335563356633576335863359633606336163362633636336463365633666336763368633696337063371633726337363374633756337663377633786337963380633816338263383633846338563386633876338863389633906339163392633936339463395633966339763398633996340063401634026340363404634056340663407634086340963410634116341263413634146341563416634176341863419634206342163422634236342463425634266342763428634296343063431634326343363434634356343663437634386343963440634416344263443634446344563446634476344863449634506345163452634536345463455634566345763458634596346063461634626346363464634656346663467634686346963470634716347263473634746347563476634776347863479634806348163482634836348463485634866348763488634896349063491634926349363494634956349663497634986349963500635016350263503635046350563506635076350863509635106351163512635136351463515635166351763518635196352063521635226352363524635256352663527635286352963530635316353263533635346353563536635376353863539635406354163542635436354463545635466354763548635496355063551635526355363554635556355663557635586355963560635616356263563635646356563566635676356863569635706357163572635736357463575635766357763578635796358063581635826358363584635856358663587635886358963590635916359263593635946359563596635976359863599636006360163602636036360463605636066360763608636096361063611636126361363614636156361663617636186361963620636216362263623636246362563626636276362863629636306363163632636336363463635636366363763638636396364063641636426364363644636456364663647636486364963650636516365263653636546365563656636576365863659636606366163662636636366463665636666366763668636696367063671636726367363674636756367663677636786367963680636816368263683636846368563686636876368863689636906369163692636936369463695636966369763698636996370063701637026370363704637056370663707637086370963710637116371263713637146371563716637176371863719637206372163722637236372463725637266372763728637296373063731637326373363734637356373663737637386373963740637416374263743637446374563746637476374863749637506375163752637536375463755637566375763758637596376063761637626376363764637656376663767637686376963770637716377263773637746377563776637776377863779637806378163782637836378463785637866378763788637896379063791637926379363794637956379663797637986379963800638016380263803638046380563806638076380863809638106381163812638136381463815638166381763818638196382063821638226382363824638256382663827638286382963830638316383263833638346383563836638376383863839638406384163842638436384463845638466384763848638496385063851638526385363854638556385663857638586385963860638616386263863638646386563866638676386863869638706387163872638736387463875638766387763878638796388063881638826388363884638856388663887638886388963890638916389263893638946389563896638976389863899639006390163902639036390463905639066390763908639096391063911639126391363914639156391663917639186391963920639216392263923639246392563926639276392863929639306393163932639336393463935639366393763938639396394063941639426394363944639456394663947639486394963950639516395263953639546395563956639576395863959639606396163962639636396463965639666396763968639696397063971639726397363974639756397663977639786397963980639816398263983639846398563986639876398863989639906399163992639936399463995639966399763998639996400064001640026400364004640056400664007640086400964010640116401264013640146401564016640176401864019640206402164022640236402464025640266402764028640296403064031640326403364034640356403664037640386403964040640416404264043640446404564046640476404864049640506405164052640536405464055640566405764058640596406064061640626406364064640656406664067640686406964070640716407264073640746407564076640776407864079640806408164082640836408464085640866408764088640896409064091640926409364094640956409664097640986409964100641016410264103641046410564106641076410864109641106411164112641136411464115641166411764118641196412064121641226412364124641256412664127641286412964130641316413264133641346413564136641376413864139641406414164142641436414464145641466414764148641496415064151641526415364154641556415664157641586415964160641616416264163641646416564166641676416864169641706417164172641736417464175641766417764178641796418064181641826418364184641856418664187641886418964190641916419264193641946419564196641976419864199642006420164202642036420464205642066420764208642096421064211642126421364214642156421664217642186421964220642216422264223642246422564226642276422864229642306423164232642336423464235642366423764238642396424064241642426424364244642456424664247642486424964250642516425264253642546425564256642576425864259642606426164262642636426464265642666426764268642696427064271642726427364274642756427664277642786427964280642816428264283642846428564286642876428864289642906429164292642936429464295642966429764298642996430064301643026430364304643056430664307643086430964310643116431264313643146431564316643176431864319643206432164322643236432464325643266432764328643296433064331643326433364334643356433664337643386433964340643416434264343643446434564346643476434864349643506435164352643536435464355643566435764358643596436064361643626436364364643656436664367643686436964370643716437264373643746437564376643776437864379643806438164382643836438464385643866438764388643896439064391643926439364394643956439664397643986439964400644016440264403644046440564406644076440864409644106441164412644136441464415644166441764418644196442064421644226442364424644256442664427644286442964430644316443264433644346443564436644376443864439644406444164442644436444464445644466444764448644496445064451644526445364454644556445664457644586445964460644616446264463644646446564466644676446864469644706447164472644736447464475644766447764478644796448064481644826448364484644856448664487644886448964490644916449264493644946449564496644976449864499645006450164502645036450464505645066450764508645096451064511645126451364514645156451664517645186451964520645216452264523645246452564526645276452864529645306453164532645336453464535645366453764538645396454064541645426454364544645456454664547645486454964550645516455264553645546455564556645576455864559645606456164562645636456464565645666456764568645696457064571645726457364574645756457664577645786457964580645816458264583645846458564586645876458864589645906459164592645936459464595645966459764598645996460064601646026460364604646056460664607646086460964610646116461264613646146461564616646176461864619646206462164622646236462464625646266462764628646296463064631646326463364634646356463664637646386463964640646416464264643646446464564646646476464864649646506465164652646536465464655646566465764658646596466064661646626466364664646656466664667646686466964670646716467264673646746467564676646776467864679646806468164682646836468464685646866468764688646896469064691646926469364694646956469664697646986469964700647016470264703647046470564706647076470864709647106471164712647136471464715647166471764718647196472064721647226472364724647256472664727647286472964730647316473264733647346473564736647376473864739647406474164742647436474464745647466474764748647496475064751647526475364754647556475664757647586475964760647616476264763647646476564766647676476864769647706477164772647736477464775647766477764778647796478064781647826478364784647856478664787647886478964790647916479264793647946479564796647976479864799648006480164802648036480464805648066480764808648096481064811648126481364814648156481664817648186481964820648216482264823648246482564826648276482864829648306483164832648336483464835648366483764838648396484064841648426484364844648456484664847648486484964850648516485264853648546485564856648576485864859648606486164862648636486464865648666486764868648696487064871648726487364874648756487664877648786487964880648816488264883648846488564886648876488864889648906489164892648936489464895648966489764898648996490064901649026490364904649056490664907649086490964910649116491264913649146491564916649176491864919649206492164922649236492464925649266492764928649296493064931649326493364934649356493664937649386493964940649416494264943649446494564946649476494864949649506495164952649536495464955649566495764958649596496064961649626496364964649656496664967649686496964970649716497264973649746497564976649776497864979649806498164982649836498464985649866498764988649896499064991649926499364994649956499664997649986499965000650016500265003650046500565006650076500865009650106501165012650136501465015650166501765018650196502065021650226502365024650256502665027650286502965030650316503265033650346503565036650376503865039650406504165042650436504465045650466504765048650496505065051650526505365054650556505665057650586505965060650616506265063650646506565066650676506865069650706507165072650736507465075650766507765078650796508065081650826508365084650856508665087650886508965090650916509265093650946509565096650976509865099651006510165102651036510465105651066510765108651096511065111651126511365114651156511665117651186511965120651216512265123651246512565126651276512865129651306513165132651336513465135651366513765138651396514065141651426514365144651456514665147651486514965150651516515265153651546515565156651576515865159651606516165162651636516465165651666516765168651696517065171651726517365174651756517665177651786517965180651816518265183651846518565186651876518865189651906519165192651936519465195651966519765198651996520065201652026520365204652056520665207652086520965210652116521265213652146521565216652176521865219652206522165222652236522465225652266522765228652296523065231652326523365234652356523665237652386523965240652416524265243652446524565246652476524865249652506525165252652536525465255652566525765258652596526065261652626526365264652656526665267652686526965270652716527265273652746527565276652776527865279652806528165282652836528465285652866528765288652896529065291652926529365294652956529665297652986529965300653016530265303653046530565306653076530865309653106531165312653136531465315653166531765318653196532065321653226532365324653256532665327653286532965330653316533265333653346533565336653376533865339653406534165342653436534465345653466534765348653496535065351653526535365354653556535665357653586535965360653616536265363653646536565366653676536865369653706537165372653736537465375653766537765378653796538065381653826538365384653856538665387653886538965390653916539265393653946539565396653976539865399654006540165402654036540465405654066540765408654096541065411654126541365414654156541665417654186541965420654216542265423654246542565426654276542865429654306543165432654336543465435654366543765438654396544065441654426544365444654456544665447654486544965450654516545265453654546545565456654576545865459654606546165462654636546465465654666546765468654696547065471654726547365474654756547665477654786547965480654816548265483654846548565486654876548865489654906549165492654936549465495654966549765498654996550065501655026550365504655056550665507655086550965510655116551265513655146551565516655176551865519655206552165522655236552465525655266552765528655296553065531655326553365534655356553665537655386553965540655416554265543655446554565546655476554865549655506555165552655536555465555655566555765558655596556065561655626556365564655656556665567655686556965570655716557265573655746557565576655776557865579655806558165582655836558465585655866558765588655896559065591655926559365594655956559665597655986559965600656016560265603656046560565606656076560865609656106561165612656136561465615656166561765618656196562065621656226562365624656256562665627656286562965630656316563265633656346563565636656376563865639656406564165642656436564465645656466564765648656496565065651656526565365654656556565665657656586565965660656616566265663656646566565666656676566865669656706567165672656736567465675656766567765678656796568065681656826568365684656856568665687656886568965690656916569265693656946569565696656976569865699657006570165702657036570465705657066570765708657096571065711657126571365714657156571665717657186571965720657216572265723657246572565726657276572865729657306573165732657336573465735657366573765738657396574065741657426574365744657456574665747657486574965750657516575265753657546575565756657576575865759657606576165762657636576465765657666576765768657696577065771657726577365774657756577665777657786577965780657816578265783657846578565786657876578865789657906579165792657936579465795657966579765798657996580065801658026580365804658056580665807658086580965810658116581265813658146581565816658176581865819658206582165822658236582465825658266582765828658296583065831658326583365834658356583665837658386583965840658416584265843658446584565846658476584865849658506585165852658536585465855658566585765858658596586065861658626586365864658656586665867658686586965870658716587265873658746587565876658776587865879658806588165882658836588465885658866588765888658896589065891658926589365894658956589665897658986589965900659016590265903659046590565906659076590865909659106591165912659136591465915659166591765918659196592065921659226592365924659256592665927659286592965930659316593265933659346593565936659376593865939659406594165942659436594465945659466594765948659496595065951659526595365954659556595665957659586595965960659616596265963659646596565966659676596865969659706597165972659736597465975659766597765978659796598065981659826598365984659856598665987659886598965990659916599265993659946599565996659976599865999660006600166002660036600466005660066600766008660096601066011660126601366014660156601666017660186601966020660216602266023660246602566026660276602866029660306603166032660336603466035660366603766038660396604066041660426604366044660456604666047660486604966050660516605266053660546605566056660576605866059660606606166062660636606466065660666606766068660696607066071660726607366074660756607666077660786607966080660816608266083660846608566086660876608866089660906609166092660936609466095660966609766098660996610066101661026610366104661056610666107661086610966110661116611266113661146611566116661176611866119661206612166122661236612466125661266612766128661296613066131661326613366134661356613666137661386613966140661416614266143661446614566146661476614866149661506615166152661536615466155661566615766158661596616066161661626616366164661656616666167661686616966170661716617266173661746617566176661776617866179661806618166182661836618466185661866618766188661896619066191661926619366194661956619666197661986619966200662016620266203662046620566206662076620866209662106621166212662136621466215662166621766218662196622066221662226622366224662256622666227662286622966230662316623266233662346623566236662376623866239662406624166242662436624466245662466624766248662496625066251662526625366254662556625666257662586625966260662616626266263662646626566266662676626866269662706627166272662736627466275662766627766278662796628066281662826628366284662856628666287662886628966290662916629266293662946629566296662976629866299663006630166302663036630466305663066630766308663096631066311663126631366314663156631666317663186631966320663216632266323663246632566326663276632866329663306633166332663336633466335663366633766338663396634066341663426634366344663456634666347663486634966350663516635266353663546635566356663576635866359663606636166362663636636466365663666636766368663696637066371663726637366374663756637666377663786637966380663816638266383663846638566386663876638866389663906639166392663936639466395663966639766398663996640066401664026640366404664056640666407664086640966410664116641266413664146641566416664176641866419664206642166422664236642466425664266642766428664296643066431664326643366434664356643666437664386643966440664416644266443664446644566446664476644866449664506645166452664536645466455664566645766458664596646066461664626646366464664656646666467664686646966470664716647266473664746647566476664776647866479664806648166482664836648466485664866648766488664896649066491664926649366494664956649666497664986649966500665016650266503665046650566506665076650866509665106651166512665136651466515665166651766518665196652066521665226652366524665256652666527665286652966530665316653266533665346653566536665376653866539665406654166542665436654466545665466654766548665496655066551665526655366554665556655666557665586655966560665616656266563665646656566566665676656866569665706657166572665736657466575665766657766578665796658066581665826658366584665856658666587665886658966590665916659266593665946659566596665976659866599666006660166602666036660466605666066660766608666096661066611666126661366614666156661666617666186661966620666216662266623666246662566626666276662866629666306663166632666336663466635666366663766638666396664066641666426664366644666456664666647666486664966650666516665266653666546665566656666576665866659666606666166662666636666466665666666666766668666696667066671666726667366674666756667666677666786667966680666816668266683666846668566686666876668866689666906669166692666936669466695666966669766698666996670066701667026670366704667056670666707667086670966710667116671266713667146671566716667176671866719667206672166722667236672466725667266672766728667296673066731667326673366734667356673666737667386673966740667416674266743667446674566746667476674866749667506675166752667536675466755667566675766758667596676066761667626676366764667656676666767667686676966770667716677266773667746677566776667776677866779667806678166782667836678466785667866678766788667896679066791667926679366794667956679666797667986679966800668016680266803668046680566806668076680866809668106681166812668136681466815668166681766818668196682066821668226682366824668256682666827668286682966830668316683266833668346683566836668376683866839668406684166842668436684466845668466684766848668496685066851668526685366854668556685666857668586685966860668616686266863668646686566866668676686866869668706687166872668736687466875668766687766878668796688066881668826688366884668856688666887668886688966890668916689266893668946689566896668976689866899669006690166902669036690466905669066690766908669096691066911669126691366914669156691666917669186691966920669216692266923669246692566926669276692866929669306693166932669336693466935669366693766938669396694066941669426694366944669456694666947669486694966950669516695266953669546695566956669576695866959669606696166962669636696466965669666696766968669696697066971669726697366974669756697666977669786697966980669816698266983669846698566986669876698866989669906699166992669936699466995669966699766998669996700067001670026700367004670056700667007670086700967010670116701267013670146701567016670176701867019670206702167022670236702467025670266702767028670296703067031670326703367034670356703667037670386703967040670416704267043670446704567046670476704867049670506705167052670536705467055670566705767058670596706067061670626706367064670656706667067670686706967070670716707267073670746707567076670776707867079670806708167082670836708467085670866708767088670896709067091670926709367094670956709667097670986709967100671016710267103671046710567106671076710867109671106711167112671136711467115671166711767118671196712067121671226712367124671256712667127671286712967130671316713267133671346713567136671376713867139671406714167142671436714467145671466714767148671496715067151671526715367154671556715667157671586715967160671616716267163671646716567166671676716867169671706717167172671736717467175671766717767178671796718067181671826718367184671856718667187671886718967190671916719267193671946719567196671976719867199672006720167202672036720467205672066720767208672096721067211672126721367214672156721667217672186721967220672216722267223672246722567226672276722867229672306723167232672336723467235672366723767238672396724067241672426724367244672456724667247672486724967250672516725267253672546725567256672576725867259672606726167262672636726467265672666726767268672696727067271672726727367274672756727667277672786727967280672816728267283672846728567286672876728867289672906729167292672936729467295672966729767298672996730067301673026730367304673056730667307673086730967310673116731267313673146731567316673176731867319673206732167322673236732467325673266732767328673296733067331673326733367334673356733667337673386733967340673416734267343673446734567346673476734867349673506735167352673536735467355673566735767358673596736067361673626736367364673656736667367673686736967370673716737267373673746737567376673776737867379673806738167382673836738467385673866738767388673896739067391673926739367394673956739667397673986739967400674016740267403674046740567406674076740867409674106741167412674136741467415674166741767418674196742067421674226742367424674256742667427674286742967430674316743267433674346743567436674376743867439674406744167442674436744467445674466744767448674496745067451674526745367454674556745667457674586745967460674616746267463674646746567466674676746867469674706747167472674736747467475674766747767478674796748067481674826748367484674856748667487674886748967490674916749267493674946749567496674976749867499675006750167502675036750467505675066750767508675096751067511675126751367514675156751667517675186751967520675216752267523675246752567526675276752867529675306753167532675336753467535675366753767538675396754067541675426754367544675456754667547675486754967550675516755267553675546755567556675576755867559675606756167562675636756467565675666756767568675696757067571675726757367574675756757667577675786757967580675816758267583675846758567586675876758867589675906759167592675936759467595675966759767598675996760067601676026760367604676056760667607676086760967610676116761267613676146761567616676176761867619676206762167622676236762467625676266762767628676296763067631676326763367634676356763667637676386763967640676416764267643676446764567646676476764867649676506765167652676536765467655676566765767658676596766067661676626766367664676656766667667676686766967670676716767267673676746767567676676776767867679676806768167682676836768467685676866768767688676896769067691676926769367694676956769667697676986769967700677016770267703677046770567706677076770867709677106771167712677136771467715677166771767718677196772067721677226772367724677256772667727677286772967730677316773267733677346773567736677376773867739677406774167742677436774467745677466774767748677496775067751677526775367754677556775667757677586775967760677616776267763677646776567766677676776867769677706777167772677736777467775677766777767778677796778067781677826778367784677856778667787677886778967790677916779267793677946779567796677976779867799678006780167802678036780467805678066780767808678096781067811678126781367814678156781667817678186781967820678216782267823678246782567826678276782867829678306783167832678336783467835678366783767838678396784067841678426784367844678456784667847678486784967850678516785267853678546785567856678576785867859678606786167862678636786467865678666786767868678696787067871678726787367874678756787667877678786787967880678816788267883678846788567886678876788867889678906789167892678936789467895678966789767898678996790067901679026790367904679056790667907679086790967910679116791267913679146791567916679176791867919679206792167922679236792467925679266792767928679296793067931679326793367934679356793667937679386793967940679416794267943679446794567946679476794867949679506795167952679536795467955679566795767958679596796067961679626796367964679656796667967679686796967970679716797267973679746797567976679776797867979679806798167982679836798467985679866798767988679896799067991679926799367994679956799667997679986799968000680016800268003680046800568006680076800868009680106801168012680136801468015680166801768018680196802068021680226802368024680256802668027680286802968030680316803268033680346803568036680376803868039680406804168042680436804468045680466804768048680496805068051680526805368054680556805668057680586805968060680616806268063680646806568066680676806868069680706807168072680736807468075680766807768078680796808068081680826808368084680856808668087680886808968090680916809268093680946809568096680976809868099681006810168102681036810468105681066810768108681096811068111681126811368114681156811668117681186811968120681216812268123681246812568126681276812868129681306813168132681336813468135681366813768138681396814068141681426814368144681456814668147681486814968150681516815268153681546815568156681576815868159681606816168162681636816468165681666816768168681696817068171681726817368174681756817668177681786817968180681816818268183681846818568186681876818868189681906819168192681936819468195681966819768198681996820068201682026820368204682056820668207682086820968210682116821268213682146821568216682176821868219682206822168222682236822468225682266822768228682296823068231682326823368234682356823668237682386823968240682416824268243682446824568246682476824868249682506825168252682536825468255682566825768258682596826068261682626826368264682656826668267682686826968270682716827268273682746827568276682776827868279682806828168282682836828468285682866828768288682896829068291682926829368294682956829668297682986829968300683016830268303683046830568306683076830868309683106831168312683136831468315683166831768318683196832068321683226832368324683256832668327683286832968330683316833268333683346833568336683376833868339683406834168342683436834468345683466834768348683496835068351683526835368354683556835668357683586835968360683616836268363683646836568366683676836868369683706837168372683736837468375683766837768378683796838068381683826838368384683856838668387683886838968390683916839268393683946839568396683976839868399684006840168402684036840468405684066840768408684096841068411684126841368414684156841668417684186841968420684216842268423684246842568426684276842868429684306843168432684336843468435684366843768438684396844068441684426844368444684456844668447684486844968450684516845268453684546845568456684576845868459684606846168462684636846468465684666846768468684696847068471684726847368474684756847668477684786847968480684816848268483684846848568486684876848868489684906849168492684936849468495684966849768498684996850068501685026850368504685056850668507685086850968510685116851268513685146851568516685176851868519685206852168522685236852468525685266852768528685296853068531685326853368534685356853668537685386853968540685416854268543685446854568546685476854868549685506855168552685536855468555685566855768558685596856068561685626856368564685656856668567685686856968570685716857268573685746857568576685776857868579685806858168582685836858468585685866858768588685896859068591685926859368594685956859668597685986859968600686016860268603686046860568606686076860868609686106861168612686136861468615686166861768618686196862068621686226862368624686256862668627686286862968630686316863268633686346863568636686376863868639686406864168642686436864468645686466864768648686496865068651686526865368654686556865668657686586865968660686616866268663686646866568666686676866868669686706867168672686736867468675686766867768678686796868068681686826868368684686856868668687686886868968690686916869268693686946869568696686976869868699687006870168702687036870468705687066870768708687096871068711687126871368714687156871668717687186871968720687216872268723687246872568726687276872868729687306873168732687336873468735687366873768738687396874068741687426874368744687456874668747687486874968750687516875268753687546875568756687576875868759687606876168762687636876468765687666876768768687696877068771687726877368774687756877668777687786877968780687816878268783687846878568786687876878868789687906879168792687936879468795687966879768798687996880068801688026880368804688056880668807688086880968810688116881268813688146881568816688176881868819688206882168822688236882468825688266882768828688296883068831688326883368834688356883668837688386883968840688416884268843688446884568846688476884868849688506885168852688536885468855688566885768858688596886068861688626886368864688656886668867688686886968870688716887268873688746887568876688776887868879688806888168882688836888468885688866888768888688896889068891688926889368894688956889668897688986889968900689016890268903689046890568906689076890868909689106891168912689136891468915689166891768918689196892068921689226892368924689256892668927689286892968930689316893268933689346893568936689376893868939689406894168942689436894468945689466894768948689496895068951689526895368954689556895668957689586895968960689616896268963689646896568966689676896868969689706897168972689736897468975689766897768978689796898068981689826898368984689856898668987689886898968990689916899268993689946899568996689976899868999690006900169002690036900469005690066900769008690096901069011690126901369014690156901669017690186901969020690216902269023690246902569026690276902869029690306903169032690336903469035690366903769038690396904069041690426904369044690456904669047690486904969050690516905269053690546905569056690576905869059690606906169062690636906469065690666906769068690696907069071690726907369074690756907669077690786907969080690816908269083690846908569086690876908869089690906909169092690936909469095690966909769098690996910069101691026910369104691056910669107691086910969110691116911269113691146911569116691176911869119691206912169122691236912469125691266912769128691296913069131691326913369134691356913669137691386913969140691416914269143691446914569146691476914869149691506915169152691536915469155691566915769158691596916069161691626916369164691656916669167691686916969170691716917269173691746917569176691776917869179691806918169182691836918469185691866918769188691896919069191691926919369194691956919669197691986919969200692016920269203692046920569206692076920869209692106921169212692136921469215692166921769218692196922069221692226922369224692256922669227692286922969230692316923269233692346923569236692376923869239692406924169242692436924469245692466924769248692496925069251692526925369254692556925669257692586925969260692616926269263692646926569266692676926869269692706927169272692736927469275692766927769278692796928069281692826928369284692856928669287692886928969290692916929269293692946929569296692976929869299693006930169302693036930469305693066930769308693096931069311693126931369314693156931669317693186931969320693216932269323693246932569326693276932869329693306933169332693336933469335693366933769338693396934069341693426934369344693456934669347693486934969350693516935269353693546935569356693576935869359693606936169362693636936469365693666936769368693696937069371693726937369374693756937669377693786937969380693816938269383693846938569386693876938869389693906939169392693936939469395693966939769398693996940069401694026940369404694056940669407694086940969410694116941269413694146941569416694176941869419694206942169422694236942469425694266942769428694296943069431694326943369434694356943669437694386943969440694416944269443694446944569446694476944869449694506945169452694536945469455694566945769458694596946069461694626946369464694656946669467694686946969470694716947269473694746947569476694776947869479694806948169482694836948469485694866948769488694896949069491694926949369494694956949669497694986949969500695016950269503695046950569506695076950869509695106951169512695136951469515695166951769518695196952069521695226952369524695256952669527695286952969530695316953269533695346953569536695376953869539695406954169542695436954469545695466954769548695496955069551695526955369554695556955669557695586955969560695616956269563695646956569566695676956869569695706957169572695736957469575695766957769578695796958069581695826958369584695856958669587695886958969590695916959269593695946959569596695976959869599696006960169602696036960469605696066960769608696096961069611696126961369614696156961669617696186961969620696216962269623696246962569626696276962869629696306963169632696336963469635696366963769638696396964069641696426964369644696456964669647696486964969650696516965269653696546965569656696576965869659696606966169662696636966469665696666966769668696696967069671696726967369674696756967669677696786967969680696816968269683696846968569686696876968869689696906969169692696936969469695696966969769698696996970069701697026970369704697056970669707697086970969710697116971269713697146971569716697176971869719697206972169722697236972469725697266972769728697296973069731697326973369734697356973669737697386973969740697416974269743697446974569746697476974869749697506975169752697536975469755697566975769758697596976069761697626976369764697656976669767697686976969770697716977269773697746977569776697776977869779697806978169782697836978469785697866978769788697896979069791697926979369794697956979669797697986979969800698016980269803698046980569806698076980869809698106981169812698136981469815698166981769818698196982069821698226982369824698256982669827698286982969830698316983269833698346983569836698376983869839698406984169842698436984469845698466984769848698496985069851698526985369854698556985669857698586985969860698616986269863698646986569866698676986869869698706987169872698736987469875698766987769878698796988069881698826988369884698856988669887698886988969890698916989269893698946989569896698976989869899699006990169902699036990469905699066990769908699096991069911699126991369914699156991669917699186991969920699216992269923699246992569926699276992869929699306993169932699336993469935699366993769938699396994069941699426994369944699456994669947699486994969950699516995269953699546995569956699576995869959699606996169962699636996469965699666996769968699696997069971699726997369974699756997669977699786997969980699816998269983699846998569986699876998869989699906999169992699936999469995699966999769998699997000070001700027000370004700057000670007700087000970010700117001270013700147001570016700177001870019700207002170022700237002470025700267002770028700297003070031700327003370034700357003670037700387003970040700417004270043700447004570046700477004870049700507005170052700537005470055700567005770058700597006070061700627006370064700657006670067700687006970070700717007270073700747007570076700777007870079700807008170082700837008470085700867008770088700897009070091700927009370094700957009670097700987009970100701017010270103701047010570106701077010870109701107011170112701137011470115701167011770118701197012070121701227012370124701257012670127701287012970130701317013270133701347013570136701377013870139701407014170142701437014470145701467014770148701497015070151701527015370154701557015670157701587015970160701617016270163701647016570166701677016870169701707017170172701737017470175701767017770178701797018070181701827018370184701857018670187701887018970190701917019270193701947019570196701977019870199702007020170202702037020470205702067020770208702097021070211702127021370214702157021670217702187021970220702217022270223702247022570226702277022870229702307023170232702337023470235702367023770238702397024070241702427024370244702457024670247702487024970250702517025270253702547025570256702577025870259702607026170262702637026470265702667026770268702697027070271702727027370274702757027670277702787027970280702817028270283702847028570286702877028870289702907029170292702937029470295702967029770298702997030070301703027030370304703057030670307703087030970310703117031270313703147031570316703177031870319703207032170322703237032470325703267032770328703297033070331703327033370334703357033670337703387033970340703417034270343703447034570346703477034870349703507035170352703537035470355703567035770358703597036070361703627036370364703657036670367703687036970370703717037270373703747037570376703777037870379703807038170382703837038470385703867038770388703897039070391703927039370394703957039670397703987039970400704017040270403704047040570406704077040870409704107041170412704137041470415704167041770418704197042070421704227042370424704257042670427704287042970430704317043270433704347043570436704377043870439704407044170442704437044470445704467044770448704497045070451704527045370454704557045670457704587045970460704617046270463704647046570466704677046870469704707047170472704737047470475704767047770478704797048070481704827048370484704857048670487704887048970490704917049270493704947049570496704977049870499705007050170502705037050470505705067050770508705097051070511705127051370514705157051670517705187051970520705217052270523705247052570526705277052870529705307053170532705337053470535705367053770538705397054070541705427054370544705457054670547705487054970550705517055270553705547055570556705577055870559705607056170562705637056470565705667056770568705697057070571705727057370574705757057670577705787057970580705817058270583705847058570586705877058870589705907059170592705937059470595705967059770598705997060070601706027060370604706057060670607706087060970610706117061270613706147061570616706177061870619706207062170622706237062470625706267062770628706297063070631706327063370634706357063670637706387063970640706417064270643706447064570646706477064870649706507065170652706537065470655706567065770658706597066070661706627066370664706657066670667706687066970670706717067270673706747067570676706777067870679706807068170682706837068470685706867068770688706897069070691706927069370694706957069670697706987069970700707017070270703707047070570706707077070870709707107071170712707137071470715707167071770718707197072070721707227072370724707257072670727707287072970730707317073270733707347073570736707377073870739707407074170742707437074470745707467074770748707497075070751707527075370754707557075670757707587075970760707617076270763707647076570766707677076870769707707077170772707737077470775707767077770778707797078070781707827078370784707857078670787707887078970790707917079270793707947079570796707977079870799708007080170802708037080470805708067080770808708097081070811708127081370814708157081670817708187081970820708217082270823708247082570826708277082870829708307083170832708337083470835708367083770838708397084070841708427084370844708457084670847708487084970850708517085270853708547085570856708577085870859708607086170862708637086470865708667086770868708697087070871708727087370874708757087670877708787087970880708817088270883708847088570886708877088870889708907089170892708937089470895708967089770898708997090070901709027090370904709057090670907709087090970910709117091270913709147091570916709177091870919709207092170922709237092470925709267092770928709297093070931709327093370934709357093670937709387093970940709417094270943709447094570946709477094870949709507095170952709537095470955709567095770958709597096070961709627096370964709657096670967709687096970970709717097270973709747097570976709777097870979709807098170982709837098470985709867098770988709897099070991709927099370994709957099670997709987099971000710017100271003710047100571006710077100871009710107101171012710137101471015710167101771018710197102071021710227102371024710257102671027710287102971030710317103271033710347103571036710377103871039710407104171042710437104471045710467104771048710497105071051710527105371054710557105671057710587105971060710617106271063710647106571066710677106871069710707107171072710737107471075710767107771078710797108071081710827108371084710857108671087710887108971090710917109271093710947109571096710977109871099711007110171102711037110471105711067110771108711097111071111711127111371114711157111671117711187111971120711217112271123711247112571126711277112871129711307113171132711337113471135711367113771138711397114071141711427114371144711457114671147711487114971150711517115271153711547115571156711577115871159711607116171162711637116471165711667116771168711697117071171711727117371174711757117671177711787117971180711817118271183711847118571186711877118871189711907119171192711937119471195711967119771198711997120071201712027120371204712057120671207712087120971210712117121271213712147121571216712177121871219712207122171222712237122471225712267122771228712297123071231712327123371234712357123671237712387123971240712417124271243712447124571246712477124871249712507125171252712537125471255712567125771258712597126071261712627126371264712657126671267712687126971270712717127271273712747127571276712777127871279712807128171282712837128471285712867128771288712897129071291712927129371294712957129671297712987129971300713017130271303713047130571306713077130871309713107131171312713137131471315713167131771318713197132071321713227132371324713257132671327713287132971330713317133271333713347133571336713377133871339713407134171342713437134471345713467134771348713497135071351713527135371354713557135671357713587135971360713617136271363713647136571366713677136871369713707137171372713737137471375713767137771378713797138071381713827138371384713857138671387713887138971390713917139271393713947139571396713977139871399714007140171402714037140471405714067140771408714097141071411714127141371414714157141671417714187141971420714217142271423714247142571426714277142871429714307143171432714337143471435714367143771438714397144071441714427144371444714457144671447714487144971450714517145271453714547145571456714577145871459714607146171462714637146471465714667146771468714697147071471714727147371474714757147671477714787147971480714817148271483714847148571486714877148871489714907149171492714937149471495714967149771498714997150071501715027150371504715057150671507715087150971510715117151271513715147151571516715177151871519715207152171522715237152471525715267152771528715297153071531715327153371534715357153671537715387153971540715417154271543715447154571546715477154871549715507155171552715537155471555715567155771558715597156071561715627156371564715657156671567715687156971570715717157271573715747157571576715777157871579715807158171582715837158471585715867158771588715897159071591715927159371594715957159671597715987159971600716017160271603716047160571606716077160871609716107161171612716137161471615716167161771618716197162071621716227162371624716257162671627716287162971630716317163271633716347163571636716377163871639716407164171642716437164471645716467164771648716497165071651716527165371654716557165671657716587165971660716617166271663716647166571666716677166871669716707167171672716737167471675716767167771678716797168071681716827168371684716857168671687716887168971690716917169271693716947169571696716977169871699717007170171702717037170471705717067170771708717097171071711717127171371714717157171671717717187171971720717217172271723717247172571726717277172871729717307173171732717337173471735717367173771738717397174071741717427174371744717457174671747717487174971750717517175271753717547175571756717577175871759717607176171762717637176471765717667176771768717697177071771717727177371774717757177671777717787177971780717817178271783717847178571786717877178871789717907179171792717937179471795717967179771798717997180071801718027180371804718057180671807718087180971810718117181271813718147181571816718177181871819718207182171822718237182471825718267182771828718297183071831718327183371834718357183671837718387183971840718417184271843718447184571846718477184871849718507185171852718537185471855718567185771858718597186071861718627186371864718657186671867718687186971870718717187271873718747187571876718777187871879718807188171882718837188471885718867188771888718897189071891718927189371894718957189671897718987189971900719017190271903719047190571906719077190871909719107191171912719137191471915719167191771918719197192071921719227192371924719257192671927719287192971930719317193271933719347193571936719377193871939719407194171942719437194471945719467194771948719497195071951719527195371954719557195671957719587195971960719617196271963719647196571966719677196871969719707197171972719737197471975719767197771978719797198071981719827198371984719857198671987719887198971990719917199271993719947199571996719977199871999720007200172002720037200472005720067200772008720097201072011720127201372014720157201672017720187201972020720217202272023720247202572026720277202872029720307203172032720337203472035720367203772038720397204072041720427204372044720457204672047720487204972050720517205272053720547205572056720577205872059720607206172062720637206472065720667206772068720697207072071720727207372074720757207672077720787207972080720817208272083720847208572086720877208872089720907209172092720937209472095720967209772098720997210072101721027210372104721057210672107721087210972110721117211272113721147211572116721177211872119721207212172122721237212472125721267212772128721297213072131721327213372134721357213672137721387213972140721417214272143721447214572146721477214872149721507215172152721537215472155721567215772158721597216072161721627216372164721657216672167721687216972170721717217272173721747217572176721777217872179721807218172182721837218472185721867218772188721897219072191721927219372194721957219672197721987219972200722017220272203722047220572206722077220872209722107221172212722137221472215722167221772218722197222072221722227222372224722257222672227722287222972230722317223272233722347223572236722377223872239722407224172242722437224472245722467224772248722497225072251722527225372254722557225672257722587225972260722617226272263722647226572266722677226872269722707227172272722737227472275722767227772278722797228072281722827228372284722857228672287722887228972290722917229272293722947229572296722977229872299723007230172302723037230472305723067230772308723097231072311723127231372314723157231672317723187231972320723217232272323723247232572326723277232872329723307233172332723337233472335723367233772338723397234072341723427234372344723457234672347723487234972350723517235272353723547235572356723577235872359723607236172362723637236472365723667236772368723697237072371723727237372374723757237672377723787237972380723817238272383723847238572386723877238872389723907239172392723937239472395723967239772398723997240072401724027240372404724057240672407724087240972410724117241272413724147241572416724177241872419724207242172422724237242472425724267242772428724297243072431724327243372434724357243672437724387243972440724417244272443724447244572446724477244872449724507245172452724537245472455724567245772458724597246072461724627246372464724657246672467724687246972470724717247272473724747247572476724777247872479724807248172482724837248472485724867248772488724897249072491724927249372494724957249672497724987249972500725017250272503725047250572506725077250872509725107251172512725137251472515725167251772518725197252072521725227252372524725257252672527725287252972530725317253272533725347253572536725377253872539725407254172542725437254472545725467254772548725497255072551725527255372554725557255672557725587255972560725617256272563725647256572566725677256872569725707257172572725737257472575725767257772578725797258072581725827258372584725857258672587725887258972590725917259272593725947259572596725977259872599726007260172602726037260472605726067260772608726097261072611726127261372614726157261672617726187261972620726217262272623726247262572626726277262872629726307263172632726337263472635726367263772638726397264072641726427264372644726457264672647726487264972650726517265272653726547265572656726577265872659726607266172662726637266472665726667266772668726697267072671726727267372674726757267672677726787267972680726817268272683726847268572686726877268872689726907269172692726937269472695726967269772698726997270072701727027270372704727057270672707727087270972710727117271272713727147271572716727177271872719727207272172722727237272472725727267272772728727297273072731727327273372734727357273672737727387273972740727417274272743727447274572746727477274872749727507275172752727537275472755727567275772758727597276072761727627276372764727657276672767727687276972770727717277272773727747277572776727777277872779727807278172782727837278472785727867278772788727897279072791727927279372794727957279672797727987279972800728017280272803728047280572806728077280872809728107281172812728137281472815728167281772818728197282072821728227282372824728257282672827728287282972830728317283272833728347283572836728377283872839728407284172842728437284472845728467284772848728497285072851728527285372854728557285672857728587285972860728617286272863728647286572866728677286872869728707287172872728737287472875728767287772878728797288072881728827288372884728857288672887728887288972890728917289272893728947289572896728977289872899729007290172902729037290472905729067290772908729097291072911729127291372914729157291672917729187291972920729217292272923729247292572926729277292872929729307293172932729337293472935729367293772938729397294072941729427294372944729457294672947729487294972950729517295272953729547295572956729577295872959729607296172962729637296472965729667296772968729697297072971729727297372974729757297672977729787297972980729817298272983729847298572986729877298872989729907299172992729937299472995729967299772998729997300073001730027300373004730057300673007730087300973010730117301273013730147301573016730177301873019730207302173022730237302473025730267302773028730297303073031730327303373034730357303673037730387303973040730417304273043730447304573046730477304873049730507305173052730537305473055730567305773058730597306073061730627306373064730657306673067730687306973070730717307273073 |
- #!/usr/bin/env php
- <?php
- if (__FILE__ == realpath($GLOBALS['_SERVER']['SCRIPT_NAME'])) {
- $phar = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']);
- $execute = true;
- } else {
- $files = get_included_files();
- $phar = $files[0];
- $execute = false;
- }
- define('__PHPUNIT_PHAR__', str_replace(DIRECTORY_SEPARATOR, '/', $phar));
- define('__PHPUNIT_PHAR_ROOT__', 'phar://phpunit-4.7.7.phar');
- Phar::mapPhar('phpunit-4.7.7.phar');
- require 'phar://phpunit-4.7.7.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.7.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.php';
- require 'phar://phpunit-4.7.7.phar' . '/doctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Instantiator.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-file-iterator/Iterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-file-iterator/Facade.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-file-iterator/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Driver.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Driver/HHVM.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Driver/Xdebug.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Exception/UnintentionallyCoveredCode.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Filter.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Clover.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Crap4j.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/HTML.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Dashboard.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Directory.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/File.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Node.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Node/Directory.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Node/File.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Node/Iterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/PHP.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/Text.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Node.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Directory.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Coverage.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Method.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Report.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Unit.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Project.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Tests.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Totals.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Util.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-code-coverage/CodeCoverage/Util/InvalidArgumentHelper.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-invoker/Invoker.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-invoker/TimeoutException.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-timer/Timer.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-token-stream/Token.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-token-stream/Token/Stream.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-token-stream/Token/Stream/CachingFactory.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Context.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Description.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Location.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Serializer.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Type/Collection.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/ITester.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/AbstractTester.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SelfDescribing.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Constraint/DataSetIsEqual.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Constraint/TableIsEqual.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Constraint/TableRowCount.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/IDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/AbstractDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ITable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/AbstractTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ITableMetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/AbstractTableMetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ArrayDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/CompositeDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/CsvDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/DataSetFilter.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/DefaultDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ITableIterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTableIterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTableMetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/FlatXmlDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/IPersistable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ISpec.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/IYamlParser.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Abstract.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/FlatXml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Xml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Yaml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/QueryDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/QueryTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementTableIterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Csv.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/IDatabaseListConsumer.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/DbQuery.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/DbTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/IFactory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/FlatXml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Xml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Yaml.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/SymfonyYamlParser.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/TableFilter.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/TableMetaDataFilter.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/XmlDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DataSet/YamlDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/DataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/IDatabaseConnection.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/FilteredDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/IMetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/Dblib.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/Firebird.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/InformationSchema.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/MySQL.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/Oci.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/PgSQL.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/Sqlite.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/MetaData/SqlSrv.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/ResultSetTable.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/Table.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/TableIterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DB/TableMetaData.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/DefaultTester.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/IDatabaseOperation.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Composite.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/RowBased.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Delete.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/DeleteAll.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Insert.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Null.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Replace.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Truncate.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/Operation/Update.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Test.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Assert.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/TestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/Command.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/Context.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/IMediumPrinter.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/IMedium.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/IMode.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/IModeFactory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/InvalidModeException.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/Mediums/Text.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/ModeFactory.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/Modes/ExportDataSet.php';
- require 'phar://phpunit-4.7.7.phar' . '/dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestSuite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/GroupTestSuite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/PhptTestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/PhptTestSuite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/TestDecorator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/RepeatedTest.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Command.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Driver.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Keys.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Response.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestListener.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Active.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/URL.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Window.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumBrowserSuite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumCommon/ExitHandler.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumCommon/RemoteCoverage.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumTestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumTestCase/Driver.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-selenium/Extensions/SeleniumTestSuite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Extensions/TicketListener.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/AssertionFailedError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/BaseTestListener.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/CodeCoverageException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/And.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ArrayHasKey.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ArraySubset.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Composite.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Attribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Callback.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ClassHasAttribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ClassHasStaticAttribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Count.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ExceptionCode.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ExceptionMessage.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ExceptionMessageRegExp.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/FileExists.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/GreaterThan.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsAnything.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsEmpty.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsEqual.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsFalse.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsIdentical.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsInstanceOf.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsJson.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsNull.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsTrue.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/IsType.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/JsonMatches.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/LessThan.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Not.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/ObjectHasAttribute.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Or.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/PCREMatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/SameSize.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/StringContains.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/StringEndsWith.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/StringMatches.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/StringStartsWith.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/TraversableContains.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/TraversableContainsOnly.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Constraint/Xor.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Error.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Error/Deprecated.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Error/Notice.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Error/Warning.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/ExceptionWrapper.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/ExpectationFailedException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/IncompleteTest.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/IncompleteTestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/IncompleteTestError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SkippedTest.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/InvalidCoversTargetError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/InvalidCoversTargetException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/BadMethodCallException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Identity.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Stub.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Match.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Namespace.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Generator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation/Static.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation/Object.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Verifiable.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Invokable.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/InvocationMocker.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastCount.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtMostCount.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/MockBuilder.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/MockObject.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/RuntimeException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/Return.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/OutputError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/RiskyTest.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/RiskyTestError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SkippedTestCase.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SkippedTestError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SkippedTestSuiteError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/SyntheticError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestFailure.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestResult.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/TestSuite/DataProvider.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/UnintentionallyCoveredCodeError.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Framework/Warning.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/BaseTestRunner.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Filter/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Filter/Group.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Filter/Group/Exclude.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Filter/Group/Include.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Filter/Test.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/TestSuiteLoader.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/StandardTestSuiteLoader.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Runner/Version.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/TextUI/Command.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Printer.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/TextUI/ResultPrinter.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/TextUI/TestRunner.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Blacklist.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Configuration.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/ErrorHandler.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Fileloader.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Filesystem.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Filter.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Getopt.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/GlobalState.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/InvalidArgumentHelper.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Log/JSON.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Log/JUnit.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Log/TAP.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/PHP.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/PHP/Default.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/PHP/Windows.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Regex.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/String.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Test.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/TestDox/NamePrettifier.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/TestDox/ResultPrinter.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/TestDox/ResultPrinter/HTML.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/TestDox/ResultPrinter/Text.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/TestSuiteIterator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/Type.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpunit/Util/XML.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Call/Call.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Call/CallCenter.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/Comparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Comparator/ClosureComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Comparator/Factory.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Doubler.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/CachedDoubler.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/DoubleInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassCreator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassMirror.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/ArgumentNode.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/LazyDouble.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Doubler/NameGenerator.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prediction/PredictionInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallPrediction.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Promise/PromiseInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Promise/CallbackPromise.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Promise/ReturnPromise.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Promise/ThrowPromise.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophecy/Revealer.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Prophet.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Util/ExportUtil.php';
- require 'phar://phpunit-4.7.7.phar' . '/phpspec-prophecy/Prophecy/Util/StringUtil.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ArrayComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ComparisonFailure.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ObjectComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/DateTimeComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/DOMNodeComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ScalarComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/NumericComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/DoubleComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ExceptionComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/MockObjectComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/ResourceComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/SplObjectStorageComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-comparator/TypeComparator.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/Chunk.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/Diff.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/Differ.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/LCS/LongestCommonSubsequence.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/Line.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-diff/Parser.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-environment/Console.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-environment/Runtime.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-exporter/Exporter.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-global-state/Blacklist.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-global-state/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-global-state/Restorer.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-global-state/RuntimeException.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-global-state/Snapshot.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-recursion-context/Context.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-recursion-context/Exception.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-recursion-context/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.7.phar' . '/sebastian-version/Version.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Dumper.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Escaper.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Exception/ExceptionInterface.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Exception/RuntimeException.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Exception/DumpException.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Exception/ParseException.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Inline.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Parser.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Unescaper.php';
- require 'phar://phpunit-4.7.7.phar' . '/symfony/yaml/Yaml.php';
- require 'phar://phpunit-4.7.7.phar' . '/php-text-template/Template.php';
- if ($execute) {
- if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == '--manifest') {
- print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/manifest.txt');
- exit;
- }
- PHPUnit_TextUI_Command::main();
- }
- __HALT_COMPILER(); ?>
- =³��9���������phpunit-4.7.7.phar����$���sebastian-global-state/Exception.phpþ��¡£Uþ�� ª„´¶������#���sebastian-global-state/Snapshot.php',��¡£U',��5+å ¶���������sebastian-global-state/LICENSE
- ��¡£U
- ��êâ¶������#���sebastian-global-state/Restorer.phpž��¡£Už��}FÔ¶������$���sebastian-global-state/Blacklist.php#��¡£U#��Òf1“¶������+���sebastian-global-state/RuntimeException.php0 ��¡£U0 ���Èyv¶���������php-text-template/LICENSE��¡£U��Sñ:ü¶���������php-text-template/Template.php”��¡£U”��¯w4¯¶���������sebastian-diff/LICENSE��¡£U��vEvö������/���sebastian-diff/LCS/LongestCommonSubsequence.phpº��¡£Uº��»Ø›¶������L���sebastian-diff/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.phpô
- ��¡£Uô
- ��ƒÓg8¶������J���sebastian-diff/LCS/TimeEfficientLongestCommonSubsequenceImplementation.phpá��¡£Uá��н¸r¶���������sebastian-diff/Line.phpé��¡£Ué��ü¼éζ���������sebastian-diff/Differ.php��¡£U��ºŒ<6¶���������sebastian-diff/Parser.phps��¡£Us��vÚ^¶���������sebastian-diff/Diff.php��¡£U��²ª¶���������sebastian-diff/Chunk.php��¡£U��9LKé¶���������php-timer/Timer.phps
- ��¡£Us
- ��æQ—™¶���������php-timer/LICENSE��¡£U��ǨAE¶���������sebastian-comparator/LICENSE ��¡£U ��”:¶������#���sebastian-comparator/Comparator.php ��¡£U ��o:7¶������3���sebastian-comparator/SplObjectStorageComparator.php6��¡£U6��íÃÓɶ������'���sebastian-comparator/TypeComparator.php@ ��¡£U@ ��ÍFòñ¶������)���sebastian-comparator/ObjectComparator.php.��¡£U.��˯?ð¶������+���sebastian-comparator/ResourceComparator.phpŠ��¡£UŠ��aõµV¶������(���sebastian-comparator/ArrayComparator.phpv��¡£Uv�� ÀíÕ¶������+���sebastian-comparator/DateTimeComparator.php™��¡£U™��JzM¶������,���sebastian-comparator/ExceptionComparator.php��¡£U��ƒîÔ¶������*���sebastian-comparator/DOMNodeComparator.php,��¡£U,��ûû�W¶������)���sebastian-comparator/ScalarComparator.phpÏ��¡£UÏ��"’18¶������-���sebastian-comparator/MockObjectComparator.phpé��¡£Ué��ÂÌSö¶������*���sebastian-comparator/NumericComparator.phpF��¡£UF��»š`¶������ ���sebastian-comparator/Factory.php‰��¡£U‰��@‹Ø¶������)���sebastian-comparator/DoubleComparator.phpÐ��¡£UÐ��š¼ž×¶������*���sebastian-comparator/ComparisonFailure.phpÅ��¡£UÅ��ƒÓºª¶���������phpspec-prophecy/LICENSE}��¡£U}��òÅ6¶������8���phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.phpH��¡£UH��‡gZ¶¶������?���phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.phpß��¡£Uß��i²¶������/���phpspec-prophecy/Prophecy/Prophecy/Revealer.php���¡£U���jÉɸ¶������8���phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php,��¡£U,��¡W¶������5���phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.phpk��¡£Uk��k„ʶ������5���phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php(��¡£U(��ç�ÔŶ������:���phpspec-prophecy/Prophecy/Comparator/ClosureComparator.phpK��¡£UK��)RQã¶������0���phpspec-prophecy/Prophecy/Comparator/Factory.php¡��¡£U¡��Aê϶������&���phpspec-prophecy/Prophecy/Argument.php^��¡£U^��l”¶������%���phpspec-prophecy/Prophecy/Prophet.php��¡£U��çvq޶������1���phpspec-prophecy/Prophecy/Exception/Exception.php+��¡£U+��¸µ‘¶������H���phpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php��¡£U��†:‚F¶������B���phpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php™��¡£U™��Üê$϶������H���phpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.php)��¡£U)��Fù¢4¶������J���phpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.phpà��¡£Uà��õ¡…ý¶������D���phpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.phpª��¡£Uª��Û‰?¶������?���phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.php©��¡£U©��zéFƒ¶������@���phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php—��¡£U—��ÃZ^¶������G���phpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.phpÖ��¡£UÖ��iÞhó¶������J���phpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php���¡£U���ýª¶������E���phpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.phpµ��¡£Uµ��77/%¶������F���phpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.phpÅ��¡£UÅ��h+������K���phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.php,��¡£U,����õa¶������F���phpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php���¡£U���2T¢Ñ¶������L���phpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.phpJ��¡£UJ��~ÐãD¶������C���phpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.phpÚ��¡£UÚ��Ál<�¶������E���phpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php»��¡£U»��?D<ζ������P���phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php��¡£U��æ Æ¶������D���phpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.phpÖ��¡£UÖ��£Áó¸¶������@���phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php•��¡£U•��¨gì¶������3���phpspec-prophecy/Prophecy/Doubler/CachedDoubler.phpƒ��¡£Uƒ��̇gè¶������5���phpspec-prophecy/Prophecy/Doubler/DoubleInterface.phpâ��¡£Uâ��8d�j¶������-���phpspec-prophecy/Prophecy/Doubler/Doubler.php���¡£U���8]Õ^¶������B���phpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.phpU
- ��¡£UU
- ��J9½y¶������<���phpspec-prophecy/Prophecy/Doubler/Generator/ClassCreator.phpÔ��¡£UÔ��ä?Br¶������C���phpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.phpò��¡£Uò��çûªå¶������;���phpspec-prophecy/Prophecy/Doubler/Generator/ClassMirror.phpŒ��¡£UŒ��p%f¶������A���phpspec-prophecy/Prophecy/Doubler/Generator/Node/ArgumentNode.phpš��¡£Uš��^ž¶������?���phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.phpÛ
- ��¡£UÛ
- ��ÿ¸Ó¶������>���phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.phpP
- ��¡£UP
- ��M°-ж������0���phpspec-prophecy/Prophecy/Doubler/LazyDouble.phpF
��¡£UF
��¼ël¦¶������=���phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php½��¡£U½��û/@ȶ������E���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.phpô
- ��¡£Uô
- ��Ân–i¶������?���phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.phpâ��¡£Uâ��Áyú¶������A���phpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.php ��¡£U ��§€jN¶������A���phpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php���¡£U���!h^¶������H���phpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php’��¡£U’��:0`ò¶������C���phpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.phpÑ��¡£UÑ��x“Â^¶������P���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.phpp��¡£Up��x¤¿ˆ¶������D���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.phpl��¡£Ul��)Š5:¶������3���phpspec-prophecy/Prophecy/Doubler/NameGenerator.phpŠ��¡£UŠ��õÑ7¶������<���phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.php“��¡£U“��XŠü¶������:���phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.phpå��¡£Uå��L9%¶������<���phpspec-prophecy/Prophecy/Prediction/PredictionInterface.phpŸ��¡£UŸ��`IE¶������;���phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.php“��¡£U“��Vb{ζ������7���phpspec-prophecy/Prophecy/Prediction/CallPrediction.phpQ ��¡£UQ ��Iæ“é¶������'���phpspec-prophecy/Prophecy/Call/Call.phpÓ ��¡£UÓ ��{:å%¶������-���phpspec-prophecy/Prophecy/Call/CallCenter.phpm��¡£Um��š[µ9¶������2���phpspec-prophecy/Prophecy/Promise/ThrowPromise.php9
- ��¡£U9
- ��˜½cu¶������;���phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php��¡£U��¨ô%A¶������3���phpspec-prophecy/Prophecy/Promise/ReturnPromise.php��¡£U��çØ�ä¶������5���phpspec-prophecy/Prophecy/Promise/CallbackPromise.php���¡£U���[žÜ¶������6���phpspec-prophecy/Prophecy/Promise/PromiseInterface.phpK��¡£UK��¾¬…ë¶������8���phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.php4 ��¡£U4 ��A;K2¶������:���phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.php«��¡£U«��F�h¶������A���phpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.php’��¡£U’��pbø�¶������<���phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.phpø��¡£Uø�� Nãv¶������;���phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.php���¡£U���Ù°Š¼¶������<���phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php”��¡£U”��ÞJú:¶������<���phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.phpá��¡£Uá��‚4®Ì¶������;���phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.phpÚ��¡£UÚ��ÖbN/¶������@���phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.phpü��¡£Uü��‰ÑÊ>¶������<���phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.php¡��¡£U¡���…3�¶������=���phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.php9
- ��¡£U9
- ��_ÛJg¶������:���phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.php,��¡£U,��cRÊ̶������@���phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.phpæ��¡£Uæ���¯Êý¶������<���phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.php��¡£U��ܼr¶������6���phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php¥��¡£U¥��®næ\¶������-���phpspec-prophecy/Prophecy/Util/ExportUtil.php„��¡£U„��ѪzH¶������-���phpspec-prophecy/Prophecy/Util/StringUtil.phpì ��¡£Uì ��%ø¶���������sebastian-exporter/LICENSE��¡£U��Aªe)¶���������sebastian-exporter/Exporter.php*#��¡£U*#��žÓl×¶���������php-file-iterator/LICENSE��¡£U��¶És‰¶���������php-file-iterator/Iterator.php²��¡£U²��¬É¶���������php-file-iterator/Facade.phpô��¡£Uô��Q–í›¶���������php-file-iterator/Factory.php¸
- ��¡£U¸
- ��dÂŽ¶���������manifest.txt_��¡£U_��Ë8
U¶������)���sebastian-recursion-context/Exception.phpˆ��¡£Uˆ��>å™3¶������#���sebastian-recursion-context/LICENSE��¡£U��Éðζ������'���sebastian-recursion-context/Context.php°��¡£U°��ø¿Nê¶������8���sebastian-recursion-context/InvalidArgumentException.phpÐ��¡£UÐ��ʨú¶������0���phpunit-selenium/Extensions/SeleniumTestCase.phpÀ—��¡£UÀ—��Ãv�K¶������1���phpunit-selenium/Extensions/SeleniumTestSuite.php���¡£U���®šä¶������7���phpunit-selenium/Extensions/SeleniumTestCase/Driver.phpM°��¡£UM°��0âR¶������6���phpunit-selenium/Extensions/Selenium2TestCase/Keys.phpI��¡£UI��î†Í¶������H���phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.php��¡£U��Ó¸q¶������B���phpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php]��¡£U]��œ/X¶������A���phpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php8��¡£U8��›‚º¶������@���phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.phpý��¡£Uý��$!¸–¶������;���phpunit-selenium/Extensions/Selenium2TestCase/Exception.phpã ��¡£Uã ��H"Ç[¶������@���phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.phpË��¡£UË��Zew¶������D���phpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.phpØ��¡£UØ��h7Ƕ������9���phpunit-selenium/Extensions/Selenium2TestCase/Command.phpL
��¡£UL
��Îcyƶ������>���phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.phpw
- ��¡£Uw
- �� e3Z¶������9���phpunit-selenium/Extensions/Selenium2TestCase/Element.php ��¡£U ��&éø¶������:���phpunit-selenium/Extensions/Selenium2TestCase/Response.php��¡£U��TZ¶������E���phpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.phpÅ ��¡£UÅ ��Ûök¶������H���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.phpH��¡£UH��ÚVm’¶������J���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php’
��¡£U’
���ìͶ������F���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php+
- ��¡£U+
- ��¡Ä»¶������G���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php`��¡£U`��Én±Õ¶������P���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.phpi
- ��¡£Ui
- ��•Pe¶������L���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.phpW
- ��¡£UW
- ��ëLq¶������F���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.phpG��¡£UG��+Uç¶������J���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.phpt��¡£Ut��
ˈ¶������D���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.phpi��¡£Ui��ó¶������A���phpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.phpN��¡£UN���ʶ������8���phpunit-selenium/Extensions/Selenium2TestCase/Window.phpO��¡£UO��S§ßô¶������8���phpunit-selenium/Extensions/Selenium2TestCase/Driver.phpÑ��¡£UÑ��eÅ5v¶������;���phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.php”��¡£U”��z“¶������D���phpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.phpf
��¡£Uf
��ÍK1ï¶������E���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php$��¡£U$��wîͶ������F���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php»��¡£U»��^ÿaé¶������I���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.phpÏ��¡£UÏ��ô¡Ë¶������P���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.phpT
- ��¡£UT
- ��X·ì¶������E���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.phpè��¡£Uè��0“ß—¶������L���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php1
- ��¡£U1
- ��BHǶ������J���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.phpC��¡£UC��lXim¶������D���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php��¡£U��K¸Ž¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.phpÜ
- ��¡£UÜ
- ��•ˆ’¶������Q���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.phpŸ
- ��¡£UŸ
- ��›Bí¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.phpÎ��¡£UÎ��£-
- ¶������L���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.phpÞ��¡£UÞ��@\WI¶������D���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php��¡£U��œð"=¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Active.php
- ��¡£U
- ��×6¸¶������M���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php6
- ��¡£U6
- ��Ñv’l¶������F���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php¶��¡£U¶��çz"¶������5���phpunit-selenium/Extensions/Selenium2TestCase/URL.php™��¡£U™��HFž¶������A���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php¡��¡£U¡��̳ãr¶������<���phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.php��¡£U��Ñ|ÚH¶������B���phpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.php¯��¡£U¯��û\w€¶������@���phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.php��¡£U��ëL@"¶������9���phpunit-selenium/Extensions/Selenium2TestCase/Session.php!1��¡£U!1��š™¶������6���phpunit-selenium/Extensions/SeleniumCommon/prepend.php?��¡£U?��°·³¶������5���phpunit-selenium/Extensions/SeleniumCommon/append.php��¡£U��›·ú÷¶������=���phpunit-selenium/Extensions/SeleniumCommon/RemoteCoverage.phpI��¡£UI��Ý\´.¶������:���phpunit-selenium/Extensions/SeleniumCommon/ExitHandler.php*��¡£U*��¢èÏ϶������?���phpunit-selenium/Extensions/SeleniumCommon/phpunit_coverage.php`��¡£U`��½ùOm¶������4���phpunit-selenium/Extensions/SeleniumBrowserSuite.phpò��¡£Uò��D³¥¶������1���phpunit-selenium/Extensions/Selenium2TestCase.php!E��¡£U!E��ï[‘ñ¶������'���php-code-coverage/CodeCoverage/Util.phpÍ��¡£UÍ��¢K϶������,���php-code-coverage/CodeCoverage/Exception.php¤��¡£U¤��K)§¶������7���php-code-coverage/CodeCoverage/Report/HTML/Renderer.phpE��¡£UE��Ô+ç¶������A���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Dashboard.phpâ&��¡£Uâ&��b; ¶������<���php-code-coverage/CodeCoverage/Report/HTML/Renderer/File.php-L��¡£U-L��³g÷â¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist��¡£U��ýò{¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/directory.html.diste��¡£Ue��Ç�¥ô¶������S���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist1��¡£U1��itLì¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.jsoŒ��¡£UoŒ��;¦� ¶������I���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.jsUN�¡£UUN�;Áë1¶������N���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/respond.min.js��¡£U��í{¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.min.jsL
- ��¡£UL
- ��F¨¶������M���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js m��¡£U m��JësѶ������L���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/nv.d3.min.jsú]�¡£Uú]�'Â]4¶������M���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.jsÕv�¡£UÕv�†e“¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.distg��¡£Ug��V³
P¶������R���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.distx��¡£Ux��*öŒ¶������U���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist5��¡£U5��ñZˆ]¶������K���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/file.html.distþ
- ��¡£Uþ
- ��øýŠD¶������J���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/style.css+��¡£U+��Y`üg¶������N���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.cssX%��¡£UX%���0,¶������R���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css9Ê�¡£U9Ê�Ü›2ø¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf\±��¡£U\±��š<œ¶������e���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2lF��¡£UlF��vèÃa¶������d���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff€[��¡£U€[��ê{õ¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eotŸN��¡£UŸN��XDZœ¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.svg¨�¡£U¨�|îÆÉ¶������A���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Directory.php|
��¡£U|
��¡Ü¶������0���php-code-coverage/CodeCoverage/Report/Crap4j.php-��¡£U-��{ý+ض������3���php-code-coverage/CodeCoverage/Report/XML/Tests.php×��¡£U×��h$6¶������2���php-code-coverage/CodeCoverage/Report/XML/File.php0��¡£U0��Šä�Ú¶������2���php-code-coverage/CodeCoverage/Report/XML/Node.php^��¡£U^��¸ðN¶������5���php-code-coverage/CodeCoverage/Report/XML/Project.php]��¡£U]��×h>µ¶������4���php-code-coverage/CodeCoverage/Report/XML/Totals.phpÇ��¡£UÇ��o·F¶������7���php-code-coverage/CodeCoverage/Report/XML/Directory.php‰��¡£U‰��ÑÒçZ¶������9���php-code-coverage/CodeCoverage/Report/XML/File/Method.phpu��¡£Uu��èîʶ������9���php-code-coverage/CodeCoverage/Report/XML/File/Report.phpC��¡£UC��¨Y{ȶ������;���php-code-coverage/CodeCoverage/Report/XML/File/Coverage.php5��¡£U5��€(+R¶������7���php-code-coverage/CodeCoverage/Report/XML/File/Unit.phpB
- ��¡£UB
- ��
kr¶������.���php-code-coverage/CodeCoverage/Report/Node.phpê��¡£Uê��»ä2Þ¶������7���php-code-coverage/CodeCoverage/Report/Node/Iterator.php‚��¡£U‚��M¶q¶������3���php-code-coverage/CodeCoverage/Report/Node/File.php³G��¡£U³G��Òöû`¶������8���php-code-coverage/CodeCoverage/Report/Node/Directory.phpS(��¡£US(��Íü¶������0���php-code-coverage/CodeCoverage/Report/Clover.phpË'��¡£UË'��’déV¶������.���php-code-coverage/CodeCoverage/Report/HTML.php=��¡£U=��É0©µ¶������1���php-code-coverage/CodeCoverage/Report/Factory.phpk��¡£Uk��rp2”¶������-���php-code-coverage/CodeCoverage/Report/XML.phpl��¡£Ul��šËs›¶������-���php-code-coverage/CodeCoverage/Report/PHP.php��¡£U��4�R}¶������.���php-code-coverage/CodeCoverage/Report/Text.phpx!��¡£Ux!��`”¹k¶������G���php-code-coverage/CodeCoverage/Exception/UnintentionallyCoveredCode.phpØ��¡£UØ��}¶������)���php-code-coverage/CodeCoverage/Driver.phpb��¡£Ub��“<Ã\¶������)���php-code-coverage/CodeCoverage/Filter.php��¡£U��ÍÅ#™¶������=���php-code-coverage/CodeCoverage/Util/InvalidArgumentHelper.php=��¡£U=��Êû¶������.���php-code-coverage/CodeCoverage/Driver/HHVM.php,��¡£U,��œ^Ù¶������0���php-code-coverage/CodeCoverage/Driver/Xdebug.php´ ��¡£U´ ��PØ@¶���������php-code-coverage/LICENSE��¡£U��ЉxZ¶������"���php-code-coverage/CodeCoverage.php·e��¡£U·e��ƒ÷v¶���������symfony/LICENSE)��¡£U)��ë&•¶���������symfony/yaml/Inline.phphM��¡£UhM��€</ʶ���������symfony/yaml/Unescaper.phpÐ��¡£UÐ��éÒ�m¶���������symfony/yaml/Yaml.php,��¡£U,��¹÷�¶������)���symfony/yaml/Exception/ParseException.php��¡£U��Î79‹¶������(���symfony/yaml/Exception/DumpException.phpÒ��¡£UÒ��ؙ՚¶������+���symfony/yaml/Exception/RuntimeException.phpð��¡£Uð��Ï|�-¶������-���symfony/yaml/Exception/ExceptionInterface.phpÆ��¡£UÆ��î+l¶���������symfony/yaml/Parser.phpuh��¡£Uuh��6Q²}¶���������symfony/yaml/Dumper.php� ��¡£U� ��l£D¶���������symfony/yaml/Escaper.php��¡£U��K‹ã¶���������ca.pemñ��¡£Uñ��‹byë¶���������doctrine-instantiator/LICENSE$��¡£U$��
- Í‚å¶������E���doctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.php~��¡£U~��¶ÿÌ:¶������L���doctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.php¥��¡£U¥��ó.ðö������R���doctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.phpô��¡£Uô��hÅ7I¶������R���doctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.phpÎ
- ��¡£UÎ
- ��"Ÿè ¶������<���doctrine-instantiator/Doctrine/Instantiator/Instantiator.phpà ��¡£Uà ��ü&à¶���������php-token-stream/LICENSE��¡£U��ƒ-& ¶������0���php-token-stream/Token/Stream/CachingFactory.php��¡£U��_¶������!���php-token-stream/Token/Stream.php*@��¡£U*@��ª[<¶���������php-token-stream/Token.phpd_��¡£Ud_��~϶������(���dbunit/Extensions/Database/Exception.php4��¡£U4��ó¾Ù¶������0���dbunit/Extensions/Database/UI/IMediumPrinter.phpØ��¡£UØ��…e c¶������)���dbunit/Extensions/Database/UI/Command.php{��¡£U{��ÿëTD¶������.���dbunit/Extensions/Database/UI/Mediums/Text.phpÊ
- ��¡£UÊ
- ��ºÐ]Ó¶������6���dbunit/Extensions/Database/UI/InvalidModeException.phpõ��¡£Uõ��~Ë%¶������'���dbunit/Extensions/Database/UI/IMode.phpæ��¡£Uæ��é=̶������)���dbunit/Extensions/Database/UI/Context.phpC��¡£UC��îä]¶������?���dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.php7��¡£U7��@?¶������5���dbunit/Extensions/Database/UI/Modes/ExportDataSet.php$��¡£U$��×\±À¶������)���dbunit/Extensions/Database/UI/IMedium.php‚��¡£U‚��ÐPî÷¶������-���dbunit/Extensions/Database/UI/ModeFactory.phpR��¡£UR��£²–û¶������.���dbunit/Extensions/Database/UI/IModeFactory.php��¡£U��[E†¶������4���dbunit/Extensions/Database/IDatabaseListConsumer.phpj��¡£Uj��ƒ�‚¶������2���dbunit/Extensions/Database/Operation/Exception.phpó��¡£Uó��GLO�¶������0���dbunit/Extensions/Database/Operation/Replace.php���¡£U���Ä–?¶������/���dbunit/Extensions/Database/Operation/Insert.php
- ��¡£U
- ��{³;¶������/���dbunit/Extensions/Database/Operation/Delete.phpD��¡£UD��œ=Œ¶������;���dbunit/Extensions/Database/Operation/IDatabaseOperation.phpü��¡£Uü��“AÜʶ������-���dbunit/Extensions/Database/Operation/Null.php³��¡£U³��L?¶������2���dbunit/Extensions/Database/Operation/DeleteAll.phpË��¡£UË��z”¶������/���dbunit/Extensions/Database/Operation/Update.phpÐ ��¡£UÐ ��µNÐB¶������1���dbunit/Extensions/Database/Operation/RowBased.phpS��¡£US��hÈ=¶������0���dbunit/Extensions/Database/Operation/Factory.phpá��¡£Uá��~÷õ¶������2���dbunit/Extensions/Database/Operation/Composite.php¸��¡£U¸��€fn¶������1���dbunit/Extensions/Database/Operation/Truncate.phpè
- ��¡£Uè
- ��{�÷>¶������'���dbunit/Extensions/Database/TestCase.phpw!��¡£Uw!��´ƒY¶������-���dbunit/Extensions/Database/AbstractTester.phpM��¡£UM��/ýÅh¶������1���dbunit/Extensions/Database/DB/MetaData/Sqlite.php]��¡£U]�� ÂŒ¶������0���dbunit/Extensions/Database/DB/MetaData/Dblib.phpû��¡£Uû��Ý_¶������0���dbunit/Extensions/Database/DB/MetaData/MySQL.phpõ ��¡£Uõ ���’¥†¶������<���dbunit/Extensions/Database/DB/MetaData/InformationSchema.php“��¡£U“��ý뛜¶������3���dbunit/Extensions/Database/DB/MetaData/Firebird.php��¡£U��ã{ê™¶������.���dbunit/Extensions/Database/DB/MetaData/Oci.php|��¡£U|��•ÍhŸ¶������0���dbunit/Extensions/Database/DB/MetaData/PgSQL.phpÞ��¡£UÞ��¸Ç¾�¶������1���dbunit/Extensions/Database/DB/MetaData/SqlSrv.php´��¡£U´��¼N|¶������'���dbunit/Extensions/Database/DB/Table.phpÒ��¡£UÒ��Ú~˜P¶������1���dbunit/Extensions/Database/DB/FilteredDataSet.phpv��¡£Uv��[å—T¶������5���dbunit/Extensions/Database/DB/IDatabaseConnection.php½��¡£U½��G$Ú/¶������/���dbunit/Extensions/Database/DB/TableMetaData.phpI��¡£UI��âŠ9�¶������*���dbunit/Extensions/Database/DB/MetaData.phpu��¡£Uu��«ðƒ»¶������;���dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php2��¡£U2��ô†ç¾¶������+���dbunit/Extensions/Database/DB/IMetaData.php_��¡£U_��aI
¶������/���dbunit/Extensions/Database/DB/TableIterator.php³��¡£U³��åE¢Ï¶������)���dbunit/Extensions/Database/DB/DataSet.php��¡£U��Ú«¥.¶������0���dbunit/Extensions/Database/DB/ResultSetTable.php��¡£U��‚ƒ%®¶������,���dbunit/Extensions/Database/DefaultTester.phpØ��¡£UØ��Õª\¶������6���dbunit/Extensions/Database/Constraint/TableIsEqual.php¬ ��¡£U¬ ��ýG¶������8���dbunit/Extensions/Database/Constraint/DataSetIsEqual.phpº ��¡£Uº ��ž_ˆÑ¶������7���dbunit/Extensions/Database/Constraint/TableRowCount.php½��¡£U½��Reƶ������&���dbunit/Extensions/Database/ITester.phpÓ ��¡£UÓ ��–%V¶������6���dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.phpV��¡£UV��#꥗¶������3���dbunit/Extensions/Database/DataSet/QueryDataSet.php˜
- ��¡£U˜
- ��Èß¡¶������2���dbunit/Extensions/Database/DataSet/YamlDataSet.php<��¡£U<��®Êƒ¶������6���dbunit/Extensions/Database/DataSet/AbstractDataSet.phpÒ��¡£UÒ��Ý„¿¶������,���dbunit/Extensions/Database/DataSet/ISpec.php²��¡£U²��<Ñòê¶������2���dbunit/Extensions/Database/DataSet/TableFilter.php��¡£U��}œŽ¶������<���dbunit/Extensions/Database/DataSet/AbstractTableMetaData.php��¡£U��bà�¶������7���dbunit/Extensions/Database/DataSet/CompositeDataSet.php:��¡£U:��¹°&c¶������;���dbunit/Extensions/Database/DataSet/DefaultTableIterator.phpÍ
- ��¡£UÍ
- ��ŽÆoP¶������4���dbunit/Extensions/Database/DataSet/DataSetFilter.php?��¡£U?��f9¶k¶������2���dbunit/Extensions/Database/DataSet/IYamlParser.php��¡£U��f*¹¶������1���dbunit/Extensions/Database/DataSet/XmlDataSet.php²��¡£U²��R�ç)¶������5���dbunit/Extensions/Database/DataSet/DefaultDataSet.phpÀ��¡£UÀ��É¥|}¶������8���dbunit/Extensions/Database/DataSet/SymfonyYamlParser.phpO��¡£UO��Kä¾�¶������/���dbunit/Extensions/Database/DataSet/IDataSet.phpù��¡£Uù��¼)V@¶������5���dbunit/Extensions/Database/DataSet/ITableMetaData.phpa��¡£Ua��£+϶������:���dbunit/Extensions/Database/DataSet/Persistors/Abstract.php��¡£U��.BEö������5���dbunit/Extensions/Database/DataSet/Persistors/Xml.php?
��¡£U?
��}©¥)¶������9���dbunit/Extensions/Database/DataSet/Persistors/FlatXml.php“��¡£U“��6gtæ¶������6���dbunit/Extensions/Database/DataSet/Persistors/Yaml.php��¡£U��÷п§¶������:���dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.phpë��¡£Uë��=¹j¶������9���dbunit/Extensions/Database/DataSet/Persistors/Factory.phpÞ��¡£UÞ��Ù°Å�¶������1���dbunit/Extensions/Database/DataSet/CsvDataSet.php��¡£U�� b«¶������?���dbunit/Extensions/Database/DataSet/ReplacementTableIterator.php¹��¡£U¹��‚ú·1¶������9���dbunit/Extensions/Database/DataSet/ReplacementDataSet.php‰��¡£U‰��Á´à`¶������3���dbunit/Extensions/Database/DataSet/ArrayDataSet.phps ��¡£Us ��L¹#¶������3���dbunit/Extensions/Database/DataSet/DefaultTable.php¯ ��¡£U¯ ��È&íâ¶������5���dbunit/Extensions/Database/DataSet/ITableIterator.php3��¡£U3��IÕ)ã¶������5���dbunit/Extensions/Database/DataSet/FlatXmlDataSet.php��¡£U��ïëèJ¶������3���dbunit/Extensions/Database/DataSet/IPersistable.php½��¡£U½��´)ж������9���dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.phpÚ
��¡£UÚ
��w~¶������:���dbunit/Extensions/Database/DataSet/TableMetaDataFilter.phpS��¡£US��íN4µ¶������7���dbunit/Extensions/Database/DataSet/ReplacementTable.php\��¡£U\��—/ ¶������4���dbunit/Extensions/Database/DataSet/Specs/DbQuery.php
- ��¡£U
- ��†@é¶������0���dbunit/Extensions/Database/DataSet/Specs/Xml.phpÓ��¡£UÓ��þ�ýÙ¶������4���dbunit/Extensions/Database/DataSet/Specs/FlatXml.phpí��¡£Uí��{Éýt¶������1���dbunit/Extensions/Database/DataSet/Specs/Yaml.phpÙ��¡£UÙ��b—"V¶������5���dbunit/Extensions/Database/DataSet/Specs/IFactory.phpz��¡£Uz��(r¼K¶������0���dbunit/Extensions/Database/DataSet/Specs/Csv.phpŠ��¡£UŠ��–ÚSu¶������4���dbunit/Extensions/Database/DataSet/Specs/DbTable.php ��¡£U ��/.¹É¶������4���dbunit/Extensions/Database/DataSet/Specs/Factory.phpè��¡£Uè��w_¸S¶������1���dbunit/Extensions/Database/DataSet/QueryTable.php-��¡£U-��dqgƒ¶������4���dbunit/Extensions/Database/DataSet/AbstractTable.php€��¡£U€��¾¦=ˆ¶������-���dbunit/Extensions/Database/DataSet/ITable.phpE��¡£UE��Ë”À¶������;���dbunit/Extensions/Database/DataSet/DefaultTableMetaData.phpË��¡£UË��˜âÒ˶���������php-invoker/Invoker.phpï��¡£Uï��wà¶������ ���php-invoker/TimeoutException.phpp��¡£Up��~ªø¶���������phpunit-mock-objects/LICENSE��¡£U��C>©¶������5���phpunit-mock-objects/Framework/MockObject/Matcher.php¨ ��¡£U¨ ��7÷�/¶������8���phpunit-mock-objects/Framework/MockObject/Verifiable.php²��¡£U²��”'L¶������7���phpunit-mock-objects/Framework/MockObject/Invokable.php9��¡£U9��Ùÿ~†¶������9���phpunit-mock-objects/Framework/MockObject/MockBuilder.php��¡£U��\_¶������A���phpunit-mock-objects/Framework/MockObject/Exception/Exception.php¦��¡£U¦��]ÃT¶������N���phpunit-mock-objects/Framework/MockObject/Exception/BadMethodCallException.phpÁ��¡£UÁ��¥Ò).¶������H���phpunit-mock-objects/Framework/MockObject/Exception/RuntimeException.phpµ��¡£Uµ��Y·n4¶������8���phpunit-mock-objects/Framework/MockObject/Invocation.php���¡£U���«s¶������8���phpunit-mock-objects/Framework/MockObject/MockObject.php9��¡£U9��¾éC…¶������>���phpunit-mock-objects/Framework/MockObject/InvocationMocker.php��¡£U��Ì2…×¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.php ��¡£U ��v´Š¶������H���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.phpÐ��¡£UÐ��cîþI¶������C���phpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.phpC��¡£UC��¹£¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.phpª��¡£Uª��œPjî¶������E���phpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.phpà��¡£Uà��“Ds$¶������I���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastCount.phpü��¡£Uü��R�¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.php��¡£U��Kôb¶������K���phpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.php¨��¡£U¨��iOm¶������D���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.php ��¡£U ��•åY©¶������B���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.php ��¡£U ��SžG¶������H���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtMostCount.phpñ��¡£Uñ��ÃË÷¶������E���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.php`��¡£U`��!Íñè¶������I���phpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.phpk��¡£Uk��û•϶������7���phpunit-mock-objects/Framework/MockObject/Generator.phpí”��¡£Uí”��«>çš¶������H���phpunit-mock-objects/Framework/MockObject/Generator/wsdl_method.tpl.dist<���¡£U<���¾Ði‰¶������K���phpunit-mock-objects/Framework/MockObject/Generator/unmocked_clone.tpl.distŸ���¡£UŸ���8W}ض������I���phpunit-mock-objects/Framework/MockObject/Generator/mocked_class.tpl.dist��¡£U��¨ÑFZ¶������I���phpunit-mock-objects/Framework/MockObject/Generator/mocked_clone.tpl.dist„���¡£U„���œaT¶������K���phpunit-mock-objects/Framework/MockObject/Generator/proxied_method.tpl.distÌ��¡£UÌ��?a§¶������G���phpunit-mock-objects/Framework/MockObject/Generator/wsdl_class.tpl.dist³���¡£U³���w&S¶������H���phpunit-mock-objects/Framework/MockObject/Generator/trait_class.tpl.dist7���¡£U7���²[$~¶������J���phpunit-mock-objects/Framework/MockObject/Generator/mocked_method.tpl.dist„��¡£U„��ãbVæ¶������P���phpunit-mock-objects/Framework/MockObject/Generator/mocked_class_method.tpl.distí���¡£Uí���Ú4Þ¶������Q���phpunit-mock-objects/Framework/MockObject/Generator/mocked_static_method.tpl.dist—���¡£U—���+F°ƒ¶������;���phpunit-mock-objects/Framework/MockObject/Builder/Match.phpW��¡£UW��EƒA¶������>���phpunit-mock-objects/Framework/MockObject/Builder/Identity.php”��¡£U”��(²4ã¶������F���phpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.phpv��¡£Uv��ÔÐÂñ¶������E���phpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.php���¡£U���sґζ������?���phpunit-mock-objects/Framework/MockObject/Builder/Namespace.php²��¡£U²��M쉔¶������E���phpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php)��¡£U)��sòõ¶������:���phpunit-mock-objects/Framework/MockObject/Builder/Stub.phpo��¡£Uo��hrâ�¶������?���phpunit-mock-objects/Framework/MockObject/Invocation/Object.php¡��¡£U¡��ˆ¼†9¶������?���phpunit-mock-objects/Framework/MockObject/Invocation/Static.phpF��¡£UF��ÐKp¶������2���phpunit-mock-objects/Framework/MockObject/Stub.php\��¡£U\��f+Fж������<���phpunit-mock-objects/Framework/MockObject/Stub/Exception.phpˆ��¡£Uˆ��<)ÿ¥¶������9���phpunit-mock-objects/Framework/MockObject/Stub/Return.php_��¡£U_��ÐóH,¶������=���phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.phpÂ��¡£UÂ��«¤�I¶������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.php|��¡£U|��uB è¶������C���phpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.phpN��¡£UN��¥�°¶������D���phpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.php:��¡£U:��µYж������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.php•��¡£U•��g‰´`¶������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.phpÿ��¡£Uÿ��9)�`¶���������phpunit/Exception.phps��¡£Us��y:ƒÛ¶���������phpunit/Framework/Test.phpŽ��¡£UŽ��ú;ì¶���������phpunit/Framework/Exception.php ��¡£U ��DËÿ³¶������!���phpunit/Framework/OutputError.phpç��¡£Uç��jÔ̶���������phpunit/Framework/Assert.phpB„�¡£UB„�àÛ¯¶������+���phpunit/Framework/CodeCoverageException.phpq��¡£Uq��E´•í¶���������phpunit/Framework/TestSuite.phpu��¡£Uu��ªÄÀ¶���������phpunit/Framework/RiskyTest.php®��¡£U®��Å\¶������$���phpunit/Framework/SelfDescribing.php��¡£U��:‹|ð¶������&���phpunit/Framework/Assert/Functions.phpï÷��¡£Uï÷��,?ƒ¶������$���phpunit/Framework/SyntheticError.php��¡£U��Æ·½¶������$���phpunit/Framework/RiskyTestError.php��¡£U��?Ÿv¶������"���phpunit/Framework/TestListener.phpR
- ��¡£UR
- ��…ŸÎݶ������&���phpunit/Framework/ExceptionWrapper.php˜��¡£U˜��ù“¶������!���phpunit/Framework/SkippedTest.php“��¡£U“��ã_ $¶������2���phpunit/Framework/InvalidCoversTargetException.php„��¡£U„��%M×à¶���������phpunit/Framework/TestCase.phpú��¡£Uú��R‡‹¶������0���phpunit/Framework/ExpectationFailedException.php™��¡£U™��_Sõ;¶���������phpunit/Framework/Error.php$��¡£U$��X%yW¶������ ���phpunit/Framework/Constraint.php†��¡£U†��WëSǶ������*���phpunit/Framework/AssertionFailedError.php{��¡£U{��+Áþ¶������(���phpunit/Framework/IncompleteTestCase.php5��¡£U5��.–Sž¶������,���phpunit/Framework/TestSuite/DataProvider.phpƒ��¡£Uƒ��‚<Us¶������&���phpunit/Framework/Error/Deprecated.phpF��¡£UF��´¢V¶������"���phpunit/Framework/Error/Notice.php0��¡£U0��ÜIŠ›¶������#���phpunit/Framework/Error/Warning.php3��¡£U3��mO‘¤¶������)���phpunit/Framework/IncompleteTestError.php��¡£U��Htº¶������.���phpunit/Framework/InvalidCoversTargetError.phpB��¡£UB��‡ÿ|¶������+���phpunit/Framework/SkippedTestSuiteError.php��¡£U��àÕ7<¶������ ���phpunit/Framework/TestResult.phpîm��¡£Uîm��¿‡ñs¶������!���phpunit/Framework/TestFailure.php���¡£U���¡´·ª¶������$���phpunit/Framework/IncompleteTest.phpä��¡£Uä��òJì¶������%���phpunit/Framework/SkippedTestCase.phpê��¡£Uê��`¬uà¶������2���phpunit/Framework/Constraint/ClassHasAttribute.php¸��¡£U¸��øEÀ¶������4���phpunit/Framework/Constraint/TraversableContains.phpÞ
��¡£UÞ
��•Ç{¶������.���phpunit/Framework/Constraint/ExceptionCode.phpP��¡£UP��þv~D¶������*���phpunit/Framework/Constraint/Exception.phpX��¡£UX��î S϶������)���phpunit/Framework/Constraint/SameSize.phpS��¡£US��/#ÏS¶������,���phpunit/Framework/Constraint/JsonMatches.php��¡£U��ß9Ñ{¶������-���phpunit/Framework/Constraint/IsInstanceOf.php³��¡£U³��rȫǶ������3���phpunit/Framework/Constraint/ObjectHasAttribute.php—��¡£U—��è{G ¶������'���phpunit/Framework/Constraint/IsType.php_
��¡£U_
��ö¦—‡¶������)���phpunit/Framework/Constraint/LessThan.php¸��¡£U¸��¼®±ƒ¶������,���phpunit/Framework/Constraint/ArraySubset.php@��¡£U@��ýB+·¶������'���phpunit/Framework/Constraint/IsTrue.phpk��¡£Uk��ö¶������'���phpunit/Framework/Constraint/IsJson.phpŒ��¡£UŒ��C\œ¦¶������(���phpunit/Framework/Constraint/IsEqual.phpô��¡£Uô��#!·Ú¶������$���phpunit/Framework/Constraint/Xor.php9��¡£U9��Ãsu¶������A���phpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php¤��¡£U¤��Wà¬J¶������.���phpunit/Framework/Constraint/StringMatches.php ��¡£U ��%½Àc¶������$���phpunit/Framework/Constraint/Not.phpî��¡£Uî��@öζ������7���phpunit/Framework/Constraint/ExceptionMessageRegExp.phpU��¡£UU��ô`]_¶������,���phpunit/Framework/Constraint/GreaterThan.phpÁ��¡£UÁ��
Ç?n¶������1���phpunit/Framework/Constraint/ExceptionMessage.php8��¡£U8��¾XŒz¶������)���phpunit/Framework/Constraint/Callback.php:��¡£U:��+Êî„¶������,���phpunit/Framework/Constraint/ArrayHasKey.php��¡£U��yú›6¶������/���phpunit/Framework/Constraint/StringContains.php,��¡£U,��G©zÚ¶������8���phpunit/Framework/Constraint/TraversableContainsOnly.php
- ��¡£U
- ��}=²¶������(���phpunit/Framework/Constraint/IsEmpty.php��¡£U��8—2�¶������*���phpunit/Framework/Constraint/PCREMatch.php·��¡£U·��ï•^#¶������'���phpunit/Framework/Constraint/IsNull.phpk��¡£Uk��KÀ:¶������*���phpunit/Framework/Constraint/Attribute.phpü ��¡£Uü ��LLp�¶������(���phpunit/Framework/Constraint/IsFalse.phpo��¡£Uo��Þì?A¶������8���phpunit/Framework/Constraint/ClassHasStaticAttribute.phpw��¡£Uw��RQîp¶������#���phpunit/Framework/Constraint/Or.phpÆ��¡£UÆ��^|§¶������,���phpunit/Framework/Constraint/IsIdentical.php7��¡£U7��—µÜ¶������+���phpunit/Framework/Constraint/FileExists.php¨��¡£U¨��ÎßI¶������*���phpunit/Framework/Constraint/Composite.php+��¡£U+��©I«Y¶������1���phpunit/Framework/Constraint/StringStartsWith.phpÀ��¡£UÀ��|C�}¶������/���phpunit/Framework/Constraint/StringEndsWith.phpÑ��¡£UÑ��ùž^¶������+���phpunit/Framework/Constraint/IsAnything.phpÐ��¡£UÐ��£;ðð¶������&���phpunit/Framework/Constraint/Count.phpÔ ��¡£UÔ ��´!ôw¶������$���phpunit/Framework/Constraint/And.php���¡£U���AùÞ8¶������&���phpunit/Framework/BaseTestListener.phpp��¡£Up��ØM‹U¶������&���phpunit/Framework/SkippedTestError.php ��¡£U ���T¶������5���phpunit/Framework/UnintentionallyCoveredCodeError.php��¡£U��d^S¶���������phpunit/Framework/Warning.php³��¡£U³��«S”þ¶������%���phpunit/Extensions/GroupTestSuite.php„��¡£U„��ðÁ6¶������$���phpunit/Extensions/PhptTestSuite.php��¡£U��ȉ�ž¶������#���phpunit/Extensions/RepeatedTest.phpõ��¡£Uõ��,ìaÿ¶������%���phpunit/Extensions/TicketListener.php0��¡£U0��%öZÿ¶������$���phpunit/Extensions/TestDecorator.php: ��¡£U: ��0�v-¶������#���phpunit/Extensions/PhptTestCase.php(��¡£U(��À*V¶���������phpunit/TextUI/Command.php‘|��¡£U‘|��ar- ¶���������phpunit/TextUI/TestRunner.phpH ��¡£UH ��ßÿɶ������ ���phpunit/TextUI/ResultPrinter.phpæC��¡£UæC��µ×/޶���������phpunit/Util/Test.php‡{��¡£U‡{��`ßäÓ¶���������phpunit/Util/Filesystem.php‰��¡£U‰��ç(`O¶���������phpunit/Util/Getopt.phpÛ��¡£UÛ��À„<¶���������phpunit/Util/ErrorHandler.phpÁ
��¡£UÁ
��ŸQÎݶ���������phpunit/Util/String.phps��¡£Us��U)‹D¶������&���phpunit/Util/InvalidArgumentHelper.phpŽ��¡£UŽ��éW4¶���������phpunit/Util/Printer.php^��¡£U^��í
- ’¶���������phpunit/Util/Configuration.php‚‰��¡£U‚‰��ôü(L¶���������phpunit/Util/GlobalState.php/��¡£U/��KU|�¶���������phpunit/Util/Log/JSON.php%��¡£U%��“æÚ¶���������phpunit/Util/Log/TAP.php��¡£U��|%n¶���������phpunit/Util/Log/JUnit.php�2��¡£U�2��¤, ¶���������phpunit/Util/Blacklist.php���¡£U���!zWI¶������"���phpunit/Util/TestSuiteIterator.phpû��¡£Uû��Ïâ�˜¶���������phpunit/Util/Filter.phpË��¡£UË��þp¢Ä¶������+���phpunit/Util/TestDox/ResultPrinter/HTML.phpª��¡£Uª��pfµÊ¶������+���phpunit/Util/TestDox/ResultPrinter/Text.phpw��¡£Uw�� ;ÿ›¶������&���phpunit/Util/TestDox/ResultPrinter.phpO��¡£UO��
lë¶������'���phpunit/Util/TestDox/NamePrettifier.phpE��¡£UE��ߤ‡ ¶���������phpunit/Util/Regex.phpå��¡£Uå��±PÏd¶���������phpunit/Util/Type.php��¡£U��CÜ!Ò¶���������phpunit/Util/PHP/Default.phpÇ��¡£UÇ��>>L¶������1���phpunit/Util/PHP/Template/TestCaseMethod.tpl.dist¥��¡£U¥��ïó¶���������phpunit/Util/PHP/Windows.phpx
- ��¡£Ux
- ��˜"¶���������phpunit/Util/Fileloader.phpÝ��¡£UÝ��)ع�¶���������phpunit/Util/XML.phpŒr��¡£UŒr��<zÖ¶���������phpunit/Util/PHP.phpÑ��¡£UÑ��]QF¶���������phpunit/Runner/Exception.phpt��¡£Ut��€d§¿¶���������phpunit/Runner/Filter/Test.php��¡£U��aŸŽ¶������'���phpunit/Runner/Filter/Group/Exclude.phpâ��¡£Uâ��„ÊPF¶������'���phpunit/Runner/Filter/Group/Include.phpá��¡£Uá��Ve¶������!���phpunit/Runner/Filter/Factory.phpÜ��¡£UÜ��…õJ¶���������phpunit/Runner/Filter/Group.php���¡£U���c2{m¶������"���phpunit/Runner/TestSuiteLoader.phpë��¡£Uë��©9äɶ������!���phpunit/Runner/BaseTestRunner.php“��¡£U“��®Q޶������*���phpunit/Runner/StandardTestSuiteLoader.phpä
��¡£Uä
��ø-ù¥¶���������phpunit/Runner/Version.php°��¡£U°��ìÏÍq¶���������sebastian-environment/LICENSE
- ��¡£U
- ��¶îáß¶������!���sebastian-environment/Runtime.phpÄ��¡£UÄ��¹º¶������!���sebastian-environment/Console.php©��¡£U©��qí*¶������)���phpdocumentor-reflection-docblock/LICENSE8��¡£U8��á‰Ê¶������G���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock.phpc6��¡£Uc6��õËq¶������P���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Location.phpq��¡£Uq��uÁ/¶������T���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php|��¡£U|��tøûR¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.phpÿ��¡£Uÿ��ià?$¶������V���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.phpx
- ��¡£Ux
- ��ÓËEƶ������W���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.phpO��¡£UO��«Î#m¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.phpÙ��¡£UÙ��pS�ž¶������Y���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php†��¡£U†��K§¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.phpL��¡£UL��œ"â¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.phpI��¡£UI��9¹{¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php���¡£U���äÙn*¶������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.phpE��¡£UE��.�„˶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php~��¡£U~��å!kͶ������[���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php[��¡£U[��Í<=¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.phpM��¡£UM��1ôú¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VarTag.phpE��¡£UE��ƒ•üͶ������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.phpL��¡£UL���ªF¶������V���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php™��¡£U™��
£
- ï¶������T���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.phpH��¡£UH��±ñ¶������\���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php]��¡£U]��Rp¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Serializer.php��¡£U��òrж������O���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Context.php5��¡£U5��l.%¶������W���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Type/Collection.php���¡£U���+=4¶������K���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag.phpÛ(��¡£UÛ(��ŒE6¶������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Description.php—��¡£U—��ñԲض���������sebastian-version/LICENSE��¡£U��n¶���������sebastian-version/Version.php2��¡£U2��BŸâZ¶������<?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- interface Exception
- {
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use Closure;
- use ReflectionClass;
- /**
- * A snapshot of global state.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Snapshot
- {
- /**
- * @var Blacklist
- */
- private $blacklist;
- /**
- * @var array
- */
- private $globalVariables = array();
- /**
- * @var array
- */
- private $superGlobalArrays = array();
- /**
- * @var array
- */
- private $superGlobalVariables = array();
- /**
- * @var array
- */
- private $staticAttributes = array();
- /**
- * @var array
- */
- private $iniSettings = array();
- /**
- * @var array
- */
- private $includedFiles = array();
- /**
- * @var array
- */
- private $constants = array();
- /**
- * @var array
- */
- private $functions = array();
- /**
- * @var array
- */
- private $interfaces = array();
- /**
- * @var array
- */
- private $classes = array();
- /**
- * @var array
- */
- private $traits = array();
- /**
- * Creates a snapshot of the current global state.
- *
- * @param Blacklist $blacklist
- * @param boolean $includeGlobalVariables
- * @param boolean $includeStaticAttributes
- * @param boolean $includeConstants
- * @param boolean $includeFunctions
- * @param boolean $includeClasses
- * @param boolean $includeInterfaces
- * @param boolean $includeTraits
- * @param boolean $includeIniSettings
- * @param boolean $includeIncludedFiles
- */
- public function __construct(Blacklist $blacklist = null, $includeGlobalVariables = true, $includeStaticAttributes = true, $includeConstants = true, $includeFunctions = true, $includeClasses = true, $includeInterfaces = true, $includeTraits = true, $includeIniSettings = true, $includeIncludedFiles = true)
- {
- if ($blacklist === null) {
- $blacklist = new Blacklist;
- }
- $this->blacklist = $blacklist;
- if ($includeConstants) {
- $this->snapshotConstants();
- }
- if ($includeFunctions) {
- $this->snapshotFunctions();
- }
- if ($includeClasses || $includeStaticAttributes) {
- $this->snapshotClasses();
- }
- if ($includeInterfaces) {
- $this->snapshotInterfaces();
- }
- if ($includeGlobalVariables) {
- $this->setupSuperGlobalArrays();
- $this->snapshotGlobals();
- }
- if ($includeStaticAttributes) {
- $this->snapshotStaticAttributes();
- }
- if ($includeIniSettings) {
- $this->iniSettings = ini_get_all(null, false);
- }
- if ($includeIncludedFiles) {
- $this->includedFiles = get_included_files();
- }
- if (function_exists('get_declared_traits')) {
- $this->traits = get_declared_traits();
- }
- }
- /**
- * @return Blacklist
- */
- public function blacklist()
- {
- return $this->blacklist;
- }
- /**
- * @return array
- */
- public function globalVariables()
- {
- return $this->globalVariables;
- }
- /**
- * @return array
- */
- public function superGlobalVariables()
- {
- return $this->superGlobalVariables;
- }
- /**
- * Returns a list of all super-global variable arrays.
- *
- * @return array
- */
- public function superGlobalArrays()
- {
- return $this->superGlobalArrays;
- }
- /**
- * @return array
- */
- public function staticAttributes()
- {
- return $this->staticAttributes;
- }
- /**
- * @return array
- */
- public function iniSettings()
- {
- return $this->iniSettings;
- }
- /**
- * @return array
- */
- public function includedFiles()
- {
- return $this->includedFiles;
- }
- /**
- * @return array
- */
- public function constants()
- {
- return $this->constants;
- }
- /**
- * @return array
- */
- public function functions()
- {
- return $this->functions;
- }
- /**
- * @return array
- */
- public function interfaces()
- {
- return $this->interfaces;
- }
- /**
- * @return array
- */
- public function classes()
- {
- return $this->classes;
- }
- /**
- * @return array
- */
- public function traits()
- {
- return $this->traits;
- }
- /**
- * Creates a snapshot user-defined constants.
- */
- private function snapshotConstants()
- {
- $constants = get_defined_constants(true);
- if (isset($constants['user'])) {
- $this->constants = $constants['user'];
- }
- }
- /**
- * Creates a snapshot user-defined functions.
- */
- private function snapshotFunctions()
- {
- $functions = get_defined_functions();
- $this->functions = $functions['user'];
- }
- /**
- * Creates a snapshot user-defined classes.
- */
- private function snapshotClasses()
- {
- foreach (array_reverse(get_declared_classes()) as $className) {
- $class = new ReflectionClass($className);
- if (!$class->isUserDefined()) {
- break;
- }
- $this->classes[] = $className;
- }
- $this->classes = array_reverse($this->classes);
- }
- /**
- * Creates a snapshot user-defined interfaces.
- */
- private function snapshotInterfaces()
- {
- foreach (array_reverse(get_declared_interfaces()) as $interfaceName) {
- $class = new ReflectionClass($interfaceName);
- if (!$class->isUserDefined()) {
- break;
- }
- $this->interfaces[] = $interfaceName;
- }
- $this->interfaces = array_reverse($this->interfaces);
- }
- /**
- * Creates a snapshot of all global and super-global variables.
- */
- private function snapshotGlobals()
- {
- $superGlobalArrays = $this->superGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- $this->snapshotSuperGlobalArray($superGlobalArray);
- }
- foreach (array_keys($GLOBALS) as $key) {
- if ($key != 'GLOBALS' &&
- !in_array($key, $superGlobalArrays) &&
- $this->canBeSerialized($GLOBALS[$key]) &&
- !$this->blacklist->isGlobalVariableBlacklisted($key)) {
- $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key]));
- }
- }
- }
- /**
- * Creates a snapshot a super-global variable array.
- *
- * @param $superGlobalArray
- */
- private function snapshotSuperGlobalArray($superGlobalArray)
- {
- $this->superGlobalVariables[$superGlobalArray] = array();
- if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) {
- foreach ($GLOBALS[$superGlobalArray] as $key => $value) {
- $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value));
- }
- }
- }
- /**
- * Creates a snapshot of all static attributes in user-defined classes.
- */
- private function snapshotStaticAttributes()
- {
- foreach ($this->classes as $className) {
- $class = new ReflectionClass($className);
- $snapshot = array();
- foreach ($class->getProperties() as $attribute) {
- if ($attribute->isStatic()) {
- $name = $attribute->getName();
- if ($this->blacklist->isStaticAttributeBlacklisted($className, $name)) {
- continue;
- }
- $attribute->setAccessible(true);
- $value = $attribute->getValue();
- if ($this->canBeSerialized($value)) {
- $snapshot[$name] = unserialize(serialize($value));
- }
- }
- }
- if (!empty($snapshot)) {
- $this->staticAttributes[$className] = $snapshot;
- }
- }
- }
- /**
- * Returns a list of all super-global variable arrays.
- *
- * @return array
- */
- private function setupSuperGlobalArrays()
- {
- $this->superGlobalArrays = array(
- '_ENV',
- '_POST',
- '_GET',
- '_COOKIE',
- '_SERVER',
- '_FILES',
- '_REQUEST'
- );
- if (ini_get('register_long_arrays') == '1') {
- $this->superGlobalArrays = array_merge(
- $this->superGlobalArrays,
- array(
- 'HTTP_ENV_VARS',
- 'HTTP_POST_VARS',
- 'HTTP_GET_VARS',
- 'HTTP_COOKIE_VARS',
- 'HTTP_SERVER_VARS',
- 'HTTP_POST_FILES'
- )
- );
- }
- }
- /**
- * @param mixed $variable
- * @return boolean
- * @todo Implement this properly
- */
- private function canBeSerialized($variable) {
- return !$variable instanceof Closure;
- }
- }
- GlobalState
- Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use ReflectionProperty;
- /**
- * Restorer of snapshots of global state.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Restorer
- {
- /**
- * Deletes function definitions that are not defined in a snapshot.
- *
- * @param Snapshot $snapshot
- * @throws RuntimeException when the uopz_delete() function is not available
- * @see https://github.com/krakjoe/uopz
- */
- public function restoreFunctions(Snapshot $snapshot)
- {
- if (!function_exists('uopz_delete')) {
- throw new RuntimeException('The uopz_delete() function is required for this operation');
- }
- $functions = get_defined_functions();
- foreach (array_diff($functions['user'], $snapshot->functions()) as $function) {
- uopz_delete($function);
- }
- }
- /**
- * Restores all global and super-global variables from a snapshot.
- *
- * @param Snapshot $snapshot
- */
- public function restoreGlobalVariables(Snapshot $snapshot)
- {
- $superGlobalArrays = $snapshot->superGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- $this->restoreSuperGlobalArray($snapshot, $superGlobalArray);
- }
- $globalVariables = $snapshot->globalVariables();
- foreach (array_keys($GLOBALS) as $key) {
- if ($key != 'GLOBALS' &&
- !in_array($key, $superGlobalArrays) &&
- !$snapshot->blacklist()->isGlobalVariableBlacklisted($key)) {
- if (isset($globalVariables[$key])) {
- $GLOBALS[$key] = $globalVariables[$key];
- } else {
- unset($GLOBALS[$key]);
- }
- }
- }
- }
- /**
- * Restores all static attributes in user-defined classes from this snapshot.
- *
- * @param Snapshot $snapshot
- */
- public function restoreStaticAttributes(Snapshot $snapshot)
- {
- foreach ($snapshot->staticAttributes() as $className => $staticAttributes) {
- foreach ($staticAttributes as $name => $value) {
- $reflector = new ReflectionProperty($className, $name);
- $reflector->setAccessible(true);
- $reflector->setValue($value);
- }
- }
- }
- /**
- * Restores a super-global variable array from this snapshot.
- *
- * @param Snapshot $snapshot
- * @param $superGlobalArray
- */
- private function restoreSuperGlobalArray(Snapshot $snapshot, $superGlobalArray)
- {
- $superGlobalVariables = $snapshot->superGlobalVariables();
- if (isset($GLOBALS[$superGlobalArray]) &&
- is_array($GLOBALS[$superGlobalArray]) &&
- isset($superGlobalVariables[$superGlobalArray])) {
- $keys = array_keys(
- array_merge(
- $GLOBALS[$superGlobalArray],
- $superGlobalVariables[$superGlobalArray]
- )
- );
- foreach ($keys as $key) {
- if (isset($superGlobalVariables[$superGlobalArray][$key])) {
- $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key];
- } else {
- unset($GLOBALS[$superGlobalArray][$key]);
- }
- }
- }
- }
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use ReflectionClass;
- /**
- * A blacklist for global state elements that should not be snapshotted.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Blacklist
- {
- /**
- * @var array
- */
- private $globalVariables = array();
- /**
- * @var array
- */
- private $classes = array();
- /**
- * @var array
- */
- private $classNamePrefixes = array();
- /**
- * @var array
- */
- private $parentClasses = array();
- /**
- * @var array
- */
- private $interfaces = array();
- /**
- * @var array
- */
- private $staticAttributes = array();
- /**
- * @param string $variableName
- */
- public function addGlobalVariable($variableName)
- {
- $this->globalVariables[$variableName] = true;
- }
- /**
- * @param string $className
- */
- public function addClass($className)
- {
- $this->classes[] = $className;
- }
- /**
- * @param string $className
- */
- public function addSubclassesOf($className)
- {
- $this->parentClasses[] = $className;
- }
- /**
- * @param string $interfaceName
- */
- public function addImplementorsOf($interfaceName)
- {
- $this->interfaces[] = $interfaceName;
- }
- /**
- * @param string $classNamePrefix
- */
- public function addClassNamePrefix($classNamePrefix)
- {
- $this->classNamePrefixes[] = $classNamePrefix;
- }
- /**
- * @param string $className
- * @param string $attributeName
- */
- public function addStaticAttribute($className, $attributeName)
- {
- if (!isset($this->staticAttributes[$className])) {
- $this->staticAttributes[$className] = array();
- }
- $this->staticAttributes[$className][$attributeName] = true;
- }
- /**
- * @param string $variableName
- * @return boolean
- */
- public function isGlobalVariableBlacklisted($variableName)
- {
- return isset($this->globalVariables[$variableName]);
- }
- /**
- * @param string $className
- * @param string $attributeName
- * @return boolean
- */
- public function isStaticAttributeBlacklisted($className, $attributeName)
- {
- if (in_array($className, $this->classes)) {
- return true;
- }
- foreach ($this->classNamePrefixes as $prefix) {
- if (strpos($className, $prefix) === 0) {
- return true;
- }
- }
- $class = new ReflectionClass($className);
- foreach ($this->parentClasses as $type) {
- if ($class->isSubclassOf($type)) {
- return true;
- }
- }
- foreach ($this->interfaces as $type) {
- if ($class->implementsInterface($type)) {
- return true;
- }
- }
- if (isset($this->staticAttributes[$className][$attributeName])) {
- return true;
- }
- return false;
- }
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class RuntimeException extends \RuntimeException implements Exception
- {
- }
- Text_Template
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Text_Template package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A simple template engine.
- *
- * @since Class available since Release 1.0.0
- */
- class Text_Template
- {
- /**
- * @var string
- */
- protected $template = '';
- /**
- * @var string
- */
- protected $openDelimiter = '{';
- /**
- * @var string
- */
- protected $closeDelimiter = '}';
- /**
- * @var array
- */
- protected $values = array();
- /**
- * Constructor.
- *
- * @param string $file
- * @throws InvalidArgumentException
- */
- public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}')
- {
- $this->setFile($file);
- $this->openDelimiter = $openDelimiter;
- $this->closeDelimiter = $closeDelimiter;
- }
- /**
- * Sets the template file.
- *
- * @param string $file
- * @throws InvalidArgumentException
- */
- public function setFile($file)
- {
- $distFile = $file . '.dist';
- if (file_exists($file)) {
- $this->template = file_get_contents($file);
- }
- else if (file_exists($distFile)) {
- $this->template = file_get_contents($distFile);
- }
- else {
- throw new InvalidArgumentException(
- 'Template file could not be loaded.'
- );
- }
- }
- /**
- * Sets one or more template variables.
- *
- * @param array $values
- * @param bool $merge
- */
- public function setVar(array $values, $merge = TRUE)
- {
- if (!$merge || empty($this->values)) {
- $this->values = $values;
- } else {
- $this->values = array_merge($this->values, $values);
- }
- }
- /**
- * Renders the template and returns the result.
- *
- * @return string
- */
- public function render()
- {
- $keys = array();
- foreach ($this->values as $key => $value) {
- $keys[] = $this->openDelimiter . $key . $this->closeDelimiter;
- }
- return str_replace($keys, $this->values, $this->template);
- }
- /**
- * Renders the template and writes the result to a file.
- *
- * @param string $target
- */
- public function renderTo($target)
- {
- $fp = @fopen($target, 'wt');
- if ($fp) {
- fwrite($fp, $this->render());
- fclose($fp);
- } else {
- $error = error_get_last();
- throw new RuntimeException(
- sprintf(
- 'Could not write to %s: %s',
- $target,
- substr(
- $error['message'],
- strpos($error['message'], ':') + 2
- )
- )
- );
- }
- }
- }
- Diff
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Interface for implementations of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- interface LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to);
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Memory-efficient implementation of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Denes Lados <lados.denes@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class MemoryEfficientImplementation implements LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to)
- {
- $cFrom = count($from);
- $cTo = count($to);
- if ($cFrom == 0) {
- return array();
- } elseif ($cFrom == 1) {
- if (in_array($from[0], $to)) {
- return array($from[0]);
- } else {
- return array();
- }
- } else {
- $i = intval($cFrom / 2);
- $fromStart = array_slice($from, 0, $i);
- $fromEnd = array_slice($from, $i);
- $llB = $this->length($fromStart, $to);
- $llE = $this->length(array_reverse($fromEnd), array_reverse($to));
- $jMax = 0;
- $max = 0;
- for ($j = 0; $j <= $cTo; $j++) {
- $m = $llB[$j] + $llE[$cTo - $j];
- if ($m >= $max) {
- $max = $m;
- $jMax = $j;
- }
- }
- $toStart = array_slice($to, 0, $jMax);
- $toEnd = array_slice($to, $jMax);
- return array_merge(
- $this->calculate($fromStart, $toStart),
- $this->calculate($fromEnd, $toEnd)
- );
- }
- }
- /**
- * @param array $from
- * @param array $to
- * @return array
- */
- private function length(array $from, array $to)
- {
- $current = array_fill(0, count($to) + 1, 0);
- $cFrom = count($from);
- $cTo = count($to);
- for ($i = 0; $i < $cFrom; $i++) {
- $prev = $current;
- for ($j = 0; $j < $cTo; $j++) {
- if ($from[$i] == $to[$j]) {
- $current[$j + 1] = $prev[$j] + 1;
- } else {
- $current[$j + 1] = max($current[$j], $prev[$j + 1]);
- }
- }
- }
- return $current;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Time-efficient implementation of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class TimeEfficientImplementation implements LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to)
- {
- $common = array();
- $fromLength = count($from);
- $toLength = count($to);
- $width = $fromLength + 1;
- $matrix = new \SplFixedArray($width * ($toLength + 1));
- for ($i = 0; $i <= $fromLength; ++$i) {
- $matrix[$i] = 0;
- }
- for ($j = 0; $j <= $toLength; ++$j) {
- $matrix[$j * $width] = 0;
- }
- for ($i = 1; $i <= $fromLength; ++$i) {
- for ($j = 1; $j <= $toLength; ++$j) {
- $o = ($j * $width) + $i;
- $matrix[$o] = max(
- $matrix[$o - 1],
- $matrix[$o - $width],
- $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0
- );
- }
- }
- $i = $fromLength;
- $j = $toLength;
- while ($i > 0 && $j > 0) {
- if ($from[$i-1] === $to[$j-1]) {
- $common[] = $from[$i-1];
- --$i;
- --$j;
- } else {
- $o = ($j * $width) + $i;
- if ($matrix[$o - $width] > $matrix[$o - 1]) {
- --$j;
- } else {
- --$i;
- }
- }
- }
- return array_reverse($common);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Line
- {
- const ADDED = 1;
- const REMOVED = 2;
- const UNCHANGED = 3;
- /**
- * @var int
- */
- private $type;
- /**
- * @var string
- */
- private $content;
- /**
- * @param int $type
- * @param string $content
- */
- public function __construct($type = self::UNCHANGED, $content = '')
- {
- $this->type = $type;
- $this->content = $content;
- }
- /**
- * @return string
- */
- public function getContent()
- {
- return $this->content;
- }
- /**
- * @return int
- */
- public function getType()
- {
- return $this->type;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- use SebastianBergmann\Diff\LCS\LongestCommonSubsequence;
- use SebastianBergmann\Diff\LCS\TimeEfficientImplementation;
- use SebastianBergmann\Diff\LCS\MemoryEfficientImplementation;
- /**
- * Diff implementation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Differ
- {
- /**
- * @var string
- */
- private $header;
- /**
- * @param string $header
- */
- public function __construct($header = "--- Original\n+++ New\n")
- {
- $this->header = $header;
- }
- /**
- * Returns the diff between two arrays or strings as string.
- *
- * @param array|string $from
- * @param array|string $to
- * @param LongestCommonSubsequence $lcs
- * @return string
- */
- public function diff($from, $to, LongestCommonSubsequence $lcs = null)
- {
- if (!is_array($from) && !is_string($from)) {
- $from = (string) $from;
- }
- if (!is_array($to) && !is_string($to)) {
- $to = (string) $to;
- }
- $buffer = $this->header;
- $diff = $this->diffToArray($from, $to, $lcs);
- $inOld = false;
- $i = 0;
- $old = array();
- foreach ($diff as $line) {
- if ($line[1] === 0 /* OLD */) {
- if ($inOld === false) {
- $inOld = $i;
- }
- } elseif ($inOld !== false) {
- if (($i - $inOld) > 5) {
- $old[$inOld] = $i - 1;
- }
- $inOld = false;
- }
- ++$i;
- }
- $start = isset($old[0]) ? $old[0] : 0;
- $end = count($diff);
- if ($tmp = array_search($end, $old)) {
- $end = $tmp;
- }
- $newChunk = true;
- for ($i = $start; $i < $end; $i++) {
- if (isset($old[$i])) {
- $buffer .= "\n";
- $newChunk = true;
- $i = $old[$i];
- }
- if ($newChunk) {
- $buffer .= "@@ @@\n";
- $newChunk = false;
- }
- if ($diff[$i][1] === 1 /* ADDED */) {
- $buffer .= '+' . $diff[$i][0] . "\n";
- } elseif ($diff[$i][1] === 2 /* REMOVED */) {
- $buffer .= '-' . $diff[$i][0] . "\n";
- } else {
- $buffer .= ' ' . $diff[$i][0] . "\n";
- }
- }
- return $buffer;
- }
- /**
- * Returns the diff between two arrays or strings as array.
- *
- * Each array element contains two elements:
- * - [0] => string $token
- * - [1] => 2|1|0
- *
- * - 2: REMOVED: $token was removed from $from
- * - 1: ADDED: $token was added to $from
- * - 0: OLD: $token is not changed in $to
- *
- * @param array|string $from
- * @param array|string $to
- * @param LongestCommonSubsequence $lcs
- * @return array
- */
- public function diffToArray($from, $to, LongestCommonSubsequence $lcs = null)
- {
- preg_match_all('(\r\n|\r|\n)', $from, $fromMatches);
- preg_match_all('(\r\n|\r|\n)', $to, $toMatches);
- if (is_string($from)) {
- $from = preg_split('(\r\n|\r|\n)', $from);
- }
- if (is_string($to)) {
- $to = preg_split('(\r\n|\r|\n)', $to);
- }
- $start = array();
- $end = array();
- $fromLength = count($from);
- $toLength = count($to);
- $length = min($fromLength, $toLength);
- for ($i = 0; $i < $length; ++$i) {
- if ($from[$i] === $to[$i]) {
- $start[] = $from[$i];
- unset($from[$i], $to[$i]);
- } else {
- break;
- }
- }
- $length -= $i;
- for ($i = 1; $i < $length; ++$i) {
- if ($from[$fromLength - $i] === $to[$toLength - $i]) {
- array_unshift($end, $from[$fromLength - $i]);
- unset($from[$fromLength - $i], $to[$toLength - $i]);
- } else {
- break;
- }
- }
- if ($lcs === null) {
- $lcs = $this->selectLcsImplementation($from, $to);
- }
- $common = $lcs->calculate(array_values($from), array_values($to));
- $diff = array();
- if (isset($fromMatches[0]) && $toMatches[0] &&
- count($fromMatches[0]) === count($toMatches[0]) &&
- $fromMatches[0] !== $toMatches[0]) {
- $diff[] = array(
- '#Warning: Strings contain different line endings!', 0
- );
- }
- foreach ($start as $token) {
- $diff[] = array($token, 0 /* OLD */);
- }
- reset($from);
- reset($to);
- foreach ($common as $token) {
- while ((($fromToken = reset($from)) !== $token)) {
- $diff[] = array(array_shift($from), 2 /* REMOVED */);
- }
- while ((($toToken = reset($to)) !== $token)) {
- $diff[] = array(array_shift($to), 1 /* ADDED */);
- }
- $diff[] = array($token, 0 /* OLD */);
- array_shift($from);
- array_shift($to);
- }
- while (($token = array_shift($from)) !== null) {
- $diff[] = array($token, 2 /* REMOVED */);
- }
- while (($token = array_shift($to)) !== null) {
- $diff[] = array($token, 1 /* ADDED */);
- }
- foreach ($end as $token) {
- $diff[] = array($token, 0 /* OLD */);
- }
- return $diff;
- }
- /**
- * @param array $from
- * @param array $to
- * @return LongestCommonSubsequence
- */
- private function selectLcsImplementation(array $from, array $to)
- {
- // We do not want to use the time-efficient implementation if its memory
- // footprint will probably exceed this value. Note that the footprint
- // calculation is only an estimation for the matrix and the LCS method
- // will typically allocate a bit more memory than this.
- $memoryLimit = 100 * 1024 * 1024;
- if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) {
- return new MemoryEfficientImplementation;
- }
- return new TimeEfficientImplementation;
- }
- /**
- * Calculates the estimated memory footprint for the DP-based method.
- *
- * @param array $from
- * @param array $to
- * @return integer
- */
- private function calculateEstimatedFootprint(array $from, array $to)
- {
- $itemSize = PHP_INT_SIZE == 4 ? 76 : 144;
- return $itemSize * pow(min(count($from), count($to)), 2);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * Unified diff parser.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Parser
- {
- /**
- * @param string $string
- * @return Diff[]
- */
- public function parse($string)
- {
- $lines = preg_split('(\r\n|\r|\n)', $string);
- $lineCount = count($lines);
- $diffs = array();
- $diff = null;
- $collected = array();
- for ($i = 0; $i < $lineCount; ++$i) {
- if (preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) &&
- preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) {
- if ($diff !== null) {
- $this->parseFileDiff($diff, $collected);
- $diffs[] = $diff;
- $collected = array();
- }
- $diff = new Diff($fromMatch['file'], $toMatch['file']);
- ++$i;
- } else {
- if (preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) {
- continue;
- }
- $collected[] = $lines[$i];
- }
- }
- if (count($collected) && ($diff !== null)) {
- $this->parseFileDiff($diff, $collected);
- $diffs[] = $diff;
- }
- return $diffs;
- }
- /**
- * @param Diff $diff
- * @param array $lines
- */
- private function parseFileDiff(Diff $diff, array $lines)
- {
- $chunks = array();
- foreach ($lines as $line) {
- if (preg_match('/^@@\s+-(?P<start>\d+)(?:,\s*(?P<startrange>\d+))?\s+\+(?P<end>\d+)(?:,\s*(?P<endrange>\d+))?\s+@@/', $line, $match)) {
- $chunk = new Chunk(
- $match['start'],
- isset($match['startrange']) ? max(1, $match['startrange']) : 1,
- $match['end'],
- isset($match['endrange']) ? max(1, $match['endrange']) : 1
- );
- $chunks[] = $chunk;
- $diffLines = array();
- continue;
- }
- if (preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) {
- $type = Line::UNCHANGED;
- if ($match['type'] == '+') {
- $type = Line::ADDED;
- } elseif ($match['type'] == '-') {
- $type = Line::REMOVED;
- }
- $diffLines[] = new Line($type, $match['line']);
- if (isset($chunk)) {
- $chunk->setLines($diffLines);
- }
- }
- }
- $diff->setChunks($chunks);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Diff
- {
- /**
- * @var string
- */
- private $from;
- /**
- * @var string
- */
- private $to;
- /**
- * @var Chunk[]
- */
- private $chunks;
- /**
- * @param string $from
- * @param string $to
- * @param Chunk[] $chunks
- */
- public function __construct($from, $to, array $chunks = array())
- {
- $this->from = $from;
- $this->to = $to;
- $this->chunks = $chunks;
- }
- /**
- * @return string
- */
- public function getFrom()
- {
- return $this->from;
- }
- /**
- * @return string
- */
- public function getTo()
- {
- return $this->to;
- }
- /**
- * @return Chunk[]
- */
- public function getChunks()
- {
- return $this->chunks;
- }
- /**
- * @param Chunk[] $chunks
- */
- public function setChunks(array $chunks)
- {
- $this->chunks = $chunks;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Chunk
- {
- /**
- * @var int
- */
- private $start;
- /**
- * @var int
- */
- private $startRange;
- /**
- * @var int
- */
- private $end;
- /**
- * @var int
- */
- private $endRange;
- /**
- * @var array
- */
- private $lines;
- /**
- * @param int $start
- * @param int $startRange
- * @param int $end
- * @param int $endRange
- * @param array $lines
- */
- public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = array())
- {
- $this->start = (int) $start;
- $this->startRange = (int) $startRange;
- $this->end = (int) $end;
- $this->endRange = (int) $endRange;
- $this->lines = $lines;
- }
- /**
- * @return int
- */
- public function getStart()
- {
- return $this->start;
- }
- /**
- * @return int
- */
- public function getStartRange()
- {
- return $this->startRange;
- }
- /**
- * @return int
- */
- public function getEnd()
- {
- return $this->end;
- }
- /**
- * @return int
- */
- public function getEndRange()
- {
- return $this->endRange;
- }
- /**
- * @return array
- */
- public function getLines()
- {
- return $this->lines;
- }
- /**
- * @param array $lines
- */
- public function setLines(array $lines)
- {
- $this->lines = $lines;
- }
- }
- <?php
- /*
- * This file is part of the PHP_Timer package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for timing.
- *
- * @package PHP
- * @subpackage Timer
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-timer
- * @since Class available since Release 1.0.0
- */
- class PHP_Timer
- {
- /**
- * @var array
- */
- private static $times = array(
- 'hour' => 3600000,
- 'minute' => 60000,
- 'second' => 1000
- );
- /**
- * @var array
- */
- private static $startTimes = array();
- /**
- * @var float
- */
- public static $requestTime;
- /**
- * Starts the timer.
- */
- public static function start()
- {
- array_push(self::$startTimes, microtime(true));
- }
- /**
- * Stops the timer and returns the elapsed time.
- *
- * @return float
- */
- public static function stop()
- {
- return microtime(true) - array_pop(self::$startTimes);
- }
- /**
- * Formats the elapsed time as a string.
- *
- * @param float $time
- * @return string
- */
- public static function secondsToTimeString($time)
- {
- $ms = round($time * 1000);
- foreach (self::$times as $unit => $value) {
- if ($ms >= $value) {
- $time = floor($ms / $value * 100.0) / 100.0;
- return $time . ' ' . ($time == 1 ? $unit : $unit . 's');
- }
- }
- return $ms . ' ms';
- }
- /**
- * Formats the elapsed time since the start of the request as a string.
- *
- * @return string
- */
- public static function timeSinceStartOfRequest()
- {
- return self::secondsToTimeString(microtime(true) - self::$requestTime);
- }
- /**
- * Returns the resources (time, memory) of the request as a string.
- *
- * @return string
- */
- public static function resourceUsage()
- {
- return sprintf(
- 'Time: %s, Memory: %4.2fMb',
- self::timeSinceStartOfRequest(),
- memory_get_peak_usage(true) / 1048576
- );
- }
- }
- if (isset($_SERVER['REQUEST_TIME_FLOAT'])) {
- PHP_Timer::$requestTime = $_SERVER['REQUEST_TIME_FLOAT'];
- } elseif (isset($_SERVER['REQUEST_TIME'])) {
- PHP_Timer::$requestTime = $_SERVER['REQUEST_TIME'];
- } else {
- PHP_Timer::$requestTime = microtime(true);
- }
- PHP_Timer
- Copyright (c) 2010-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- Comparator
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Abstract base class for comparators which compare values for equality.
- *
- * @package Comparator
- * @subpackage Framework
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- abstract class Comparator
- {
- /**
- * @var Factory
- */
- protected $factory;
- /**
- * @var Exporter
- */
- protected $exporter;
- public function __construct()
- {
- $this->exporter = new Exporter;
- }
- /**
- * @param Factory $factory
- */
- public function setFactory(Factory $factory)
- {
- $this->factory = $factory;
- }
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- abstract public function accepts($expected, $actual);
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- abstract public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false);
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares \SplObjectStorage instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class SplObjectStorageComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \SplObjectStorage && $actual instanceof \SplObjectStorage;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- foreach ($actual as $object) {
- if (!$expected->contains($object)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- foreach ($expected as $object) {
- if (!$actual->contains($object)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares values for type equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class TypeComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return true;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if (gettype($expected) != gettype($actual)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // we don't need a diff
- '',
- '',
- false,
- sprintf(
- '%s does not match expected type "%s".',
- $this->exporter->shortenedExport($actual),
- gettype($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares objects for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ObjectComparator extends ArrayComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_object($expected) && is_object($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @param array $processed
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
- {
- if (get_class($actual) !== get_class($expected)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- sprintf(
- '%s is not instance of expected class "%s".',
- $this->exporter->export($actual),
- get_class($expected)
- )
- );
- }
- // don't compare twice to allow for cyclic dependencies
- if (in_array(array($actual, $expected), $processed, true) ||
- in_array(array($expected, $actual), $processed, true)) {
- return;
- }
- $processed[] = array($actual, $expected);
- // don't compare objects if they are identical
- // this helps to avoid the error "maximum function nesting level reached"
- // CAUTION: this conditional clause is not tested
- if ($actual !== $expected) {
- try {
- parent::assertEquals(
- $this->toArray($expected),
- $this->toArray($actual),
- $delta,
- $canonicalize,
- $ignoreCase,
- $processed
- );
- } catch (ComparisonFailure $e) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // replace "Array" with "MyClass object"
- substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5),
- substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- return $this->exporter->toArray($object);
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares resources for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ResourceComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_resource($expected) && is_resource($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if ($actual != $expected) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual)
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares arrays for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ArrayComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_array($expected) && is_array($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @param array $processed
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
- {
- if ($canonicalize) {
- sort($expected);
- sort($actual);
- }
- $remaining = $actual;
- $expString = $actString = "Array (\n";
- $equal = true;
- foreach ($expected as $key => $value) {
- unset($remaining[$key]);
- if (!array_key_exists($key, $actual)) {
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $equal = false;
- continue;
- }
- try {
- $comparator = $this->factory->getComparatorFor($value, $actual[$key]);
- $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed);
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($actual[$key])
- );
- } catch (ComparisonFailure $e) {
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $e->getExpectedAsString()
- ? $this->indent($e->getExpectedAsString())
- : $this->exporter->shortenedExport($e->getExpected())
- );
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $e->getActualAsString()
- ? $this->indent($e->getActualAsString())
- : $this->exporter->shortenedExport($e->getActual())
- );
- $equal = false;
- }
- }
- foreach ($remaining as $key => $value) {
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $equal = false;
- }
- $expString .= ')';
- $actString .= ')';
- if (!$equal) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $expString,
- $actString,
- false,
- 'Failed asserting that two arrays are equal.'
- );
- }
- }
- protected function indent($lines)
- {
- return trim(str_replace("\n", "\n ", $lines));
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares DateTime instances for equality.
- *
- * @package Comparator
- * @author Jeff Welch <whatthejeff@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DateTimeComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \DateTime && $actual instanceof \DateTime;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $delta = new \DateInterval(sprintf('PT%sS', abs($delta)));
- $expectedLower = clone $expected;
- $expectedUpper = clone $expected;
- if ($actual < $expectedLower->sub($delta) ||
- $actual > $expectedUpper->add($delta)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->dateTimeToString($expected),
- $this->dateTimeToString($actual),
- false,
- 'Failed asserting that two DateTime objects are equal.'
- );
- }
- }
- /**
- * Returns an ISO 8601 formatted string representation of a datetime or
- * 'Invalid DateTime object' if the provided DateTime was not properly
- * initialized.
- *
- * @param \DateTime $datetime
- * @return string
- */
- protected function dateTimeToString(\DateTime $datetime)
- {
- $string = $datetime->format(\DateTime::ISO8601);
- return $string ? $string : 'Invalid DateTime object';
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares Exception instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ExceptionComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \Exception && $actual instanceof \Exception;
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- $array = parent::toArray($object);
- unset(
- $array['file'],
- $array['line'],
- $array['trace'],
- $array['string'],
- $array['xdebug_message']
- );
- return $array;
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use DOMDocument;
- use DOMNode;
- /**
- * Compares DOMNode instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DOMNodeComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof DOMNode && $actual instanceof DOMNode;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $expectedAsString = $this->nodeToText($expected, true, $ignoreCase);
- $actualAsString = $this->nodeToText($actual, true, $ignoreCase);
- if ($expectedAsString !== $actualAsString) {
- if ($expected instanceof DOMDocument) {
- $type = 'documents';
- } else {
- $type = 'nodes';
- }
- throw new ComparisonFailure(
- $expected,
- $actual,
- $expectedAsString,
- $actualAsString,
- false,
- sprintf("Failed asserting that two DOM %s are equal.\n", $type)
- );
- }
- }
- /**
- * Returns the normalized, whitespace-cleaned, and indented textual
- * representation of a DOMNode.
- *
- * @param DOMNode $node
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return string
- */
- private function nodeToText(DOMNode $node, $canonicalize, $ignoreCase)
- {
- if ($canonicalize) {
- $document = new DOMDocument;
- $document->loadXML($node->C14N());
- $node = $document;
- }
- if ($node instanceof DOMDocument) {
- $document = $node;
- } else {
- $document = $node->ownerDocument;
- }
- $document->formatOutput = true;
- $document->normalizeDocument();
- if ($node instanceof DOMDocument) {
- $text = $node->saveXML();
- } else {
- $text = $document->saveXML($node);
- }
- if ($ignoreCase) {
- $text = strtolower($text);
- }
- return $text;
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares scalar or NULL values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ScalarComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- * @since Method available since Release 3.6.0
- */
- public function accepts($expected, $actual)
- {
- return ((is_scalar($expected) xor null === $expected) &&
- (is_scalar($actual) xor null === $actual))
- // allow comparison between strings and objects featuring __toString()
- || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString'))
- || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual));
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $expectedToCompare = $expected;
- $actualToCompare = $actual;
- // always compare as strings to avoid strange behaviour
- // otherwise 0 == 'Foobar'
- if (is_string($expected) || is_string($actual)) {
- $expectedToCompare = (string)$expectedToCompare;
- $actualToCompare = (string)$actualToCompare;
- if ($ignoreCase) {
- $expectedToCompare = strtolower($expectedToCompare);
- $actualToCompare = strtolower($actualToCompare);
- }
- }
- if ($expectedToCompare != $actualToCompare) {
- if (is_string($expected) && is_string($actual)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two strings are equal.'
- );
- }
- throw new ComparisonFailure(
- $expected,
- $actual,
- // no diff is required
- '',
- '',
- false,
- sprintf(
- 'Failed asserting that %s matches expected %s.',
- $this->exporter->export($actual),
- $this->exporter->export($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares PHPUnit_Framework_MockObject_MockObject instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class MockObjectComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \PHPUnit_Framework_MockObject_MockObject && $actual instanceof \PHPUnit_Framework_MockObject_MockObject;
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- $array = parent::toArray($object);
- unset($array['__phpunit_invocationMocker']);
- return $array;
- }
- }<?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares numerical values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @author Alexander <iam.asm89@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class NumericComparator extends ScalarComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- // all numerical values, but not if one of them is a double
- // or both of them are strings
- return is_numeric($expected) && is_numeric($actual) &&
- !(is_double($expected) || is_double($actual)) &&
- !(is_string($expected) && is_string($actual));
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if (is_infinite($actual) && is_infinite($expected)) {
- return;
- }
- if ((is_infinite($actual) xor is_infinite($expected)) ||
- (is_nan($actual) or is_nan($expected)) ||
- abs($actual - $expected) > $delta) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- '',
- '',
- false,
- sprintf(
- 'Failed asserting that %s matches expected %s.',
- $this->exporter->export($actual),
- $this->exporter->export($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Factory for comparators which compare values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class Factory
- {
- /**
- * @var Comparator[]
- */
- private $comparators = array();
- /**
- * @var Factory
- */
- private static $instance;
- /**
- * Constructs a new factory.
- */
- public function __construct()
- {
- $this->register(new TypeComparator);
- $this->register(new ScalarComparator);
- $this->register(new NumericComparator);
- $this->register(new DoubleComparator);
- $this->register(new ArrayComparator);
- $this->register(new ResourceComparator);
- $this->register(new ObjectComparator);
- $this->register(new ExceptionComparator);
- $this->register(new SplObjectStorageComparator);
- $this->register(new DOMNodeComparator);
- $this->register(new MockObjectComparator);
- $this->register(new DateTimeComparator);
- }
- /**
- * @return Factory
- */
- public static function getInstance()
- {
- if (self::$instance === null) {
- self::$instance = new Factory;
- }
- return self::$instance;
- }
- /**
- * Returns the correct comparator for comparing two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return Comparator
- */
- public function getComparatorFor($expected, $actual)
- {
- foreach ($this->comparators as $comparator) {
- if ($comparator->accepts($expected, $actual)) {
- return $comparator;
- }
- }
- }
- /**
- * Registers a new comparator.
- *
- * This comparator will be returned by getInstance() if its accept() method
- * returns TRUE for the compared values. It has higher priority than the
- * existing comparators, meaning that its accept() method will be tested
- * before those of the other comparators.
- *
- * @param Comparator $comparator The registered comparator
- */
- public function register(Comparator $comparator)
- {
- array_unshift($this->comparators, $comparator);
- $comparator->setFactory($this);
- }
- /**
- * Unregisters a comparator.
- *
- * This comparator will no longer be returned by getInstance().
- *
- * @param Comparator $comparator The unregistered comparator
- */
- public function unregister(Comparator $comparator)
- {
- foreach ($this->comparators as $key => $_comparator) {
- if ($comparator === $_comparator) {
- unset($this->comparators[$key]);
- }
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares doubles for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DoubleComparator extends NumericComparator
- {
- /**
- * Smallest value available in PHP.
- *
- * @var float
- */
- const EPSILON = 0.0000000001;
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return (is_double($expected) || is_double($actual)) && is_numeric($expected) && is_numeric($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if ($delta == 0) {
- $delta = self::EPSILON;
- }
- parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase);
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use SebastianBergmann\Diff\Differ;
- /**
- * Thrown when an assertion for string equality failed.
- *
- * @package Comparator
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ComparisonFailure extends \RuntimeException
- {
- /**
- * Expected value of the retrieval which does not match $actual.
- * @var mixed
- */
- protected $expected;
- /**
- * Actually retrieved value which does not match $expected.
- * @var mixed
- */
- protected $actual;
- /**
- * The string representation of the expected value
- * @var string
- */
- protected $expectedAsString;
- /**
- * The string representation of the actual value
- * @var string
- */
- protected $actualAsString;
- /**
- * @var boolean
- */
- protected $identical;
- /**
- * Optional message which is placed in front of the first line
- * returned by toString().
- * @var string
- */
- protected $message;
- /**
- * Initialises with the expected value and the actual value.
- *
- * @param mixed $expected Expected value retrieved.
- * @param mixed $actual Actual value retrieved.
- * @param string $expectedAsString
- * @param string $actualAsString
- * @param boolean $identical
- * @param string $message A string which is prefixed on all returned lines
- * in the difference output.
- */
- public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = false, $message = '')
- {
- $this->expected = $expected;
- $this->actual = $actual;
- $this->expectedAsString = $expectedAsString;
- $this->actualAsString = $actualAsString;
- $this->message = $message;
- }
- /**
- * @return mixed
- */
- public function getActual()
- {
- return $this->actual;
- }
- /**
- * @return mixed
- */
- public function getExpected()
- {
- return $this->expected;
- }
- /**
- * @return string
- */
- public function getActualAsString()
- {
- return $this->actualAsString;
- }
- /**
- * @return string
- */
- public function getExpectedAsString()
- {
- return $this->expectedAsString;
- }
- /**
- * @return string
- */
- public function getDiff()
- {
- if (!$this->actualAsString && !$this->expectedAsString) {
- return '';
- }
- $differ = new Differ("\n--- Expected\n+++ Actual\n");
- return $differ->diff($this->expectedAsString, $this->actualAsString);
- }
- /**
- * @return string
- */
- public function toString()
- {
- return $this->message . $this->getDiff();
- }
- }
- Copyright (c) 2013 Konstantin Kudryashov <ever.zet@gmail.com>
- Marcello Duarte <marcello.duarte@gmail.com>
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Prophecies revealer interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface RevealerInterface
- {
- /**
- * Unwraps value(s).
- *
- * @param mixed $value
- *
- * @return mixed
- */
- public function reveal($value);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Controllable doubles interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ProphecySubjectInterface
- {
- /**
- * Sets subject prophecy.
- *
- * @param ProphecyInterface $prophecy
- */
- public function setProphecy(ProphecyInterface $prophecy);
- /**
- * Returns subject prophecy.
- *
- * @return ProphecyInterface
- */
- public function getProphecy();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Basic prophecies revealer.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Revealer implements RevealerInterface
- {
- /**
- * Unwraps value(s).
- *
- * @param mixed $value
- *
- * @return mixed
- */
- public function reveal($value)
- {
- if (is_array($value)) {
- return array_map(array($this, __FUNCTION__), $value);
- }
- if (!is_object($value)) {
- return $value;
- }
- if ($value instanceof ProphecyInterface) {
- $value = $value->reveal();
- }
- return $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Core Prophecy interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ProphecyInterface
- {
- /**
- * Reveals prophecy object (double) .
- *
- * @return object
- */
- public function reveal();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Call\Call;
- use Prophecy\Doubler\LazyDouble;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Call\CallCenter;
- use Prophecy\Exception\Prophecy\ObjectProphecyException;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- use Prophecy\Exception\Prediction\AggregateException;
- use Prophecy\Exception\Prediction\PredictionException;
- /**
- * Object prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ObjectProphecy implements ProphecyInterface
- {
- private $lazyDouble;
- private $callCenter;
- private $revealer;
- private $comparatorFactory;
- /**
- * @var MethodProphecy[][]
- */
- private $methodProphecies = array();
- /**
- * Initializes object prophecy.
- *
- * @param LazyDouble $lazyDouble
- * @param CallCenter $callCenter
- * @param RevealerInterface $revealer
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct(
- LazyDouble $lazyDouble,
- CallCenter $callCenter = null,
- RevealerInterface $revealer = null,
- ComparatorFactory $comparatorFactory = null
- ) {
- $this->lazyDouble = $lazyDouble;
- $this->callCenter = $callCenter ?: new CallCenter;
- $this->revealer = $revealer ?: new Revealer;
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Forces double to extend specific class.
- *
- * @param string $class
- *
- * @return $this
- */
- public function willExtend($class)
- {
- $this->lazyDouble->setParentClass($class);
- return $this;
- }
- /**
- * Forces double to implement specific interface.
- *
- * @param string $interface
- *
- * @return $this
- */
- public function willImplement($interface)
- {
- $this->lazyDouble->addInterface($interface);
- return $this;
- }
- /**
- * Sets constructor arguments.
- *
- * @param array $arguments
- *
- * @return $this
- */
- public function willBeConstructedWith(array $arguments = null)
- {
- $this->lazyDouble->setArguments($arguments);
- return $this;
- }
- /**
- * Reveals double.
- *
- * @return object
- *
- * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface
- */
- public function reveal()
- {
- $double = $this->lazyDouble->getInstance();
- if (null === $double || !$double instanceof ProphecySubjectInterface) {
- throw new ObjectProphecyException(
- "Generated double must implement ProphecySubjectInterface, but it does not.\n".
- 'It seems you have wrongly configured doubler without required ClassPatch.',
- $this
- );
- }
- $double->setProphecy($this);
- return $double;
- }
- /**
- * Adds method prophecy to object prophecy.
- *
- * @param MethodProphecy $methodProphecy
- *
- * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't
- * have arguments wildcard
- */
- public function addMethodProphecy(MethodProphecy $methodProphecy)
- {
- $argumentsWildcard = $methodProphecy->getArgumentsWildcard();
- if (null === $argumentsWildcard) {
- throw new MethodProphecyException(sprintf(
- "Can not add prophecy for a method `%s::%s()`\n".
- "as you did not specify arguments wildcard for it.",
- get_class($this->reveal()),
- $methodProphecy->getMethodName()
- ), $methodProphecy);
- }
- $methodName = $methodProphecy->getMethodName();
- if (!isset($this->methodProphecies[$methodName])) {
- $this->methodProphecies[$methodName] = array();
- }
- $this->methodProphecies[$methodName][] = $methodProphecy;
- }
- /**
- * Returns either all or related to single method prophecies.
- *
- * @param null|string $methodName
- *
- * @return MethodProphecy[]
- */
- public function getMethodProphecies($methodName = null)
- {
- if (null === $methodName) {
- return $this->methodProphecies;
- }
- if (!isset($this->methodProphecies[$methodName])) {
- return array();
- }
- return $this->methodProphecies[$methodName];
- }
- /**
- * Makes specific method call.
- *
- * @param string $methodName
- * @param array $arguments
- *
- * @return mixed
- */
- public function makeProphecyMethodCall($methodName, array $arguments)
- {
- $arguments = $this->revealer->reveal($arguments);
- $return = $this->callCenter->makeCall($this, $methodName, $arguments);
- return $this->revealer->reveal($return);
- }
- /**
- * Finds calls by method name & arguments wildcard.
- *
- * @param string $methodName
- * @param ArgumentsWildcard $wildcard
- *
- * @return Call[]
- */
- public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard)
- {
- return $this->callCenter->findCalls($methodName, $wildcard);
- }
- /**
- * Checks that registered method predictions do not fail.
- *
- * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail
- */
- public function checkProphecyMethodsPredictions()
- {
- $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal())));
- $exception->setObjectProphecy($this);
- foreach ($this->methodProphecies as $prophecies) {
- foreach ($prophecies as $prophecy) {
- try {
- $prophecy->checkPrediction();
- } catch (PredictionException $e) {
- $exception->append($e);
- }
- }
- }
- if (count($exception->getExceptions())) {
- throw $exception;
- }
- }
- /**
- * Creates new method prophecy using specified method name and arguments.
- *
- * @param string $methodName
- * @param array $arguments
- *
- * @return MethodProphecy
- */
- public function __call($methodName, array $arguments)
- {
- $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments));
- foreach ($this->getMethodProphecies($methodName) as $prophecy) {
- $argumentsWildcard = $prophecy->getArgumentsWildcard();
- $comparator = $this->comparatorFactory->getComparatorFor(
- $argumentsWildcard, $arguments
- );
- try {
- $comparator->assertEquals($argumentsWildcard, $arguments);
- return $prophecy;
- } catch (ComparisonFailure $failure) {}
- }
- return new MethodProphecy($this, $methodName, $arguments);
- }
- /**
- * Tries to get property value from double.
- *
- * @param string $name
- */
- public function __get($name)
- {
- return $this->reveal()->$name;
- }
- /**
- * Tries to set property value to double.
- *
- * @param string $name
- * @param string $value
- */
- public function __set($name, $value)
- {
- $this->reveal()->$name = $this->revealer->reveal($value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- use Prophecy\Argument;
- use Prophecy\Promise;
- use Prophecy\Prediction;
- use Prophecy\Exception\Doubler\MethodNotFoundException;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- /**
- * Method prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class MethodProphecy
- {
- private $objectProphecy;
- private $methodName;
- private $argumentsWildcard;
- private $promise;
- private $prediction;
- private $checkedPredictions = array();
- private $bound = false;
- /**
- * Initializes method prophecy.
- *
- * @param ObjectProphecy $objectProphecy
- * @param string $methodName
- * @param null|Argument\ArgumentsWildcard|array $arguments
- *
- * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found
- */
- public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null)
- {
- $double = $objectProphecy->reveal();
- if (!method_exists($double, $methodName)) {
- throw new MethodNotFoundException(sprintf(
- 'Method `%s::%s()` is not defined.', get_class($double), $methodName
- ), get_class($double), $methodName, $arguments);
- }
- $this->objectProphecy = $objectProphecy;
- $this->methodName = $methodName;
- $reflectedMethod = new \ReflectionMethod($double, $methodName);
- if ($reflectedMethod->isFinal()) {
- throw new MethodProphecyException(sprintf(
- "Can not add prophecy for a method `%s::%s()`\n".
- "as it is a final method.",
- get_class($double),
- $methodName
- ), $this);
- }
- if (null !== $arguments) {
- $this->withArguments($arguments);
- }
- }
- /**
- * Sets argument wildcard.
- *
- * @param array|Argument\ArgumentsWildcard $arguments
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function withArguments($arguments)
- {
- if (is_array($arguments)) {
- $arguments = new Argument\ArgumentsWildcard($arguments);
- }
- if (!$arguments instanceof Argument\ArgumentsWildcard) {
- throw new InvalidArgumentException(sprintf(
- "Either an array or an instance of ArgumentsWildcard expected as\n".
- 'a `MethodProphecy::withArguments()` argument, but got %s.',
- gettype($arguments)
- ));
- }
- $this->argumentsWildcard = $arguments;
- return $this;
- }
- /**
- * Sets custom promise to the prophecy.
- *
- * @param callable|Promise\PromiseInterface $promise
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function will($promise)
- {
- if (is_callable($promise)) {
- $promise = new Promise\CallbackPromise($promise);
- }
- if (!$promise instanceof Promise\PromiseInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PromiseInterface, but got %s.',
- gettype($promise)
- ));
- }
- $this->bindToObjectProphecy();
- $this->promise = $promise;
- return $this;
- }
- /**
- * Sets return promise to the prophecy.
- *
- * @see Prophecy\Promise\ReturnPromise
- *
- * @return $this
- */
- public function willReturn()
- {
- return $this->will(new Promise\ReturnPromise(func_get_args()));
- }
- /**
- * Sets return argument promise to the prophecy.
- *
- * @param int $index The zero-indexed number of the argument to return
- *
- * @see Prophecy\Promise\ReturnArgumentPromise
- *
- * @return $this
- */
- public function willReturnArgument($index = 0)
- {
- return $this->will(new Promise\ReturnArgumentPromise($index));
- }
- /**
- * Sets throw promise to the prophecy.
- *
- * @see Prophecy\Promise\ThrowPromise
- *
- * @param string|\Exception $exception Exception class or instance
- *
- * @return $this
- */
- public function willThrow($exception)
- {
- return $this->will(new Promise\ThrowPromise($exception));
- }
- /**
- * Sets custom prediction to the prophecy.
- *
- * @param callable|Prediction\PredictionInterface $prediction
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function should($prediction)
- {
- if (is_callable($prediction)) {
- $prediction = new Prediction\CallbackPrediction($prediction);
- }
- if (!$prediction instanceof Prediction\PredictionInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PredictionInterface, but got %s.',
- gettype($prediction)
- ));
- }
- $this->bindToObjectProphecy();
- $this->prediction = $prediction;
- return $this;
- }
- /**
- * Sets call prediction to the prophecy.
- *
- * @see Prophecy\Prediction\CallPrediction
- *
- * @return $this
- */
- public function shouldBeCalled()
- {
- return $this->should(new Prediction\CallPrediction);
- }
- /**
- * Sets no calls prediction to the prophecy.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- *
- * @return $this
- */
- public function shouldNotBeCalled()
- {
- return $this->should(new Prediction\NoCallsPrediction);
- }
- /**
- * Sets call times prediction to the prophecy.
- *
- * @see Prophecy\Prediction\CallTimesPrediction
- *
- * @param $count
- *
- * @return $this
- */
- public function shouldBeCalledTimes($count)
- {
- return $this->should(new Prediction\CallTimesPrediction($count));
- }
- /**
- * Checks provided prediction immediately.
- *
- * @param callable|Prediction\PredictionInterface $prediction
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function shouldHave($prediction)
- {
- if (is_callable($prediction)) {
- $prediction = new Prediction\CallbackPrediction($prediction);
- }
- if (!$prediction instanceof Prediction\PredictionInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PredictionInterface, but got %s.',
- gettype($prediction)
- ));
- }
- if (null === $this->promise) {
- $this->willReturn();
- }
- $calls = $this->getObjectProphecy()->findProphecyMethodCalls(
- $this->getMethodName(),
- $this->getArgumentsWildcard()
- );
- try {
- $prediction->check($calls, $this->getObjectProphecy(), $this);
- $this->checkedPredictions[] = $prediction;
- } catch (\Exception $e) {
- $this->checkedPredictions[] = $prediction;
- throw $e;
- }
- return $this;
- }
- /**
- * Checks call prediction.
- *
- * @see Prophecy\Prediction\CallPrediction
- *
- * @return $this
- */
- public function shouldHaveBeenCalled()
- {
- return $this->shouldHave(new Prediction\CallPrediction);
- }
- /**
- * Checks no calls prediction.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- *
- * @return $this
- */
- public function shouldNotHaveBeenCalled()
- {
- return $this->shouldHave(new Prediction\NoCallsPrediction);
- }
- /**
- * Checks no calls prediction.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- * @deprecated
- *
- * @return $this
- */
- public function shouldNotBeenCalled()
- {
- return $this->shouldNotHaveBeenCalled();
- }
- /**
- * Checks call times prediction.
- *
- * @see Prophecy\Prediction\CallTimesPrediction
- *
- * @param int $count
- *
- * @return $this
- */
- public function shouldHaveBeenCalledTimes($count)
- {
- return $this->shouldHave(new Prediction\CallTimesPrediction($count));
- }
- /**
- * Checks currently registered [with should(...)] prediction.
- */
- public function checkPrediction()
- {
- if (null === $this->prediction) {
- return;
- }
- $this->shouldHave($this->prediction);
- }
- /**
- * Returns currently registered promise.
- *
- * @return null|Promise\PromiseInterface
- */
- public function getPromise()
- {
- return $this->promise;
- }
- /**
- * Returns currently registered prediction.
- *
- * @return null|Prediction\PredictionInterface
- */
- public function getPrediction()
- {
- return $this->prediction;
- }
- /**
- * Returns predictions that were checked on this object.
- *
- * @return Prediction\PredictionInterface[]
- */
- public function getCheckedPredictions()
- {
- return $this->checkedPredictions;
- }
- /**
- * Returns object prophecy this method prophecy is tied to.
- *
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- /**
- * Returns method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->methodName;
- }
- /**
- * Returns arguments wildcard.
- *
- * @return Argument\ArgumentsWildcard
- */
- public function getArgumentsWildcard()
- {
- return $this->argumentsWildcard;
- }
- private function bindToObjectProphecy()
- {
- if ($this->bound) {
- return;
- }
- $this->getObjectProphecy()->addMethodProphecy($this);
- $this->bound = true;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Comparator;
- use SebastianBergmann\Comparator\Comparator;
- use SebastianBergmann\Comparator\ComparisonFailure;
- /**
- * Closure comparator.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- final class ClosureComparator extends Comparator
- {
- public function accepts($expected, $actual)
- {
- return is_object($expected) && $expected instanceof \Closure
- && is_object($actual) && $actual instanceof \Closure;
- }
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // we don't need a diff
- '',
- '',
- false,
- 'all closures are born different'
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Comparator;
- use SebastianBergmann\Comparator\Factory as BaseFactory;
- /**
- * Prophecy comparator factory.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- final class Factory extends BaseFactory
- {
- /**
- * @var Factory
- */
- private static $instance;
- public function __construct()
- {
- parent::__construct();
- $this->register(new ClosureComparator());
- }
- /**
- * @return Factory
- */
- public static function getInstance()
- {
- if (self::$instance === null) {
- self::$instance = new Factory;
- }
- return self::$instance;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy;
- use Prophecy\Argument\Token;
- /**
- * Argument tokens shortcuts.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Argument
- {
- /**
- * Checks that argument is exact value or object.
- *
- * @param mixed $value
- *
- * @return Token\ExactValueToken
- */
- public static function exact($value)
- {
- return new Token\ExactValueToken($value);
- }
- /**
- * Checks that argument is of specific type or instance of specific class.
- *
- * @param string $type Type name (`integer`, `string`) or full class name
- *
- * @return Token\TypeToken
- */
- public static function type($type)
- {
- return new Token\TypeToken($type);
- }
- /**
- * Checks that argument object has specific state.
- *
- * @param string $methodName
- * @param mixed $value
- *
- * @return Token\ObjectStateToken
- */
- public static function which($methodName, $value)
- {
- return new Token\ObjectStateToken($methodName, $value);
- }
- /**
- * Checks that argument matches provided callback.
- *
- * @param callable $callback
- *
- * @return Token\CallbackToken
- */
- public static function that($callback)
- {
- return new Token\CallbackToken($callback);
- }
- /**
- * Matches any single value.
- *
- * @return Token\AnyValueToken
- */
- public static function any()
- {
- return new Token\AnyValueToken;
- }
- /**
- * Matches all values to the rest of the signature.
- *
- * @return Token\AnyValuesToken
- */
- public static function cetera()
- {
- return new Token\AnyValuesToken;
- }
- /**
- * Checks that argument matches all tokens
- *
- * @param mixed ... a list of tokens
- *
- * @return Token\LogicalAndToken
- */
- public static function allOf()
- {
- return new Token\LogicalAndToken(func_get_args());
- }
- /**
- * Checks that argument array or countable object has exact number of elements.
- *
- * @param integer $value array elements count
- *
- * @return Token\ArrayCountToken
- */
- public static function size($value)
- {
- return new Token\ArrayCountToken($value);
- }
- /**
- * Checks that argument array contains (key, value) pair
- *
- * @param mixed $key exact value or token
- * @param mixed $value exact value or token
- *
- * @return Token\ArrayEntryToken
- */
- public static function withEntry($key, $value)
- {
- return new Token\ArrayEntryToken($key, $value);
- }
- /**
- * Checks that arguments array entries all match value
- *
- * @param mixed $value
- *
- * @return Token\ArrayEveryEntryToken
- */
- public static function withEveryEntry($value)
- {
- return new Token\ArrayEveryEntryToken($value);
- }
- /**
- * Checks that argument array contains value
- *
- * @param mixed $value
- *
- * @return Token\ArrayEntryToken
- */
- public static function containing($value)
- {
- return new Token\ArrayEntryToken(self::any(), $value);
- }
- /**
- * Checks that argument array has key
- *
- * @param mixed $key exact value or token
- *
- * @return Token\ArrayEntryToken
- */
- public static function withKey($key)
- {
- return new Token\ArrayEntryToken($key, self::any());
- }
- /**
- * Checks that argument does not match the value|token.
- *
- * @param mixed $value either exact value or argument token
- *
- * @return Token\LogicalNotToken
- */
- public static function not($value)
- {
- return new Token\LogicalNotToken($value);
- }
- /**
- * @param string $value
- *
- * @return Token\StringContainsToken
- */
- public static function containingString($value)
- {
- return new Token\StringContainsToken($value);
- }
- /**
- * Checks that argument is identical value.
- *
- * @param mixed $value
- *
- * @return Token\IdenticalValueToken
- */
- public static function is($value)
- {
- return new Token\IdenticalValueToken($value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy;
- use Prophecy\Doubler\Doubler;
- use Prophecy\Doubler\LazyDouble;
- use Prophecy\Doubler\ClassPatch;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\RevealerInterface;
- use Prophecy\Prophecy\Revealer;
- use Prophecy\Call\CallCenter;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\PredictionException;
- use Prophecy\Exception\Prediction\AggregateException;
- /**
- * Prophet creates prophecies.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Prophet
- {
- private $doubler;
- private $revealer;
- private $util;
- /**
- * @var ObjectProphecy[]
- */
- private $prophecies = array();
- /**
- * Initializes Prophet.
- *
- * @param null|Doubler $doubler
- * @param null|RevealerInterface $revealer
- * @param null|StringUtil $util
- */
- public function __construct(Doubler $doubler = null, RevealerInterface $revealer = null,
- StringUtil $util = null)
- {
- if (null === $doubler) {
- $doubler = new Doubler;
- $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch);
- $doubler->registerClassPatch(new ClassPatch\TraversablePatch);
- $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch);
- $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch);
- $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch);
- $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch());
- $doubler->registerClassPatch(new ClassPatch\MagicCallPatch);
- $doubler->registerClassPatch(new ClassPatch\KeywordPatch);
- }
- $this->doubler = $doubler;
- $this->revealer = $revealer ?: new Revealer;
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Creates new object prophecy.
- *
- * @param null|string $classOrInterface Class or interface name
- *
- * @return ObjectProphecy
- */
- public function prophesize($classOrInterface = null)
- {
- $this->prophecies[] = $prophecy = new ObjectProphecy(
- new LazyDouble($this->doubler),
- new CallCenter($this->util),
- $this->revealer
- );
- if ($classOrInterface && class_exists($classOrInterface)) {
- return $prophecy->willExtend($classOrInterface);
- }
- if ($classOrInterface && interface_exists($classOrInterface)) {
- return $prophecy->willImplement($classOrInterface);
- }
- return $prophecy;
- }
- /**
- * Returns all created object prophecies.
- *
- * @return ObjectProphecy[]
- */
- public function getProphecies()
- {
- return $this->prophecies;
- }
- /**
- * Returns Doubler instance assigned to this Prophet.
- *
- * @return Doubler
- */
- public function getDoubler()
- {
- return $this->doubler;
- }
- /**
- * Checks all predictions defined by prophecies of this Prophet.
- *
- * @throws Exception\Prediction\AggregateException If any prediction fails
- */
- public function checkPredictions()
- {
- $exception = new AggregateException("Some predictions failed:\n");
- foreach ($this->prophecies as $prophecy) {
- try {
- $prophecy->checkProphecyMethodsPredictions();
- } catch (PredictionException $e) {
- $exception->append($e);
- }
- }
- if (count($exception->getExceptions())) {
- throw $exception;
- }
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception;
- /**
- * Core Prophecy exception interface.
- * All Prophecy exceptions implement it.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface Exception
- {
- /**
- * @return string
- */
- public function getMessage();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Prophecy\ObjectProphecy;
- class ObjectProphecyException extends \RuntimeException implements ProphecyException
- {
- private $objectProphecy;
- public function __construct($message, ObjectProphecy $objectProphecy)
- {
- parent::__construct($message);
- $this->objectProphecy = $objectProphecy;
- }
- /**
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Exception\Exception;
- interface ProphecyException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Prophecy\MethodProphecy;
- class MethodProphecyException extends ObjectProphecyException
- {
- private $methodProphecy;
- public function __construct($message, MethodProphecy $methodProphecy)
- {
- parent::__construct($message, $methodProphecy->getObjectProphecy());
- $this->methodProphecy = $methodProphecy;
- }
- /**
- * @return MethodProphecy
- */
- public function getMethodProphecy()
- {
- return $this->methodProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class InterfaceNotFoundException extends ClassNotFoundException
- {
- public function getInterfaceName()
- {
- return $this->getClassname();
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use ReflectionClass;
- class ClassMirrorException extends \RuntimeException implements DoublerException
- {
- private $class;
- public function __construct($message, ReflectionClass $class)
- {
- parent::__construct($message);
- $this->class = $class;
- }
- public function getReflectedClass()
- {
- return $this->class;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use RuntimeException;
- class DoubleException extends RuntimeException implements DoublerException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use Prophecy\Exception\Exception;
- interface DoublerException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class MethodNotFoundException extends DoubleException
- {
- /**
- * @var string
- */
- private $classname;
- /**
- * @var string
- */
- private $methodName;
- /**
- * @var array
- */
- private $arguments;
- /**
- * @param string $message
- * @param string $classname
- * @param string $methodName
- * @param null|Argument\ArgumentsWildcard|array $arguments
- */
- public function __construct($message, $classname, $methodName, $arguments = null)
- {
- parent::__construct($message);
- $this->classname = $classname;
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- public function getArguments()
- {
- return $this->arguments;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class ReturnByReferenceException extends DoubleException
- {
- private $classname;
- private $methodName;
- /**
- * @param string $message
- * @param string $classname
- * @param string $methodName
- */
- public function __construct($message, $classname, $methodName)
- {
- parent::__construct($message);
- $this->classname = $classname;
- $this->methodName = $methodName;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- class ClassCreatorException extends \RuntimeException implements DoublerException
- {
- private $node;
- public function __construct($message, ClassNode $node)
- {
- parent::__construct($message);
- $this->node = $node;
- }
- public function getClassNode()
- {
- return $this->node;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class ClassNotFoundException extends DoubleException
- {
- private $classname;
- /**
- * @param string $message
- * @param string $classname
- */
- public function __construct($message, $classname)
- {
- parent::__construct($message);
- $this->classname = $classname;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- class UnexpectedCallsException extends MethodProphecyException implements PredictionException
- {
- private $calls = array();
- public function __construct($message, MethodProphecy $methodProphecy, array $calls)
- {
- parent::__construct($message, $methodProphecy);
- $this->calls = $calls;
- }
- public function getCalls()
- {
- return $this->calls;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Exception\Exception;
- interface PredictionException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use RuntimeException;
- /**
- * Basic failed prediction exception.
- * Use it for custom prediction failures.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class FailedPredictionException extends RuntimeException implements PredictionException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- class NoCallsException extends MethodProphecyException implements PredictionException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\ObjectProphecy;
- class AggregateException extends \RuntimeException implements PredictionException
- {
- private $exceptions = array();
- private $objectProphecy;
- public function append(PredictionException $exception)
- {
- $message = $exception->getMessage();
- $message = ' '.strtr($message, array("\n" => "\n "))."\n";
- $this->message = rtrim($this->message.$message);
- $this->exceptions[] = $exception;
- }
- /**
- * @return PredictionException[]
- */
- public function getExceptions()
- {
- return $this->exceptions;
- }
- public function setObjectProphecy(ObjectProphecy $objectProphecy)
- {
- $this->objectProphecy = $objectProphecy;
- }
- /**
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\MethodProphecy;
- class UnexpectedCallsCountException extends UnexpectedCallsException
- {
- private $expectedCount;
- public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls)
- {
- parent::__construct($message, $methodProphecy, $calls);
- $this->expectedCount = intval($count);
- }
- public function getExpectedCount()
- {
- return $this->expectedCount;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Call;
- use Prophecy\Exception\Prophecy\ObjectProphecyException;
- use Prophecy\Prophecy\ObjectProphecy;
- class UnexpectedCallException extends ObjectProphecyException
- {
- private $methodName;
- private $arguments;
- public function __construct($message, ObjectProphecy $objectProphecy,
- $methodName, array $arguments)
- {
- parent::__construct($message, $objectProphecy);
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- public function getArguments()
- {
- return $this->arguments;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception;
- class InvalidArgumentException extends \InvalidArgumentException implements Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use ReflectionClass;
- /**
- * Cached class doubler.
- * Prevents mirroring/creation of the same structure twice.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CachedDoubler extends Doubler
- {
- private $classes = array();
- /**
- * {@inheritdoc}
- */
- public function registerClassPatch(ClassPatch\ClassPatchInterface $patch)
- {
- $this->classes[] = array();
- parent::registerClassPatch($patch);
- }
- /**
- * {@inheritdoc}
- */
- protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
- {
- $classId = $this->generateClassId($class, $interfaces);
- if (isset($this->classes[$classId])) {
- return $this->classes[$classId];
- }
- return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
- }
- /**
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- private function generateClassId(ReflectionClass $class = null, array $interfaces)
- {
- $parts = array();
- if (null !== $class) {
- $parts[] = $class->getName();
- }
- foreach ($interfaces as $interface) {
- $parts[] = $interface->getName();
- }
- sort($parts);
- return md5(implode('', $parts));
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- /**
- * Core double interface.
- * All doubled classes will implement this one.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface DoubleInterface
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use Doctrine\Instantiator\Instantiator;
- use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
- use Prophecy\Doubler\Generator\ClassMirror;
- use Prophecy\Doubler\Generator\ClassCreator;
- use Prophecy\Exception\InvalidArgumentException;
- use ReflectionClass;
- /**
- * Cached class doubler.
- * Prevents mirroring/creation of the same structure twice.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Doubler
- {
- private $mirror;
- private $creator;
- private $namer;
- /**
- * @var ClassPatchInterface[]
- */
- private $patches = array();
- /**
- * @var \Doctrine\Instantiator\Instantiator
- */
- private $instantiator;
- /**
- * Initializes doubler.
- *
- * @param ClassMirror $mirror
- * @param ClassCreator $creator
- * @param NameGenerator $namer
- */
- public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null,
- NameGenerator $namer = null)
- {
- $this->mirror = $mirror ?: new ClassMirror;
- $this->creator = $creator ?: new ClassCreator;
- $this->namer = $namer ?: new NameGenerator;
- }
- /**
- * Returns list of registered class patches.
- *
- * @return ClassPatchInterface[]
- */
- public function getClassPatches()
- {
- return $this->patches;
- }
- /**
- * Registers new class patch.
- *
- * @param ClassPatchInterface $patch
- */
- public function registerClassPatch(ClassPatchInterface $patch)
- {
- $this->patches[] = $patch;
- @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) {
- return $patch2->getPriority() - $patch1->getPriority();
- });
- }
- /**
- * Creates double from specific class or/and list of interfaces.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces Array of ReflectionClass instances
- * @param array $args Constructor arguments
- *
- * @return DoubleInterface
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function double(ReflectionClass $class = null, array $interfaces, array $args = null)
- {
- foreach ($interfaces as $interface) {
- if (!$interface instanceof ReflectionClass) {
- throw new InvalidArgumentException(sprintf(
- "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
- "a second argument to `Doubler::double(...)`, but got %s.",
- is_object($interface) ? get_class($interface).' class' : gettype($interface)
- ));
- }
- }
- $classname = $this->createDoubleClass($class, $interfaces);
- $reflection = new ReflectionClass($classname);
- if (null !== $args) {
- return $reflection->newInstanceArgs($args);
- }
- if ((null === $constructor = $reflection->getConstructor())
- || ($constructor->isPublic() && !$constructor->isFinal())) {
- return $reflection->newInstance();
- }
- if (!$this->instantiator) {
- $this->instantiator = new Instantiator();
- }
- return $this->instantiator->instantiate($classname);
- }
- /**
- * Creates double class and returns its FQN.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
- {
- $name = $this->namer->name($class, $interfaces);
- $node = $this->mirror->reflect($class, $interfaces);
- foreach ($this->patches as $patch) {
- if ($patch->supports($node)) {
- $patch->apply($node);
- }
- }
- $this->creator->create($name, $node);
- return $name;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- /**
- * Class code creator.
- * Generates PHP code for specific class node tree.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassCodeGenerator
- {
- /**
- * Generates PHP code for class node.
- *
- * @param string $classname
- * @param Node\ClassNode $class
- *
- * @return string
- */
- public function generate($classname, Node\ClassNode $class)
- {
- $parts = explode('\\', $classname);
- $classname = array_pop($parts);
- $namespace = implode('\\', $parts);
- $code = sprintf("class %s extends \%s implements %s {\n",
- $classname, $class->getParentClass(), implode(', ',
- array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces())
- )
- );
- foreach ($class->getProperties() as $name => $visibility) {
- $code .= sprintf("%s \$%s;\n", $visibility, $name);
- }
- $code .= "\n";
- foreach ($class->getMethods() as $method) {
- $code .= $this->generateMethod($method)."\n";
- }
- $code .= "\n}";
- return sprintf("namespace %s {\n%s\n}", $namespace, $code);
- }
- private function generateMethod(Node\MethodNode $method)
- {
- $php = sprintf("%s %s function %s%s(%s) {\n",
- $method->getVisibility(),
- $method->isStatic() ? 'static' : '',
- $method->returnsReference() ? '&':'',
- $method->getName(),
- implode(', ', $this->generateArguments($method->getArguments()))
- );
- $php .= $method->getCode()."\n";
- return $php.'}';
- }
- private function generateArguments(array $arguments)
- {
- return array_map(function (Node\ArgumentNode $argument) {
- $php = '';
- if ($hint = $argument->getTypeHint()) {
- if ('array' === $hint || 'callable' === $hint) {
- $php .= $hint;
- } else {
- $php .= '\\'.$hint;
- }
- }
- $php .= ' '.($argument->isPassedByReference() ? '&' : '').'$'.$argument->getName();
- if ($argument->isOptional()) {
- $php .= ' = '.var_export($argument->getDefault(), true);
- }
- return $php;
- }, $arguments);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- use Prophecy\Exception\Doubler\ClassCreatorException;
- /**
- * Class creator.
- * Creates specific class in current environment.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassCreator
- {
- private $generator;
- /**
- * Initializes creator.
- *
- * @param ClassCodeGenerator $generator
- */
- public function __construct(ClassCodeGenerator $generator = null)
- {
- $this->generator = $generator ?: new ClassCodeGenerator;
- }
- /**
- * Creates class.
- *
- * @param string $classname
- * @param Node\ClassNode $class
- *
- * @return mixed
- *
- * @throws \Prophecy\Exception\Doubler\ClassCreatorException
- */
- public function create($classname, Node\ClassNode $class)
- {
- $code = $this->generator->generate($classname, $class);
- $return = eval($code);
- if (!class_exists($classname, false)) {
- if (count($class->getInterfaces())) {
- throw new ClassCreatorException(sprintf(
- 'Could not double `%s` and implement interfaces: [%s].',
- $class->getParentClass(), implode(', ', $class->getInterfaces())
- ), $class);
- }
- throw new ClassCreatorException(
- sprintf('Could not double `%s`.', $class->getParentClass()),
- $class
- );
- }
- return $return;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- /**
- * Reflection interface.
- * All reflected classes implement this interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ReflectionInterface
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Exception\Doubler\ClassMirrorException;
- use ReflectionClass;
- use ReflectionMethod;
- use ReflectionParameter;
- /**
- * Class mirror.
- * Core doubler class. Mirrors specific class and/or interfaces into class node tree.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassMirror
- {
- private static $reflectableMethods = array(
- '__construct',
- '__destruct',
- '__sleep',
- '__wakeup',
- '__toString',
- '__call',
- );
- /**
- * Reflects provided arguments into class node.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return Node\ClassNode
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function reflect(ReflectionClass $class = null, array $interfaces)
- {
- $node = new Node\ClassNode;
- if (null !== $class) {
- if (true === $class->isInterface()) {
- throw new InvalidArgumentException(sprintf(
- "Could not reflect %s as a class, because it\n".
- "is interface - use the second argument instead.",
- $class->getName()
- ));
- }
- $this->reflectClassToNode($class, $node);
- }
- foreach ($interfaces as $interface) {
- if (!$interface instanceof ReflectionClass) {
- throw new InvalidArgumentException(sprintf(
- "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
- "a second argument to `ClassMirror::reflect(...)`, but got %s.",
- is_object($interface) ? get_class($interface).' class' : gettype($interface)
- ));
- }
- if (false === $interface->isInterface()) {
- throw new InvalidArgumentException(sprintf(
- "Could not reflect %s as an interface, because it\n".
- "is class - use the first argument instead.",
- $interface->getName()
- ));
- }
- $this->reflectInterfaceToNode($interface, $node);
- }
- $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface');
- return $node;
- }
- private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node)
- {
- if (true === $class->isFinal()) {
- throw new ClassMirrorException(sprintf(
- 'Could not reflect class %s as it is marked final.', $class->getName()
- ), $class);
- }
- $node->setParentClass($class->getName());
- foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
- if (false === $method->isProtected()) {
- continue;
- }
- $this->reflectMethodToNode($method, $node);
- }
- foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
- if (0 === strpos($method->getName(), '_')
- && !in_array($method->getName(), self::$reflectableMethods)) {
- continue;
- }
- if (true === $method->isFinal()) {
- continue;
- }
- $this->reflectMethodToNode($method, $node);
- }
- }
- private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node)
- {
- $node->addInterface($interface->getName());
- foreach ($interface->getMethods() as $method) {
- $this->reflectMethodToNode($method, $node);
- }
- }
- private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode)
- {
- $node = new Node\MethodNode($method->getName());
- if (true === $method->isProtected()) {
- $node->setVisibility('protected');
- }
- if (true === $method->isStatic()) {
- $node->setStatic();
- }
- if (true === $method->returnsReference()) {
- $node->setReturnsReference();
- }
- if (is_array($params = $method->getParameters()) && count($params)) {
- foreach ($params as $param) {
- $this->reflectArgumentToNode($param, $node);
- }
- }
- $classNode->addMethod($node);
- }
- private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode)
- {
- $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName();
- $node = new Node\ArgumentNode($name);
- $typeHint = $this->getTypeHint($parameter);
- $node->setTypeHint($typeHint);
- if (true === $parameter->isDefaultValueAvailable()) {
- $node->setDefault($parameter->getDefaultValue());
- } elseif (true === $parameter->isOptional()
- || (true === $parameter->allowsNull() && $typeHint)) {
- $node->setDefault(null);
- }
- if (true === $parameter->isPassedByReference()) {
- $node->setAsPassedByReference();
- }
- $methodNode->addArgument($node);
- }
- private function getTypeHint(ReflectionParameter $parameter)
- {
- if (null !== $className = $this->getParameterClassName($parameter)) {
- return $className;
- }
- if (true === $parameter->isArray()) {
- return 'array';
- }
- if (version_compare(PHP_VERSION, '5.4', '>=') && true === $parameter->isCallable()) {
- return 'callable';
- }
- return null;
- }
- private function getParameterClassName(ReflectionParameter $parameter)
- {
- try {
- return $parameter->getClass() ? $parameter->getClass()->getName() : null;
- } catch (\ReflectionException $e) {
- preg_match('/\[\s\<\w+?>\s([\w,\\\]+)/s', $parameter, $matches);
- return isset($matches[1]) ? $matches[1] : null;
- }
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- /**
- * Argument node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ArgumentNode
- {
- private $name;
- private $typeHint;
- private $default;
- private $optional = false;
- private $byReference = false;
- /**
- * @param string $name
- */
- public function __construct($name)
- {
- $this->name = $name;
- }
- public function getName()
- {
- return $this->name;
- }
- public function getTypeHint()
- {
- return $this->typeHint;
- }
- public function setTypeHint($typeHint = null)
- {
- $this->typeHint = $typeHint;
- }
- public function getDefault()
- {
- return $this->default;
- }
- public function setDefault($default = null)
- {
- $this->optional = true;
- $this->default = $default;
- }
- public function isOptional()
- {
- return $this->optional;
- }
- public function setAsPassedByReference($byReference = true)
- {
- $this->byReference = $byReference;
- }
- public function isPassedByReference()
- {
- return $this->byReference;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Method node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class MethodNode
- {
- private $name;
- private $code;
- private $visibility = 'public';
- private $static = false;
- private $returnsReference = false;
- /**
- * @var ArgumentNode[]
- */
- private $arguments = array();
- /**
- * @param string $name
- * @param string $code
- */
- public function __construct($name, $code = null)
- {
- $this->name = $name;
- $this->code = $code;
- }
- public function getVisibility()
- {
- return $this->visibility;
- }
- /**
- * @param string $visibility
- */
- public function setVisibility($visibility)
- {
- $visibility = strtolower($visibility);
- if (!in_array($visibility, array('public', 'private', 'protected'))) {
- throw new InvalidArgumentException(sprintf(
- '`%s` method visibility is not supported.', $visibility
- ));
- }
- $this->visibility = $visibility;
- }
- public function isStatic()
- {
- return $this->static;
- }
- public function setStatic($static = true)
- {
- $this->static = (bool) $static;
- }
- public function returnsReference()
- {
- return $this->returnsReference;
- }
- public function setReturnsReference()
- {
- $this->returnsReference = true;
- }
- public function getName()
- {
- return $this->name;
- }
- public function addArgument(ArgumentNode $argument)
- {
- $this->arguments[] = $argument;
- }
- /**
- * @return ArgumentNode[]
- */
- public function getArguments()
- {
- return $this->arguments;
- }
- /**
- * @param string $code
- */
- public function setCode($code)
- {
- $this->code = $code;
- }
- public function getCode()
- {
- if ($this->returnsReference)
- {
- return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');";
- }
- return (string) $this->code;
- }
- public function useParentCode()
- {
- $this->code = sprintf(
- 'return parent::%s(%s);', $this->getName(), implode(', ',
- array_map(function (ArgumentNode $arg) { return '$'.$arg->getName(); }, $this->arguments)
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Class node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassNode
- {
- private $parentClass = 'stdClass';
- private $interfaces = array();
- private $properties = array();
- /**
- * @var MethodNode[]
- */
- private $methods = array();
- public function getParentClass()
- {
- return $this->parentClass;
- }
- /**
- * @param string $class
- */
- public function setParentClass($class)
- {
- $this->parentClass = $class ?: 'stdClass';
- }
- /**
- * @return string[]
- */
- public function getInterfaces()
- {
- return $this->interfaces;
- }
- /**
- * @param string $interface
- */
- public function addInterface($interface)
- {
- if ($this->hasInterface($interface)) {
- return;
- }
- array_unshift($this->interfaces, $interface);
- }
- /**
- * @param string $interface
- *
- * @return bool
- */
- public function hasInterface($interface)
- {
- return in_array($interface, $this->interfaces);
- }
- public function getProperties()
- {
- return $this->properties;
- }
- public function addProperty($name, $visibility = 'public')
- {
- $visibility = strtolower($visibility);
- if (!in_array($visibility, array('public', 'private', 'protected'))) {
- throw new InvalidArgumentException(sprintf(
- '`%s` property visibility is not supported.', $visibility
- ));
- }
- $this->properties[$name] = $visibility;
- }
- /**
- * @return MethodNode[]
- */
- public function getMethods()
- {
- return $this->methods;
- }
- public function addMethod(MethodNode $method)
- {
- $this->methods[$method->getName()] = $method;
- }
- public function removeMethod($name)
- {
- unset($this->methods[$name]);
- }
- /**
- * @param string $name
- *
- * @return MethodNode|null
- */
- public function getMethod($name)
- {
- return $this->hasMethod($name) ? $this->methods[$name] : null;
- }
- /**
- * @param string $name
- *
- * @return bool
- */
- public function hasMethod($name)
- {
- return isset($this->methods[$name]);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use Prophecy\Exception\Doubler\DoubleException;
- use Prophecy\Exception\Doubler\ClassNotFoundException;
- use Prophecy\Exception\Doubler\InterfaceNotFoundException;
- use ReflectionClass;
- /**
- * Lazy double.
- * Gives simple interface to describe double before creating it.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class LazyDouble
- {
- private $doubler;
- private $class;
- private $interfaces = array();
- private $arguments = null;
- private $double;
- /**
- * Initializes lazy double.
- *
- * @param Doubler $doubler
- */
- public function __construct(Doubler $doubler)
- {
- $this->doubler = $doubler;
- }
- /**
- * Tells doubler to use specific class as parent one for double.
- *
- * @param string|ReflectionClass $class
- *
- * @throws \Prophecy\Exception\Doubler\ClassNotFoundException
- * @throws \Prophecy\Exception\Doubler\DoubleException
- */
- public function setParentClass($class)
- {
- if (null !== $this->double) {
- throw new DoubleException('Can not extend class with already instantiated double.');
- }
- if (!$class instanceof ReflectionClass) {
- if (!class_exists($class)) {
- throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class);
- }
- $class = new ReflectionClass($class);
- }
- $this->class = $class;
- }
- /**
- * Tells doubler to implement specific interface with double.
- *
- * @param string|ReflectionClass $interface
- *
- * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException
- * @throws \Prophecy\Exception\Doubler\DoubleException
- */
- public function addInterface($interface)
- {
- if (null !== $this->double) {
- throw new DoubleException(
- 'Can not implement interface with already instantiated double.'
- );
- }
- if (!$interface instanceof ReflectionClass) {
- if (!interface_exists($interface)) {
- throw new InterfaceNotFoundException(
- sprintf('Interface %s not found.', $interface),
- $interface
- );
- }
- $interface = new ReflectionClass($interface);
- }
- $this->interfaces[] = $interface;
- }
- /**
- * Sets constructor arguments.
- *
- * @param array $arguments
- */
- public function setArguments(array $arguments = null)
- {
- $this->arguments = $arguments;
- }
- /**
- * Creates double instance or returns already created one.
- *
- * @return DoubleInterface
- */
- public function getInstance()
- {
- if (null === $this->double) {
- if (null !== $this->arguments) {
- return $this->double = $this->doubler->double(
- $this->class, $this->interfaces, $this->arguments
- );
- }
- $this->double = $this->doubler->double($this->class, $this->interfaces);
- }
- return $this->double;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Remove method functionality from the double which will clash with php keywords.
- *
- * @author Milan Magudia <milan@magudia.com>
- */
- class KeywordPatch implements ClassPatchInterface
- {
- /**
- * Support any class
- *
- * @param ClassNode $node
- *
- * @return boolean
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Remove methods that clash with php keywords
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $methodNames = array_keys($node->getMethods());
- $methodsToRemove = array_intersect($methodNames, $this->getKeywords());
- foreach ($methodsToRemove as $methodName) {
- $node->removeMethod($methodName);
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority() {
- return 49;
- }
- /**
- * Returns array of php keywords.
- *
- * @return array
- */
- private function getKeywords() {
- return array(
- '__halt_compiler',
- 'abstract',
- 'and',
- 'array',
- 'as',
- 'break',
- 'callable',
- 'case',
- 'catch',
- 'class',
- 'clone',
- 'const',
- 'continue',
- 'declare',
- 'default',
- 'die',
- 'do',
- 'echo',
- 'else',
- 'elseif',
- 'empty',
- 'enddeclare',
- 'endfor',
- 'endforeach',
- 'endif',
- 'endswitch',
- 'endwhile',
- 'eval',
- 'exit',
- 'extends',
- 'final',
- 'finally',
- 'for',
- 'foreach',
- 'function',
- 'global',
- 'goto',
- 'if',
- 'implements',
- 'include',
- 'include_once',
- 'instanceof',
- 'insteadof',
- 'interface',
- 'isset',
- 'list',
- 'namespace',
- 'new',
- 'or',
- 'print',
- 'private',
- 'protected',
- 'public',
- 'require',
- 'require_once',
- 'return',
- 'static',
- 'switch',
- 'throw',
- 'trait',
- 'try',
- 'unset',
- 'use',
- 'var',
- 'while',
- 'xor',
- 'yield',
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- use Prophecy\Doubler\Generator\Node\ArgumentNode;
- /**
- * Add Prophecy functionality to the double.
- * This is a core class patch for Prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ProphecySubjectPatch implements ClassPatchInterface
- {
- /**
- * Always returns true.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Apply Prophecy functionality to class node.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface');
- $node->addProperty('objectProphecy', 'private');
- foreach ($node->getMethods() as $name => $method) {
- if ('__construct' === strtolower($name)) {
- continue;
- }
- $method->setCode(
- 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
- );
- }
- $prophecySetter = new MethodNode('setProphecy');
- $prophecyArgument = new ArgumentNode('prophecy');
- $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface');
- $prophecySetter->addArgument($prophecyArgument);
- $prophecySetter->setCode('$this->objectProphecy = $prophecy;');
- $prophecyGetter = new MethodNode('getProphecy');
- $prophecyGetter->setCode('return $this->objectProphecy;');
- if ($node->hasMethod('__call')) {
- $__call = $node->getMethod('__call');
- } else {
- $__call = new MethodNode('__call');
- $__call->addArgument(new ArgumentNode('name'));
- $__call->addArgument(new ArgumentNode('arguments'));
- $node->addMethod($__call);
- }
- $__call->setCode(<<<PHP
- throw new \Prophecy\Exception\Doubler\MethodNotFoundException(
- sprintf('Method `%s::%s()` not found.', get_class(\$this), func_get_arg(0)),
- \$this->getProphecy(), func_get_arg(0)
- );
- PHP
- );
- $node->addMethod($prophecySetter);
- $node->addMethod($prophecyGetter);
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 0;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use phpDocumentor\Reflection\DocBlock;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Discover Magical API using "@method" PHPDoc format.
- *
- * @author Thomas Tourlourat <thomas@tourlourat.com>
- */
- class MagicCallPatch implements ClassPatchInterface
- {
- /**
- * Support any class
- *
- * @param ClassNode $node
- *
- * @return boolean
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Discover Magical API
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $parentClass = $node->getParentClass();
- $reflectionClass = new \ReflectionClass($parentClass);
- $phpdoc = new DocBlock($reflectionClass->getDocComment());
- $tagList = $phpdoc->getTagsByName('method');
- foreach($tagList as $tag) {
- $methodName = $tag->getMethodName();
- if (!$reflectionClass->hasMethod($methodName)) {
- $methodNode = new MethodNode($tag->getMethodName());
- $methodNode->setStatic($tag->isStatic());
- $node->addMethod($methodNode);
- }
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return integer Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Traversable interface patch.
- * Forces classes that implement interfaces, that extend Traversable to also implement Iterator.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class TraversablePatch implements ClassPatchInterface
- {
- /**
- * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (in_array('Iterator', $node->getInterfaces())) {
- return false;
- }
- if (in_array('IteratorAggregate', $node->getInterfaces())) {
- return false;
- }
- foreach ($node->getInterfaces() as $interface) {
- if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) {
- continue;
- }
- if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) {
- continue;
- }
- if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) {
- continue;
- }
- return true;
- }
- return false;
- }
- /**
- * Forces class to implement Iterator interface.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $node->addInterface('Iterator');
- $node->addMethod(new MethodNode('current'));
- $node->addMethod(new MethodNode('key'));
- $node->addMethod(new MethodNode('next'));
- $node->addMethod(new MethodNode('rewind'));
- $node->addMethod(new MethodNode('valid'));
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 100;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * SplFileInfo patch.
- * Makes SplFileInfo and derivative classes usable with Prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class SplFileInfoPatch implements ClassPatchInterface
- {
- /**
- * Supports everything that extends SplFileInfo.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (null === $node->getParentClass()) {
- return false;
- }
- return 'SplFileInfo' === $node->getParentClass()
- || is_subclass_of($node->getParentClass(), 'SplFileInfo')
- ;
- }
- /**
- * Updated constructor code to call parent one with dummy file argument.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- if ($node->hasMethod('__construct')) {
- $constructor = $node->getMethod('__construct');
- } else {
- $constructor = new MethodNode('__construct');
- $node->addMethod($constructor);
- }
- if ($this->nodeIsDirectoryIterator($node)) {
- $constructor->setCode('return parent::__construct("' . __DIR__ . '");');
- return;
- }
- $constructor->useParentCode();
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- /**
- * @param ClassNode $node
- * @return boolean
- */
- private function nodeIsDirectoryIterator(ClassNode $node)
- {
- $parent = $node->getParentClass();
- return 'DirectoryIterator' === $parent
- || is_subclass_of($parent, 'DirectoryIterator');
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Disable constructor.
- * Makes all constructor arguments optional.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class DisableConstructorPatch implements ClassPatchInterface
- {
- /**
- * Checks if class has `__construct` method.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Makes all class constructor arguments optional.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- if (!$node->hasMethod('__construct')) {
- $node->addMethod(new MethodNode('__construct', ''));
- return;
- }
- $constructor = $node->getMethod('__construct');
- foreach ($constructor->getArguments() as $argument) {
- $argument->setDefault(null);
- }
- $constructor->setCode(<<<PHP
- if (0 < func_num_args()) {
- call_user_func_array(array('parent', '__construct'), func_get_args());
- }
- PHP
- );
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 100;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Exception patch for HHVM to remove the stubs from special methods
- *
- * @author Christophe Coevoet <stof@notk.org>
- */
- class HhvmExceptionPatch implements ClassPatchInterface
- {
- /**
- * Supports exceptions on HHVM.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (!defined('HHVM_VERSION')) {
- return false;
- }
- return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception');
- }
- /**
- * Removes special exception static methods from the doubled methods.
- *
- * @param ClassNode $node
- *
- * @return void
- */
- public function apply(ClassNode $node)
- {
- if ($node->hasMethod('setTraceOptions')) {
- $node->getMethod('setTraceOptions')->useParentCode();
- }
- if ($node->hasMethod('getTraceOptions')) {
- $node->getMethod('getTraceOptions')->useParentCode();
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getPriority()
- {
- return -50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * ReflectionClass::newInstance patch.
- * Makes first argument of newInstance optional, since it works but signature is misleading
- *
- * @author Florian Klein <florian.klein@free.fr>
- */
- class ReflectionClassNewInstancePatch implements ClassPatchInterface
- {
- /**
- * Supports ReflectionClass
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return 'ReflectionClass' === $node->getParentClass();
- }
- /**
- * Updates newInstance's first argument to make it optional
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- foreach ($node->getMethod('newInstance')->getArguments() as $argument) {
- $argument->setDefault(null);
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher = earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Class patch interface.
- * Class patches extend doubles functionality or help
- * Prophecy to avoid some internal PHP bugs.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ClassPatchInterface
- {
- /**
- * Checks if patch supports specific class node.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node);
- /**
- * Applies patch to the specific class node.
- *
- * @param ClassNode $node
- * @return void
- */
- public function apply(ClassNode $node);
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use ReflectionClass;
- /**
- * Name generator.
- * Generates classname for double.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class NameGenerator
- {
- private static $counter = 1;
- /**
- * Generates name.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- public function name(ReflectionClass $class = null, array $interfaces)
- {
- $parts = array();
- if (null !== $class) {
- $parts[] = $class->getName();
- } else {
- foreach ($interfaces as $interface) {
- $parts[] = $interface->getShortName();
- }
- }
- if (!count($parts)) {
- $parts[] = 'stdClass';
- }
- return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Argument\Token\AnyValuesToken;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\UnexpectedCallsCountException;
- /**
- * Prediction interface.
- * Predictions are logical test blocks, tied to `should...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallTimesPrediction implements PredictionInterface
- {
- private $times;
- private $util;
- /**
- * Initializes prediction.
- *
- * @param int $times
- * @param StringUtil $util
- */
- public function __construct($times, StringUtil $util = null)
- {
- $this->times = intval($times);
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there was exact amount of calls made.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if ($this->times == count($calls)) {
- return;
- }
- $methodCalls = $object->findProphecyMethodCalls(
- $method->getMethodName(),
- new ArgumentsWildcard(array(new AnyValuesToken))
- );
- if (count($calls)) {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but %d were made:\n%s",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- count($calls),
- $this->util->stringifyCalls($calls)
- );
- } elseif (count($methodCalls)) {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but none were made.\n".
- "Recorded `%s(...)` calls:\n%s",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- $method->getMethodName(),
- $this->util->stringifyCalls($methodCalls)
- );
- } else {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but none were made.",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard()
- );
- }
- throw new UnexpectedCallsCountException($message, $method, $this->times, $calls);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\UnexpectedCallsException;
- /**
- * No calls prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class NoCallsPrediction implements PredictionInterface
- {
- private $util;
- /**
- * Initializes prediction.
- *
- * @param null|StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there were no calls made.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if (!count($calls)) {
- return;
- }
- $verb = count($calls) === 1 ? 'was' : 'were';
- throw new UnexpectedCallsException(sprintf(
- "No calls expected that match:\n".
- " %s->%s(%s)\n".
- "but %d %s made:\n%s",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- count($calls),
- $verb,
- $this->util->stringifyCalls($calls)
- ), $method, $calls);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Prediction interface.
- * Predictions are logical test blocks, tied to `should...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface PredictionInterface
- {
- /**
- * Tests that double fulfilled prediction.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws object
- * @return void
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use Closure;
- /**
- * Callback prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackPrediction implements PredictionInterface
- {
- private $callback;
- /**
- * Initializes callback prediction.
- *
- * @param callable $callback Custom callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackPrediction, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Executes preset callback.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- $callback = $this->callback;
- if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
- $callback = Closure::bind($callback, $object);
- }
- call_user_func($callback, $calls, $object, $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Argument\Token\AnyValuesToken;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\NoCallsException;
- /**
- * Call prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallPrediction implements PredictionInterface
- {
- private $util;
- /**
- * Initializes prediction.
- *
- * @param StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there was at least one call.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\NoCallsException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if (count($calls)) {
- return;
- }
- $methodCalls = $object->findProphecyMethodCalls(
- $method->getMethodName(),
- new ArgumentsWildcard(array(new AnyValuesToken))
- );
- if (count($methodCalls)) {
- throw new NoCallsException(sprintf(
- "No calls have been made that match:\n".
- " %s->%s(%s)\n".
- "but expected at least one.\n".
- "Recorded `%s(...)` calls:\n%s",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- $method->getMethodName(),
- $this->util->stringifyCalls($methodCalls)
- ), $method);
- }
- throw new NoCallsException(sprintf(
- "No calls have been made that match:\n".
- " %s->%s(%s)\n".
- "but expected at least one.",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard()
- ), $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Call;
- use Exception;
- /**
- * Call object.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Call
- {
- private $methodName;
- private $arguments;
- private $returnValue;
- private $exception;
- private $file;
- private $line;
- /**
- * Initializes call.
- *
- * @param string $methodName
- * @param array $arguments
- * @param mixed $returnValue
- * @param Exception $exception
- * @param null|string $file
- * @param null|int $line
- */
- public function __construct($methodName, array $arguments, $returnValue,
- Exception $exception = null, $file, $line)
- {
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- $this->returnValue = $returnValue;
- $this->exception = $exception;
- if ($file) {
- $this->file = $file;
- $this->line = intval($line);
- }
- }
- /**
- * Returns called method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->methodName;
- }
- /**
- * Returns called method arguments.
- *
- * @return array
- */
- public function getArguments()
- {
- return $this->arguments;
- }
- /**
- * Returns called method return value.
- *
- * @return null|mixed
- */
- public function getReturnValue()
- {
- return $this->returnValue;
- }
- /**
- * Returns exception that call thrown.
- *
- * @return null|Exception
- */
- public function getException()
- {
- return $this->exception;
- }
- /**
- * Returns callee filename.
- *
- * @return string
- */
- public function getFile()
- {
- return $this->file;
- }
- /**
- * Returns callee line number.
- *
- * @return int
- */
- public function getLine()
- {
- return $this->line;
- }
- /**
- * Returns short notation for callee place.
- *
- * @return string
- */
- public function getCallPlace()
- {
- if (null === $this->file) {
- return 'unknown';
- }
- return sprintf('%s:%d', $this->file, $this->line);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Call;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Call\UnexpectedCallException;
- /**
- * Calls receiver & manager.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallCenter
- {
- private $util;
- /**
- * @var Call[]
- */
- private $recordedCalls = array();
- /**
- * Initializes call center.
- *
- * @param StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Makes and records specific method call for object prophecy.
- *
- * @param ObjectProphecy $prophecy
- * @param string $methodName
- * @param array $arguments
- *
- * @return mixed Returns null if no promise for prophecy found or promise return value.
- *
- * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found
- */
- public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments)
- {
- $backtrace = debug_backtrace();
- $file = $line = null;
- if (isset($backtrace[2]) && isset($backtrace[2]['file'])) {
- $file = $backtrace[2]['file'];
- $line = $backtrace[2]['line'];
- }
- // If no method prophecies defined, then it's a dummy, so we'll just return null
- if ('__destruct' === $methodName || 0 == count($prophecy->getMethodProphecies())) {
- $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
- return null;
- }
- // There are method prophecies, so it's a fake/stub. Searching prophecy for this call
- $matches = array();
- foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
- if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
- $matches[] = array($score, $methodProphecy);
- }
- }
- // If fake/stub doesn't have method prophecy for this call - throw exception
- if (!count($matches)) {
- throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments);
- }
- // Sort matches by their score value
- @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
- // If Highest rated method prophecy has a promise - execute it or return null instead
- $returnValue = null;
- $exception = null;
- if ($promise = $matches[0][1]->getPromise()) {
- try {
- $returnValue = $promise->execute($arguments, $prophecy, $matches[0][1]);
- } catch (\Exception $e) {
- $exception = $e;
- }
- }
- $this->recordedCalls[] = new Call(
- $methodName, $arguments, $returnValue, $exception, $file, $line
- );
- if (null !== $exception) {
- throw $exception;
- }
- return $returnValue;
- }
- /**
- * Searches for calls by method name & arguments wildcard.
- *
- * @param string $methodName
- * @param ArgumentsWildcard $wildcard
- *
- * @return Call[]
- */
- public function findCalls($methodName, ArgumentsWildcard $wildcard)
- {
- return array_values(
- array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
- return $methodName === $call->getMethodName()
- && 0 < $wildcard->scoreArguments($call->getArguments())
- ;
- })
- );
- }
- private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName,
- array $arguments)
- {
- $classname = get_class($prophecy->reveal());
- $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments));
- $expected = implode("\n", array_map(function (MethodProphecy $methodProphecy) {
- return sprintf(' - %s(%s)',
- $methodProphecy->getMethodName(),
- $methodProphecy->getArgumentsWildcard()
- );
- }, call_user_func_array('array_merge', $prophecy->getMethodProphecies())));
- return new UnexpectedCallException(
- sprintf(
- "Method call:\n".
- " - %s(%s)\n".
- "on %s was not expected, expected calls were:\n%s",
- $methodName, $argstring, $classname, $expected
- ),
- $prophecy, $methodName, $arguments
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Doctrine\Instantiator\Instantiator;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use ReflectionClass;
- /**
- * Throw promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ThrowPromise implements PromiseInterface
- {
- private $exception;
- /**
- * @var \Doctrine\Instantiator\Instantiator
- */
- private $instantiator;
- /**
- * Initializes promise.
- *
- * @param string|\Exception $exception Exception class name or instance
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($exception)
- {
- if (is_string($exception)) {
- if (!class_exists($exception)
- && 'Exception' !== $exception
- && !is_subclass_of($exception, 'Exception')) {
- throw new InvalidArgumentException(sprintf(
- 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
- gettype($exception)
- ));
- }
- } elseif (!$exception instanceof \Exception) {
- throw new InvalidArgumentException(sprintf(
- 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
- gettype($exception)
- ));
- }
- $this->exception = $exception;
- }
- /**
- * Throws predefined exception.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws object
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- if (is_string($this->exception)) {
- $classname = $this->exception;
- $reflection = new ReflectionClass($classname);
- $constructor = $reflection->getConstructor();
- if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) {
- throw $reflection->newInstance();
- }
- if (!$this->instantiator) {
- $this->instantiator = new Instantiator();
- }
- throw $this->instantiator->instantiate($classname);
- }
- throw $this->exception;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Return argument promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ReturnArgumentPromise implements PromiseInterface
- {
- /**
- * @var int
- */
- private $index;
- /**
- * Initializes callback promise.
- *
- * @param int $index The zero-indexed number of the argument to return
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($index = 0)
- {
- if (!is_int($index) || $index < 0) {
- throw new InvalidArgumentException(
- 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.',
- $index
- );
- }
- $this->index = $index;
- }
- /**
- * Returns nth argument if has one, null otherwise.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return null|mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- return count($args) > $this->index ? $args[$this->index] : null;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Return promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ReturnPromise implements PromiseInterface
- {
- private $returnValues = array();
- /**
- * Initializes promise.
- *
- * @param array $returnValues Array of values
- */
- public function __construct(array $returnValues)
- {
- $this->returnValues = $returnValues;
- }
- /**
- * Returns saved values one by one until last one, then continuously returns last value.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- $value = array_shift($this->returnValues);
- if (!count($this->returnValues)) {
- $this->returnValues[] = $value;
- }
- return $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use Closure;
- /**
- * Callback promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackPromise implements PromiseInterface
- {
- private $callback;
- /**
- * Initializes callback promise.
- *
- * @param callable $callback Custom callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackPromise, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Evaluates promise callback.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- $callback = $this->callback;
- if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
- $callback = Closure::bind($callback, $object);
- }
- return call_user_func($callback, $args, $object, $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Promise interface.
- * Promises are logical blocks, tied to `will...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface PromiseInterface
- {
- /**
- * Evaluates promise.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument;
- /**
- * Arguments wildcarding.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ArgumentsWildcard
- {
- /**
- * @var Token\TokenInterface[]
- */
- private $tokens = array();
- private $string;
- /**
- * Initializes wildcard.
- *
- * @param array $arguments Array of argument tokens or values
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- if (!$argument instanceof Token\TokenInterface) {
- $argument = new Token\ExactValueToken($argument);
- }
- $this->tokens[] = $argument;
- }
- }
- /**
- * Calculates wildcard match score for provided arguments.
- *
- * @param array $arguments
- *
- * @return false|int False OR integer score (higher - better)
- */
- public function scoreArguments(array $arguments)
- {
- if (0 == count($arguments) && 0 == count($this->tokens)) {
- return 1;
- }
- $arguments = array_values($arguments);
- $totalScore = 0;
- foreach ($this->tokens as $i => $token) {
- $argument = isset($arguments[$i]) ? $arguments[$i] : null;
- if (1 >= $score = $token->scoreArgument($argument)) {
- return false;
- }
- $totalScore += $score;
- if (true === $token->isLast()) {
- return $totalScore;
- }
- }
- if (count($arguments) > count($this->tokens)) {
- return false;
- }
- return $totalScore;
- }
- /**
- * Returns string representation for wildcard.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = implode(', ', array_map(function ($token) {
- return (string) $token;
- }, $this->tokens));
- }
- return $this->string;
- }
- /**
- * @return array
- */
- public function getTokens()
- {
- return $this->tokens;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Any single value token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class AnyValueToken implements TokenInterface
- {
- /**
- * Always scores 3 for any argument.
- *
- * @param $argument
- *
- * @return int
- */
- public function scoreArgument($argument)
- {
- return 3;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return '*';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Array every entry token.
- *
- * @author Adrien Brault <adrien.brault@gmail.com>
- */
- class ArrayEveryEntryToken implements TokenInterface
- {
- /**
- * @var TokenInterface
- */
- private $value;
- /**
- * @param mixed $value exact value or token
- */
- public function __construct($value)
- {
- if (!$value instanceof TokenInterface) {
- $value = new ExactValueToken($value);
- }
- $this->value = $value;
- }
- /**
- * {@inheritdoc}
- */
- public function scoreArgument($argument)
- {
- if (!$argument instanceof \Traversable && !is_array($argument)) {
- return false;
- }
- $scores = array();
- foreach ($argument as $key => $argumentEntry) {
- $scores[] = $this->value->scoreArgument($argumentEntry);
- }
- if (empty($scores) || in_array(false, $scores, true)) {
- return false;
- }
- return array_sum($scores) / count($scores);
- }
- /**
- * {@inheritdoc}
- */
- public function isLast()
- {
- return false;
- }
- /**
- * {@inheritdoc}
- */
- public function __toString()
- {
- return sprintf('[%s, ..., %s]', $this->value, $this->value);
- }
- /**
- * @return TokenInterface
- */
- public function getValue()
- {
- return $this->value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Logical AND token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class LogicalAndToken implements TokenInterface
- {
- private $tokens = array();
- /**
- * @param array $arguments exact values or tokens
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- if (!$argument instanceof TokenInterface) {
- $argument = new ExactValueToken($argument);
- }
- $this->tokens[] = $argument;
- }
- }
- /**
- * Scores maximum score from scores returned by tokens for this argument if all of them score.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (0 === count($this->tokens)) {
- return false;
- }
- $maxScore = 0;
- foreach ($this->tokens as $token) {
- $score = $token->scoreArgument($argument);
- if (false === $score) {
- return false;
- }
- $maxScore = max($score, $maxScore);
- }
- return $maxScore;
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('bool(%s)', implode(' AND ', $this->tokens));
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Argument token interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface TokenInterface
- {
- /**
- * Calculates token match score for provided argument.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument);
- /**
- * Returns true if this token prevents check of other tokens (is last one).
- *
- * @return bool|int
- */
- public function isLast();
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Array entry token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class ArrayEntryToken implements TokenInterface
- {
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $key;
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $value;
- /**
- * @param mixed $key exact value or token
- * @param mixed $value exact value or token
- */
- public function __construct($key, $value)
- {
- $this->key = $this->wrapIntoExactValueToken($key);
- $this->value = $this->wrapIntoExactValueToken($value);
- }
- /**
- * Scores half of combined scores from key and value tokens for same entry. Capped at 8.
- * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken.
- *
- * @param array|\ArrayAccess|\Traversable $argument
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if ($argument instanceof \Traversable) {
- $argument = iterator_to_array($argument);
- }
- if ($argument instanceof \ArrayAccess) {
- $argument = $this->convertArrayAccessToEntry($argument);
- }
- if (!is_array($argument) || empty($argument)) {
- return false;
- }
- $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument));
- $valueScores = array_map(array($this->value,'scoreArgument'), $argument);
- $scoreEntry = function ($value, $key) {
- return $value && $key ? min(8, ($key + $value) / 2) : false;
- };
- return max(array_map($scoreEntry, $valueScores, $keyScores));
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('[..., %s => %s, ...]', $this->key, $this->value);
- }
- /**
- * Returns key
- *
- * @return TokenInterface
- */
- public function getKey()
- {
- return $this->key;
- }
- /**
- * Returns value
- *
- * @return TokenInterface
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Wraps non token $value into ExactValueToken
- *
- * @param $value
- * @return TokenInterface
- */
- private function wrapIntoExactValueToken($value)
- {
- return $value instanceof TokenInterface ? $value : new ExactValueToken($value);
- }
- /**
- * Converts instance of \ArrayAccess to key => value array entry
- *
- * @param \ArrayAccess $object
- *
- * @return array|null
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- private function convertArrayAccessToEntry(\ArrayAccess $object)
- {
- if (!$this->key instanceof ExactValueToken) {
- throw new InvalidArgumentException(sprintf(
- 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
- 'But you used `%s`.',
- $this->key
- ));
- }
- $key = $this->key->getValue();
- return $object->offsetExists($key) ? array($key => $object[$key]) : array();
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Array elements count token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class ArrayCountToken implements TokenInterface
- {
- private $count;
- /**
- * @param integer $value
- */
- public function __construct($value)
- {
- $this->count = $value;
- }
- /**
- * Scores 6 when argument has preset number of elements.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false;
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('count(%s)', $this->count);
- }
- /**
- * Returns true if object is either array or instance of \Countable
- *
- * @param $argument
- * @return bool
- */
- private function isCountable($argument)
- {
- return (is_array($argument) || $argument instanceof \Countable);
- }
- /**
- * Returns true if $argument has expected number of elements
- *
- * @param array|\Countable $argument
- *
- * @return bool
- */
- private function hasProperCount($argument)
- {
- return $this->count === count($argument);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Any values token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class AnyValuesToken implements TokenInterface
- {
- /**
- * Always scores 2 for any argument.
- *
- * @param $argument
- *
- * @return int
- */
- public function scoreArgument($argument)
- {
- return 2;
- }
- /**
- * Returns true to stop wildcard from processing other tokens.
- *
- * @return bool
- */
- public function isLast()
- {
- return true;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return '* [, ...]';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * String contains token.
- *
- * @author Peter Mitchell <pete@peterjmit.com>
- */
- class StringContainsToken implements TokenInterface
- {
- private $value;
- /**
- * Initializes token.
- *
- * @param string $value
- */
- public function __construct($value)
- {
- $this->value = $value;
- }
- public function scoreArgument($argument)
- {
- return strpos($argument, $this->value) !== false ? 6 : false;
- }
- /**
- * Returns preset value against which token checks arguments.
- *
- * @return mixed
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('contains("%s")', $this->value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Util\StringUtil;
- /**
- * Exact value token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ExactValueToken implements TokenInterface
- {
- private $value;
- private $string;
- private $util;
- private $comparatorFactory;
- /**
- * Initializes token.
- *
- * @param mixed $value
- * @param StringUtil $util
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null)
- {
- $this->value = $value;
- $this->util = $util ?: new StringUtil();
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Scores 10 if argument matches preset value.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (is_object($argument) && is_object($this->value)) {
- $comparator = $this->comparatorFactory->getComparatorFor(
- $argument, $this->value
- );
- try {
- $comparator->assertEquals($argument, $this->value);
- return 10;
- } catch (ComparisonFailure $failure) {}
- }
- // If either one is an object it should be castable to a string
- if (is_object($argument) xor is_object($this->value)) {
- if (is_object($argument) && !method_exists($argument, '__toString')) {
- return false;
- }
- if (is_object($this->value) && !method_exists($this->value, '__toString')) {
- return false;
- }
- } elseif (is_numeric($argument) && is_numeric($this->value)) {
- // noop
- } elseif (gettype($argument) !== gettype($this->value)) {
- return false;
- }
- return $argument == $this->value ? 10 : false;
- }
- /**
- * Returns preset value against which token checks arguments.
- *
- * @return mixed
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = sprintf('exact(%s)', $this->util->stringify($this->value));
- }
- return $this->string;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Util\StringUtil;
- /**
- * Object state-checker token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ObjectStateToken implements TokenInterface
- {
- private $name;
- private $value;
- private $util;
- private $comparatorFactory;
- /**
- * Initializes token.
- *
- * @param string $methodName
- * @param mixed $value Expected return value
- * @param null|StringUtil $util
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct(
- $methodName,
- $value,
- StringUtil $util = null,
- ComparatorFactory $comparatorFactory = null
- ) {
- $this->name = $methodName;
- $this->value = $value;
- $this->util = $util ?: new StringUtil;
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Scores 8 if argument is an object, which method returns expected value.
- *
- * @param mixed $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (is_object($argument) && method_exists($argument, $this->name)) {
- $actual = call_user_func(array($argument, $this->name));
- $comparator = $this->comparatorFactory->getComparatorFor(
- $actual, $this->value
- );
- try {
- $comparator->assertEquals($actual, $this->value);
- return 8;
- } catch (ComparisonFailure $failure) {
- return false;
- }
- }
- if (is_object($argument) && property_exists($argument, $this->name)) {
- return $argument->{$this->name} === $this->value ? 8 : false;
- }
- return false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('state(%s(), %s)',
- $this->name,
- $this->util->stringify($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Callback-verified token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackToken implements TokenInterface
- {
- private $callback;
- /**
- * Initializes token.
- *
- * @param callable $callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackToken, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Scores 7 if callback returns true, false otherwise.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return call_user_func($this->callback, $argument) ? 7 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return 'callback()';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Util\StringUtil;
- /**
- * Identical value token.
- *
- * @author Florian Voutzinos <florian@voutzinos.com>
- */
- class IdenticalValueToken implements TokenInterface
- {
- private $value;
- private $string;
- private $util;
- /**
- * Initializes token.
- *
- * @param mixed $value
- * @param StringUtil $util
- */
- public function __construct($value, StringUtil $util = null)
- {
- $this->value = $value;
- $this->util = $util ?: new StringUtil();
- }
- /**
- * Scores 11 if argument matches preset value.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return $argument === $this->value ? 11 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = sprintf('identical(%s)', $this->util->stringify($this->value));
- }
- return $this->string;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Logical NOT token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class LogicalNotToken implements TokenInterface
- {
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $token;
- /**
- * @param mixed $value exact value or token
- */
- public function __construct($value)
- {
- $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value);
- }
- /**
- * Scores 4 when preset token does not match the argument.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return false === $this->token->scoreArgument($argument) ? 4 : false;
- }
- /**
- * Returns true if preset token is last.
- *
- * @return bool|int
- */
- public function isLast()
- {
- return $this->token->isLast();
- }
- /**
- * Returns originating token.
- *
- * @return TokenInterface
- */
- public function getOriginatingToken()
- {
- return $this->token;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('not(%s)', $this->token);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Value type token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class TypeToken implements TokenInterface
- {
- private $type;
- /**
- * @param string $type
- */
- public function __construct($type)
- {
- $checker = "is_{$type}";
- if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) {
- throw new InvalidArgumentException(sprintf(
- 'Type or class name expected as an argument to TypeToken, but got %s.', $type
- ));
- }
- $this->type = $type;
- }
- /**
- * Scores 5 if argument has the same type this token was constructed with.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- $checker = "is_{$this->type}";
- if (function_exists($checker)) {
- return call_user_func($checker, $argument) ? 5 : false;
- }
- return $argument instanceof $this->type ? 5 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('type(%s)', $this->type);
- }
- }
- <?php
- namespace Prophecy\Util;
- use Prophecy\Prophecy\ProphecyInterface;
- use SplObjectStorage;
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exporting utility.
- *
- * This class is derived from the PHPUnit testing framework.
- *
- * @author Sebastiaan Stok <s.stok@rollerscapes.net
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License>
- */
- class ExportUtil
- {
- /**
- * Exports a value into a string.
- *
- * The output of this method is similar to the output of print_r(), but
- * improved in various aspects:
- *
- * - NULL is rendered as "null" (instead of "")
- * - true is rendered as "true" (instead of "1")
- * - FALSE is rendered as "false" (instead of "")
- * - Strings are always quoted with single quotes
- * - Carriage returns and newlines are normalized to \n
- * - Recursion and repeated rendering is treated properly
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- *
- * @return string
- */
- public static function export($value, $indentation = 0)
- {
- return static::recursiveExport($value, $indentation);
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- *
- * @return array
- */
- public static function toArray($object)
- {
- $array = array();
- foreach ((array) $object as $key => $value) {
- // properties are transformed to keys in the following way:
- // private $property => "\0Classname\0property"
- // protected $property => "\0*\0property"
- // public $property => "property"
- if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
- $key = $matches[1];
- }
- $array[$key] = $value;
- }
- // Some internal classes like SplObjectStorage don't work with the
- // above (fast) mechanism nor with reflection
- // Format the output similarly to print_r() in this case
- if ($object instanceof SplObjectStorage) {
- foreach ($object as $key => $value) {
- $array[spl_object_hash($value)] = array(
- 'obj' => $value,
- 'inf' => $object->getInfo(),
- );
- }
- }
- return $array;
- }
- /**
- * Recursive implementation of export.
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- * @param array $processedObjects Contains all objects that were already
- * rendered
- *
- * @return string
- */
- protected static function recursiveExport($value, $indentation, &$processedObjects = array())
- {
- if ($value === null) {
- return 'null';
- }
- if ($value === true) {
- return 'true';
- }
- if ($value === false) {
- return 'false';
- }
- if (is_string($value)) {
- // Match for most non printable chars somewhat taking multibyte chars into account
- if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
- return 'Binary String: 0x' . bin2hex($value);
- }
- return "'" . str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . "'";
- }
- $origValue = $value;
- if (is_object($value)) {
- if ($value instanceof ProphecyInterface) {
- return sprintf('%s Object (*Prophecy*)', get_class($value));
- } elseif (in_array($value, $processedObjects, true)) {
- return sprintf('%s Object (*RECURSION*)', get_class($value));
- }
- $processedObjects[] = $value;
- // Convert object to array
- $value = self::toArray($value);
- }
- if (is_array($value)) {
- $whitespace = str_repeat(' ', $indentation);
- // There seems to be no other way to check arrays for recursion
- // http://www.php.net/manual/en/language.types.array.php#73936
- preg_match_all('/\n \[(\w+)\] => Array\s+\*RECURSION\*/', print_r($value, true), $matches);
- $recursiveKeys = array_unique($matches[1]);
- // Convert to valid array keys
- // Numeric integer strings are automatically converted to integers
- // by PHP
- foreach ($recursiveKeys as $key => $recursiveKey) {
- if ((string) (integer) $recursiveKey === $recursiveKey) {
- $recursiveKeys[$key] = (integer) $recursiveKey;
- }
- }
- $content = '';
- foreach ($value as $key => $val) {
- if (in_array($key, $recursiveKeys, true)) {
- $val = 'Array (*RECURSION*)';
- } else {
- $val = self::recursiveExport($val, $indentation + 1, $processedObjects);
- }
- $content .= $whitespace . ' ' . self::export($key) . ' => ' . $val . "\n";
- }
- if (strlen($content) > 0) {
- $content = "\n" . $content . $whitespace;
- }
- return sprintf(
- "%s (%s)",
- is_object($origValue) ? sprintf('%s:%s', get_class($origValue), spl_object_hash($origValue)) . ' Object' : 'Array', $content
- );
- }
- if (is_double($value) && (double)(integer) $value === $value) {
- return $value . '.0';
- }
- return (string) $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Util;
- use Prophecy\Call\Call;
- /**
- * String utility.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class StringUtil
- {
- /**
- * Stringifies any provided value.
- *
- * @param mixed $value
- * @param boolean $exportObject
- *
- * @return string
- */
- public function stringify($value, $exportObject = true)
- {
- if (is_array($value)) {
- if (range(0, count($value) - 1) === array_keys($value)) {
- return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']';
- }
- $stringify = array($this, __FUNCTION__);
- return '['.implode(', ', array_map(function ($item, $key) use ($stringify) {
- return (is_integer($key) ? $key : '"'.$key.'"').
- ' => '.call_user_func($stringify, $item);
- }, $value, array_keys($value))).']';
- }
- if (is_resource($value)) {
- return get_resource_type($value).':'.$value;
- }
- if (is_object($value)) {
- return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value));
- }
- if (true === $value || false === $value) {
- return $value ? 'true' : 'false';
- }
- if (is_string($value)) {
- $str = sprintf('"%s"', str_replace("\n", '\\n', $value));
- if (50 <= strlen($str)) {
- return substr($str, 0, 50).'"...';
- }
- return $str;
- }
- if (null === $value) {
- return 'null';
- }
- return (string) $value;
- }
- /**
- * Stringifies provided array of calls.
- *
- * @param Call[] $calls Array of Call instances
- *
- * @return string
- */
- public function stringifyCalls(array $calls)
- {
- $self = $this;
- return implode(PHP_EOL, array_map(function (Call $call) use ($self) {
- return sprintf(' - %s(%s) @ %s',
- $call->getMethodName(),
- implode(', ', array_map(array($self, 'stringify'), $call->getArguments())),
- str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace())
- );
- }, $calls));
- }
- }
- Exporter
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Exporter package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Exporter;
- use SebastianBergmann\RecursionContext\Context;
- /**
- * A nifty utility for visualizing PHP variables.
- *
- * <code>
- * <?php
- * use SebastianBergmann\Exporter\Exporter;
- *
- * $exporter = new Exporter;
- * print $exporter->export(new Exception);
- * </code>
- *
- * @package Exporter
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/exporter
- */
- class Exporter
- {
- /**
- * Exports a value as a string
- *
- * The output of this method is similar to the output of print_r(), but
- * improved in various aspects:
- *
- * - NULL is rendered as "null" (instead of "")
- * - TRUE is rendered as "true" (instead of "1")
- * - FALSE is rendered as "false" (instead of "")
- * - Strings are always quoted with single quotes
- * - Carriage returns and newlines are normalized to \n
- * - Recursion and repeated rendering is treated properly
- *
- * @param mixed $value
- * @param integer $indentation The indentation level of the 2nd+ line
- * @return string
- */
- public function export($value, $indentation = 0)
- {
- return $this->recursiveExport($value, $indentation);
- }
- /**
- * @param mixed $data
- * @param Context $context
- * @return string
- */
- public function shortenedRecursiveExport(&$data, Context $context = null)
- {
- $result = array();
- $exporter = new Exporter();
- if (!$context) {
- $context = new Context;
- }
- $context->add($data);
- foreach ($data as $key => $value) {
- if (is_array($value)) {
- if ($context->contains($data[$key]) !== false) {
- $result[] = '*RECURSION*';
- }
- else {
- $result[] = sprintf(
- 'array(%s)',
- $this->shortenedRecursiveExport($data[$key], $context)
- );
- }
- }
- else {
- $result[] = $exporter->shortenedExport($value);
- }
- }
- return join(', ', $result);
- }
- /**
- * Exports a value into a single-line string
- *
- * The output of this method is similar to the output of
- * SebastianBergmann\Exporter\Exporter::export. This method guarantees
- * thought that the result contains now newlines.
- *
- * Newlines are replaced by the visible string '\n'. Contents of arrays
- * and objects (if any) are replaced by '...'.
- *
- * @param mixed $value
- * @return string
- * @see SebastianBergmann\Exporter\Exporter::export
- */
- public function shortenedExport($value)
- {
- if (is_string($value)) {
- $string = $this->export($value);
- if (strlen($string) > 40) {
- $string = substr($string, 0, 30) . '...' . substr($string, -7);
- }
- return str_replace("\n", '\n', $string);
- }
- if (is_object($value)) {
- return sprintf(
- '%s Object (%s)',
- get_class($value),
- count($this->toArray($value)) > 0 ? '...' : ''
- );
- }
- if (is_array($value)) {
- return sprintf(
- 'Array (%s)',
- count($value) > 0 ? '...' : ''
- );
- }
- return $this->export($value);
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param mixed $value
- * @return array
- */
- public function toArray($value)
- {
- if (!is_object($value)) {
- return (array)$value;
- }
- $array = array();
- foreach ((array)$value as $key => $val) {
- // properties are transformed to keys in the following way:
- // private $property => "\0Classname\0property"
- // protected $property => "\0*\0property"
- // public $property => "property"
- if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
- $key = $matches[1];
- }
- // See https://github.com/php/php-src/commit/5721132
- if ($key === "\0gcdata") {
- continue;
- }
- $array[$key] = $val;
- }
- // Some internal classes like SplObjectStorage don't work with the
- // above (fast) mechanism nor with reflection in Zend.
- // Format the output similarly to print_r() in this case
- if ($value instanceof \SplObjectStorage) {
- // However, the fast method does work in HHVM, and exposes the
- // internal implementation. Hide it again.
- if (property_exists('\SplObjectStorage', '__storage')) {
- unset($array['__storage']);
- } elseif (property_exists('\SplObjectStorage', 'storage')) {
- unset($array['storage']);
- }
- if (property_exists('\SplObjectStorage', '__key')) {
- unset($array['__key']);
- }
- foreach ($value as $key => $val) {
- $array[spl_object_hash($val)] = array(
- 'obj' => $val,
- 'inf' => $value->getInfo(),
- );
- }
- }
- return $array;
- }
- /**
- * Recursive implementation of export
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects
- * @return string
- * @see SebastianBergmann\Exporter\Exporter::export
- */
- protected function recursiveExport(&$value, $indentation, $processed = null)
- {
- if ($value === null) {
- return 'null';
- }
- if ($value === true) {
- return 'true';
- }
- if ($value === false) {
- return 'false';
- }
- if (is_float($value) && floatval(intval($value)) === $value) {
- return "$value.0";
- }
- if (is_resource($value)) {
- return sprintf(
- 'resource(%d) of type (%s)',
- $value,
- get_resource_type($value)
- );
- }
- if (is_string($value)) {
- // Match for most non printable chars somewhat taking multibyte chars into account
- if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
- return 'Binary String: 0x' . bin2hex($value);
- }
- return "'" .
- str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) .
- "'";
- }
- $whitespace = str_repeat(' ', 4 * $indentation);
- if (!$processed) {
- $processed = new Context;
- }
- if (is_array($value)) {
- if (($key = $processed->contains($value)) !== false) {
- return 'Array &' . $key;
- }
- $key = $processed->add($value);
- $values = '';
- if (count($value) > 0) {
- foreach ($value as $k => $v) {
- $values .= sprintf(
- '%s %s => %s' . "\n",
- $whitespace,
- $this->recursiveExport($k, $indentation),
- $this->recursiveExport($value[$k], $indentation + 1, $processed)
- );
- }
- $values = "\n" . $values . $whitespace;
- }
- return sprintf('Array &%s (%s)', $key, $values);
- }
- if (is_object($value)) {
- $class = get_class($value);
- if ($hash = $processed->contains($value)) {
- return sprintf('%s Object &%s', $class, $hash);
- }
- $hash = $processed->add($value);
- $values = '';
- $array = $this->toArray($value);
- if (count($array) > 0) {
- foreach ($array as $k => $v) {
- $values .= sprintf(
- '%s %s => %s' . "\n",
- $whitespace,
- $this->recursiveExport($k, $indentation),
- $this->recursiveExport($v, $indentation + 1, $processed)
- );
- }
- $values = "\n" . $values . $whitespace;
- }
- return sprintf('%s Object &%s (%s)', $class, $hash, $values);
- }
- return var_export($value, true);
- }
- }
- File_Iterator
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * FilterIterator implementation that filters files based on prefix(es) and/or
- * suffix(es). Hidden files and files from hidden directories are also filtered.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.0.0
- */
- class File_Iterator extends FilterIterator
- {
- const PREFIX = 0;
- const SUFFIX = 1;
- /**
- * @var array
- */
- protected $suffixes = array();
- /**
- * @var array
- */
- protected $prefixes = array();
- /**
- * @var array
- */
- protected $exclude = array();
- /**
- * @var string
- */
- protected $basepath;
- /**
- * @param Iterator $iterator
- * @param array $suffixes
- * @param array $prefixes
- * @param array $exclude
- * @param string $basepath
- */
- public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL)
- {
- $exclude = array_filter(array_map('realpath', $exclude));
- if ($basepath !== NULL) {
- $basepath = realpath($basepath);
- }
- if ($basepath === FALSE) {
- $basepath = NULL;
- } else {
- foreach ($exclude as &$_exclude) {
- $_exclude = str_replace($basepath, '', $_exclude);
- }
- }
- $this->prefixes = $prefixes;
- $this->suffixes = $suffixes;
- $this->exclude = $exclude;
- $this->basepath = $basepath;
- parent::__construct($iterator);
- }
- /**
- * @return boolean
- */
- public function accept()
- {
- $current = $this->getInnerIterator()->current();
- $filename = $current->getFilename();
- $realpath = $current->getRealPath();
- if ($this->basepath !== NULL) {
- $realpath = str_replace($this->basepath, '', $realpath);
- }
- // Filter files in hidden directories.
- if (preg_match('=/\.[^/]*/=', $realpath)) {
- return FALSE;
- }
- return $this->acceptPath($realpath) &&
- $this->acceptPrefix($filename) &&
- $this->acceptSuffix($filename);
- }
- /**
- * @param string $path
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptPath($path)
- {
- foreach ($this->exclude as $exclude) {
- if (strpos($path, $exclude) === 0) {
- return FALSE;
- }
- }
- return TRUE;
- }
- /**
- * @param string $filename
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptPrefix($filename)
- {
- return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);
- }
- /**
- * @param string $filename
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptSuffix($filename)
- {
- return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);
- }
- /**
- * @param string $filename
- * @param array $subString
- * @param integer $type
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptSubString($filename, array $subStrings, $type)
- {
- if (empty($subStrings)) {
- return TRUE;
- }
- $matched = FALSE;
- foreach ($subStrings as $string) {
- if (($type == self::PREFIX && strpos($filename, $string) === 0) ||
- ($type == self::SUFFIX &&
- substr($filename, -1 * strlen($string)) == $string)) {
- $matched = TRUE;
- break;
- }
- }
- return $matched;
- }
- }
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Façade implementation that uses File_Iterator_Factory to create a
- * File_Iterator that operates on an AppendIterator that contains an
- * RecursiveDirectoryIterator for each given path. The list of unique
- * files is returned as an array.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.3.0
- */
- class File_Iterator_Facade
- {
- /**
- * @param array|string $paths
- * @param array|string $suffixes
- * @param array|string $prefixes
- * @param array $exclude
- * @param boolean $commonPath
- * @return array
- */
- public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = array(), $commonPath = FALSE)
- {
- if (is_string($paths)) {
- $paths = array($paths);
- }
- $factory = new File_Iterator_Factory;
- $iterator = $factory->getFileIterator(
- $paths, $suffixes, $prefixes, $exclude
- );
- $files = array();
- foreach ($iterator as $file) {
- $file = $file->getRealPath();
- if ($file) {
- $files[] = $file;
- }
- }
- foreach ($paths as $path) {
- if (is_file($path)) {
- $files[] = realpath($path);
- }
- }
- $files = array_unique($files);
- sort($files);
- if ($commonPath) {
- return array(
- 'commonPath' => $this->getCommonPath($files),
- 'files' => $files
- );
- } else {
- return $files;
- }
- }
- /**
- * Returns the common path of a set of files.
- *
- * @param array $files
- * @return string
- */
- protected function getCommonPath(array $files)
- {
- $count = count($files);
- if ($count == 0) {
- return '';
- }
- if ($count == 1) {
- return dirname($files[0]) . DIRECTORY_SEPARATOR;
- }
- $_files = array();
- foreach ($files as $file) {
- $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file);
- if (empty($_fileParts[0])) {
- $_fileParts[0] = DIRECTORY_SEPARATOR;
- }
- }
- $common = '';
- $done = FALSE;
- $j = 0;
- $count--;
- while (!$done) {
- for ($i = 0; $i < $count; $i++) {
- if ($_files[$i][$j] != $_files[$i+1][$j]) {
- $done = TRUE;
- break;
- }
- }
- if (!$done) {
- $common .= $_files[0][$j];
- if ($j > 0) {
- $common .= DIRECTORY_SEPARATOR;
- }
- }
- $j++;
- }
- return DIRECTORY_SEPARATOR . $common;
- }
- }
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory Method implementation that creates a File_Iterator that operates on
- * an AppendIterator that contains an RecursiveDirectoryIterator for each given
- * path.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.1.0
- */
- class File_Iterator_Factory
- {
- /**
- * @param array|string $paths
- * @param array|string $suffixes
- * @param array|string $prefixes
- * @param array $exclude
- * @return AppendIterator
- */
- public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = array())
- {
- if (is_string($paths)) {
- $paths = array($paths);
- }
- $paths = $this->getPathsAfterResolvingWildcards($paths);
- $exclude = $this->getPathsAfterResolvingWildcards($exclude);
- if (is_string($prefixes)) {
- if ($prefixes != '') {
- $prefixes = array($prefixes);
- } else {
- $prefixes = array();
- }
- }
- if (is_string($suffixes)) {
- if ($suffixes != '') {
- $suffixes = array($suffixes);
- } else {
- $suffixes = array();
- }
- }
- $iterator = new AppendIterator;
- foreach ($paths as $path) {
- if (is_dir($path)) {
- $iterator->append(
- new File_Iterator(
- new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS)
- ),
- $suffixes,
- $prefixes,
- $exclude,
- $path
- )
- );
- }
- }
- return $iterator;
- }
- /**
- * @param array $paths
- * @return array
- */
- protected function getPathsAfterResolvingWildcards(array $paths)
- {
- $_paths = array();
- foreach ($paths as $path) {
- if ($locals = glob($path, GLOB_ONLYDIR)) {
- $_paths = array_merge($_paths, $locals);
- } else {
- $_paths[] = $path;
- }
- }
- return $_paths;
- }
- }
- phpunit/phpunit: 4.7.7
- doctrine/instantiator: 1.0.5
- phpdocumentor/reflection-docblock: 2.0.4
- phpspec/prophecy: v1.4.1
- phpunit/dbunit: 1.4.0
- phpunit/php-code-coverage: 2.1.8
- phpunit/php-file-iterator: 1.4.0
- phpunit/php-invoker: 1.1.4
- phpunit/php-text-template: 1.2.1
- phpunit/php-timer: 1.0.6
- phpunit/php-token-stream: 1.4.3
- phpunit/phpunit-mock-objects: 2.3.5
- phpunit/phpunit-selenium: 1.4.2
- sebastian/comparator: 1.1.1
- sebastian/diff: 1.3.0
- sebastian/environment: 1.2.2
- sebastian/exporter: 1.2.0
- sebastian/global-state: 1.0.0
- sebastian/recursion-context: 1.0.0
- sebastian/version: 1.0.6
- symfony/yaml: v2.7.1
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- interface Exception
- {
- }
- Recursion Context
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * A context containing previously processed arrays and objects
- * when recursively processing a value.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- final class Context
- {
- /**
- * @var array[]
- */
- private $arrays;
- /**
- * @var \SplObjectStorage
- */
- private $objects;
- /**
- * Initialises the context
- */
- public function __construct()
- {
- $this->arrays = array();
- $this->objects = new \SplObjectStorage;
- }
- /**
- * Adds a value to the context.
- *
- * @param array|object $value The value to add.
- * @return integer|string The ID of the stored value, either as
- * a string or integer.
- * @throws InvalidArgumentException Thrown if $value is not an array or
- * object
- */
- public function add(&$value)
- {
- if (is_array($value)) {
- return $this->addArray($value);
- }
- else if (is_object($value)) {
- return $this->addObject($value);
- }
- throw new InvalidArgumentException(
- 'Only arrays and objects are supported'
- );
- }
- /**
- * Checks if the given value exists within the context.
- *
- * @param array|object $value The value to check.
- * @return integer|string|false The string or integer ID of the stored
- * value if it has already been seen, or
- * false if the value is not stored.
- * @throws InvalidArgumentException Thrown if $value is not an array or
- * object
- */
- public function contains(&$value)
- {
- if (is_array($value)) {
- return $this->containsArray($value);
- }
- else if (is_object($value)) {
- return $this->containsObject($value);
- }
- throw new InvalidArgumentException(
- 'Only arrays and objects are supported'
- );
- }
- /**
- * @param array $array
- * @return bool|int
- */
- private function addArray(array &$array)
- {
- $key = $this->containsArray($array);
- if ($key !== false) {
- return $key;
- }
- $this->arrays[] = &$array;
- return count($this->arrays) - 1;
- }
- /**
- * @param object $object
- * @return string
- */
- private function addObject($object)
- {
- if (!$this->objects->contains($object)) {
- $this->objects->attach($object);
- }
- return spl_object_hash($object);
- }
- /**
- * @param array $array
- * @return integer|false
- */
- private function containsArray(array &$array)
- {
- $keys = array_keys($this->arrays, $array, true);
- $hash = '_Key_' . hash('sha512', microtime(true));
- foreach ($keys as $key) {
- $this->arrays[$key][$hash] = $hash;
- if (isset($array[$hash]) && $array[$hash] === $hash) {
- unset($this->arrays[$key][$hash]);
- return $key;
- }
- unset($this->arrays[$key][$hash]);
- }
- return false;
- }
- /**
- * @param object $value
- * @return string|false
- */
- private function containsObject($value)
- {
- if ($this->objects->contains($value)) {
- return spl_object_hash($value);
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- final class InvalidArgumentException extends \InvalidArgumentException implements Exception
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- /**
- * TestCase class that uses Selenium to provide
- * the functionality required for web testing.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- *
- * @method unknown addLocationStrategy()
- * @method unknown addLocationStrategyAndWait()
- * @method unknown addScript()
- * @method unknown addScriptAndWait()
- * @method unknown addSelection()
- * @method unknown addSelectionAndWait()
- * @method unknown allowNativeXpath()
- * @method unknown allowNativeXpathAndWait()
- * @method unknown altKeyDown()
- * @method unknown altKeyDownAndWait()
- * @method unknown altKeyUp()
- * @method unknown altKeyUpAndWait()
- * @method unknown answerOnNextPrompt()
- * @method unknown assignId()
- * @method unknown assignIdAndWait()
- * @method unknown assertAlert
- * @method unknown assertAlertNotPresent
- * @method unknown assertAlertPresent
- * @method unknown assertAllButtons
- * @method unknown assertAllFields
- * @method unknown assertAllLinks
- * @method unknown assertAllWindowIds
- * @method unknown assertAllWindowNames
- * @method unknown assertAllWindowTitles
- * @method unknown assertAttribute
- * @method unknown assertAttributeFromAllWindows
- * @method unknown assertBodyText
- * @method unknown assertChecked
- * @method unknown assertConfirmation
- * @method unknown assertConfirmationNotPresent
- * @method unknown assertConfirmationPresent
- * @method unknown assertCookie
- * @method unknown assertCookieByName
- * @method unknown assertCookieNotPresent
- * @method unknown assertCookiePresent
- * @method unknown assertCssCount
- * @method unknown assertCursorPosition
- * @method unknown assertEditable
- * @method unknown assertElementHeight
- * @method unknown assertElementIndex
- * @method unknown assertElementNotPresent
- * @method unknown assertElementPositionLeft
- * @method unknown assertElementPositionTop
- * @method unknown assertElementPresent
- * @method unknown assertElementWidth
- * @method unknown assertEval
- * @method unknown assertExpression
- * @method unknown assertHtmlSource
- * @method unknown assertLocation
- * @method unknown assertLogMessages
- * @method unknown assertMouseSpeed
- * @method unknown assertNotAlert
- * @method unknown assertNotAllButtons
- * @method unknown assertNotAllFields
- * @method unknown assertNotAllLinks
- * @method unknown assertNotAllWindowIds
- * @method unknown assertNotAllWindowNames
- * @method unknown assertNotAllWindowTitles
- * @method unknown assertNotAttribute
- * @method unknown assertNotAttributeFromAllWindows
- * @method unknown assertNotBodyText
- * @method unknown assertNotChecked
- * @method unknown assertNotConfirmation
- * @method unknown assertNotCookie
- * @method unknown assertNotCookieByName
- * @method unknown assertNotCssCount
- * @method unknown assertNotCursorPosition
- * @method unknown assertNotEditable
- * @method unknown assertNotElementHeight
- * @method unknown assertNotElementIndex
- * @method unknown assertNotElementPositionLeft
- * @method unknown assertNotElementPositionTop
- * @method unknown assertNotElementWidth
- * @method unknown assertNotEval
- * @method unknown assertNotExpression
- * @method unknown assertNotHtmlSource
- * @method unknown assertNotLocation
- * @method unknown assertNotLogMessages
- * @method unknown assertNotMouseSpeed
- * @method unknown assertNotOrdered
- * @method unknown assertNotPrompt
- * @method unknown assertNotSelectOptions
- * @method unknown assertNotSelectedId
- * @method unknown assertNotSelectedIds
- * @method unknown assertNotSelectedIndex
- * @method unknown assertNotSelectedIndexes
- * @method unknown assertNotSelectedLabel
- * @method unknown assertNotSelectedLabels
- * @method unknown assertNotSelectedValue
- * @method unknown assertNotSelectedValues
- * @method unknown assertNotSomethingSelected
- * @method unknown assertNotSpeed
- * @method unknown assertNotSpeedAndWait
- * @method unknown assertNotTable
- * @method unknown assertNotText
- * @method unknown assertNotTitle
- * @method unknown assertNotValue
- * @method unknown assertNotVisible
- * @method unknown assertNotWhetherThisFrameMatchFrameExpression
- * @method unknown assertNotWhetherThisWindowMatchWindowExpression
- * @method unknown assertNotXpathCount
- * @method unknown assertOrdered
- * @method unknown assertPrompt
- * @method unknown assertPromptNotPresent
- * @method unknown assertPromptPresent
- * @method unknown assertSelectOptions
- * @method unknown assertSelectedId
- * @method unknown assertSelectedIds
- * @method unknown assertSelectedIndex
- * @method unknown assertSelectedIndexes
- * @method unknown assertSelectedLabel
- * @method unknown assertSelectedLabels
- * @method unknown assertSelectedValue
- * @method unknown assertSelectedValues
- * @method unknown assertSomethingSelected
- * @method unknown assertSpeed
- * @method unknown assertSpeedAndWait
- * @method unknown assertTable
- * @method unknown assertText
- * @method unknown assertTextNotPresent
- * @method unknown assertTextPresent
- * @method unknown assertTitle
- * @method unknown assertValue
- * @method unknown assertVisible
- * @method unknown assertWhetherThisFrameMatchFrameExpression
- * @method unknown assertWhetherThisWindowMatchWindowExpression
- * @method unknown assertXpathCount
- * @method unknown attachFile()
- * @method unknown break()
- * @method unknown captureEntirePageScreenshot()
- * @method unknown captureEntirePageScreenshotAndWait()
- * @method unknown captureEntirePageScreenshotToStringAndWait()
- * @method unknown captureScreenshotAndWait()
- * @method unknown captureScreenshotToStringAndWait()
- * @method unknown check()
- * @method unknown checkAndWait()
- * @method unknown chooseCancelOnNextConfirmation()
- * @method unknown chooseCancelOnNextConfirmationAndWait()
- * @method unknown chooseOkOnNextConfirmation()
- * @method unknown chooseOkOnNextConfirmationAndWait()
- * @method unknown click()
- * @method unknown clickAndWait()
- * @method unknown clickAt()
- * @method unknown clickAtAndWait()
- * @method unknown close()
- * @method unknown contextMenu()
- * @method unknown contextMenuAndWait()
- * @method unknown contextMenuAt()
- * @method unknown contextMenuAtAndWait()
- * @method unknown controlKeyDown()
- * @method unknown controlKeyDownAndWait()
- * @method unknown controlKeyUp()
- * @method unknown controlKeyUpAndWait()
- * @method unknown createCookie()
- * @method unknown createCookieAndWait()
- * @method unknown deleteAllVisibleCookies()
- * @method unknown deleteAllVisibleCookiesAndWait()
- * @method unknown deleteCookie()
- * @method unknown deleteCookieAndWait()
- * @method unknown deselectPopUp()
- * @method unknown deselectPopUpAndWait()
- * @method unknown doubleClick()
- * @method unknown doubleClickAndWait()
- * @method unknown doubleClickAt()
- * @method unknown doubleClickAtAndWait()
- * @method unknown dragAndDrop()
- * @method unknown dragAndDropAndWait()
- * @method unknown dragAndDropToObject()
- * @method unknown dragAndDropToObjectAndWait()
- * @method unknown dragDrop()
- * @method unknown dragDropAndWait()
- * @method unknown echo()
- * @method unknown fireEvent()
- * @method unknown fireEventAndWait()
- * @method unknown focus()
- * @method unknown focusAndWait()
- * @method string getAlert()
- * @method array getAllButtons()
- * @method array getAllFields()
- * @method array getAllLinks()
- * @method array getAllWindowIds()
- * @method array getAllWindowNames()
- * @method array getAllWindowTitles()
- * @method string getAttribute()
- * @method array getAttributeFromAllWindows()
- * @method string getBodyText()
- * @method string getConfirmation()
- * @method string getCookie()
- * @method string getCookieByName()
- * @method integer getCursorPosition()
- * @method integer getElementHeight()
- * @method integer getElementIndex()
- * @method integer getElementPositionLeft()
- * @method integer getElementPositionTop()
- * @method integer getElementWidth()
- * @method string getEval()
- * @method string getExpression()
- * @method string getHtmlSource()
- * @method string getLocation()
- * @method string getLogMessages()
- * @method integer getMouseSpeed()
- * @method string getPrompt()
- * @method array getSelectOptions()
- * @method string getSelectedId()
- * @method array getSelectedIds()
- * @method string getSelectedIndex()
- * @method array getSelectedIndexes()
- * @method string getSelectedLabel()
- * @method array getSelectedLabels()
- * @method string getSelectedValue()
- * @method array getSelectedValues()
- * @method unknown getSpeed()
- * @method unknown getSpeedAndWait()
- * @method string getTable()
- * @method string getText()
- * @method string getTitle()
- * @method string getValue()
- * @method boolean getWhetherThisFrameMatchFrameExpression()
- * @method boolean getWhetherThisWindowMatchWindowExpression()
- * @method integer getXpathCount()
- * @method unknown goBack()
- * @method unknown goBackAndWait()
- * @method unknown highlight()
- * @method unknown highlightAndWait()
- * @method unknown ignoreAttributesWithoutValue()
- * @method unknown ignoreAttributesWithoutValueAndWait()
- * @method boolean isAlertPresent()
- * @method boolean isChecked()
- * @method boolean isConfirmationPresent()
- * @method boolean isCookiePresent()
- * @method boolean isEditable()
- * @method boolean isElementPresent()
- * @method boolean isOrdered()
- * @method boolean isPromptPresent()
- * @method boolean isSomethingSelected()
- * @method boolean isTextPresent()
- * @method boolean isVisible()
- * @method unknown keyDown()
- * @method unknown keyDownAndWait()
- * @method unknown keyDownNative()
- * @method unknown keyDownNativeAndWait()
- * @method unknown keyPress()
- * @method unknown keyPressAndWait()
- * @method unknown keyPressNative()
- * @method unknown keyPressNativeAndWait()
- * @method unknown keyUp()
- * @method unknown keyUpAndWait()
- * @method unknown keyUpNative()
- * @method unknown keyUpNativeAndWait()
- * @method unknown metaKeyDown()
- * @method unknown metaKeyDownAndWait()
- * @method unknown metaKeyUp()
- * @method unknown metaKeyUpAndWait()
- * @method unknown mouseDown()
- * @method unknown mouseDownAndWait()
- * @method unknown mouseDownAt()
- * @method unknown mouseDownAtAndWait()
- * @method unknown mouseMove()
- * @method unknown mouseMoveAndWait()
- * @method unknown mouseMoveAt()
- * @method unknown mouseMoveAtAndWait()
- * @method unknown mouseOut()
- * @method unknown mouseOutAndWait()
- * @method unknown mouseOver()
- * @method unknown mouseOverAndWait()
- * @method unknown mouseUp()
- * @method unknown mouseUpAndWait()
- * @method unknown mouseUpAt()
- * @method unknown mouseUpAtAndWait()
- * @method unknown mouseUpRight()
- * @method unknown mouseUpRightAndWait()
- * @method unknown mouseUpRightAt()
- * @method unknown mouseUpRightAtAndWait()
- * @method unknown open()
- * @method unknown openWindow()
- * @method unknown openWindowAndWait()
- * @method unknown pause()
- * @method unknown refresh()
- * @method unknown refreshAndWait()
- * @method unknown removeAllSelections()
- * @method unknown removeAllSelectionsAndWait()
- * @method unknown removeScript()
- * @method unknown removeScriptAndWait()
- * @method unknown removeSelection()
- * @method unknown removeSelectionAndWait()
- * @method unknown retrieveLastRemoteControlLogs()
- * @method unknown rollup()
- * @method unknown rollupAndWait()
- * @method unknown runScript()
- * @method unknown runScriptAndWait()
- * @method unknown select()
- * @method unknown selectAndWait()
- * @method unknown selectFrame()
- * @method unknown selectPopUp()
- * @method unknown selectPopUpAndWait()
- * @method unknown selectWindow()
- * @method unknown setBrowserLogLevel()
- * @method unknown setBrowserLogLevelAndWait()
- * @method unknown setContext()
- * @method unknown setCursorPosition()
- * @method unknown setCursorPositionAndWait()
- * @method unknown setMouseSpeed()
- * @method unknown setMouseSpeedAndWait()
- * @method unknown setSpeed()
- * @method unknown setSpeedAndWait()
- * @method unknown shiftKeyDown()
- * @method unknown shiftKeyDownAndWait()
- * @method unknown shiftKeyUp()
- * @method unknown shiftKeyUpAndWait()
- * @method unknown shutDownSeleniumServer()
- * @method unknown store()
- * @method unknown submit()
- * @method unknown submitAndWait()
- * @method unknown type()
- * @method unknown typeAndWait()
- * @method unknown typeKeys()
- * @method unknown typeKeysAndWait()
- * @method unknown uncheck()
- * @method unknown uncheckAndWait()
- * @method unknown useXpathLibrary()
- * @method unknown useXpathLibraryAndWait()
- * @method unknown waitForAlert
- * @method unknown waitForAlertNotPresent
- * @method unknown waitForAlertPresent
- * @method unknown waitForAllButtons
- * @method unknown waitForAllFields
- * @method unknown waitForAllLinks
- * @method unknown waitForAllWindowIds
- * @method unknown waitForAllWindowNames
- * @method unknown waitForAllWindowTitles
- * @method unknown waitForAttribute
- * @method unknown waitForAttributeFromAllWindows
- * @method unknown waitForBodyText
- * @method unknown waitForChecked
- * @method unknown waitForCondition()
- * @method unknown waitForConfirmation
- * @method unknown waitForConfirmationNotPresent
- * @method unknown waitForConfirmationPresent
- * @method unknown waitForCookie
- * @method unknown waitForCookieByName
- * @method unknown waitForCookieNotPresent
- * @method unknown waitForCookiePresent
- * @method unknown waitForCssCount
- * @method unknown waitForCursorPosition
- * @method unknown waitForEditable
- * @method unknown waitForElementHeight
- * @method unknown waitForElementIndex
- * @method unknown waitForElementNotPresent
- * @method unknown waitForElementPositionLeft
- * @method unknown waitForElementPositionTop
- * @method unknown waitForElementPresent
- * @method unknown waitForElementWidth
- * @method unknown waitForEval
- * @method unknown waitForExpression
- * @method unknown waitForHtmlSource
- * @method unknown waitForLocation
- * @method unknown waitForLogMessages
- * @method unknown waitForMouseSpeed
- * @method unknown waitForNotAlert
- * @method unknown waitForNotAllButtons
- * @method unknown waitForNotAllFields
- * @method unknown waitForNotAllLinks
- * @method unknown waitForNotAllWindowIds
- * @method unknown waitForNotAllWindowNames
- * @method unknown waitForNotAllWindowTitles
- * @method unknown waitForNotAttribute
- * @method unknown waitForNotAttributeFromAllWindows
- * @method unknown waitForNotBodyText
- * @method unknown waitForNotChecked
- * @method unknown waitForNotConfirmation
- * @method unknown waitForNotCookie
- * @method unknown waitForNotCookieByName
- * @method unknown waitForNotCssCount
- * @method unknown waitForNotCursorPosition
- * @method unknown waitForNotEditable
- * @method unknown waitForNotElementHeight
- * @method unknown waitForNotElementIndex
- * @method unknown waitForNotElementPositionLeft
- * @method unknown waitForNotElementPositionTop
- * @method unknown waitForNotElementWidth
- * @method unknown waitForNotEval
- * @method unknown waitForNotExpression
- * @method unknown waitForNotHtmlSource
- * @method unknown waitForNotLocation
- * @method unknown waitForNotLogMessages
- * @method unknown waitForNotMouseSpeed
- * @method unknown waitForNotOrdered
- * @method unknown waitForNotPrompt
- * @method unknown waitForNotSelectOptions
- * @method unknown waitForNotSelectedId
- * @method unknown waitForNotSelectedIds
- * @method unknown waitForNotSelectedIndex
- * @method unknown waitForNotSelectedIndexes
- * @method unknown waitForNotSelectedLabel
- * @method unknown waitForNotSelectedLabels
- * @method unknown waitForNotSelectedValue
- * @method unknown waitForNotSelectedValues
- * @method unknown waitForNotSomethingSelected
- * @method unknown waitForNotSpeed
- * @method unknown waitForNotSpeedAndWait
- * @method unknown waitForNotTable
- * @method unknown waitForNotText
- * @method unknown waitForNotTitle
- * @method unknown waitForNotValue
- * @method unknown waitForNotVisible
- * @method unknown waitForNotWhetherThisFrameMatchFrameExpression
- * @method unknown waitForNotWhetherThisWindowMatchWindowExpression
- * @method unknown waitForNotXpathCount
- * @method unknown waitForOrdered
- * @method unknown waitForPageToLoad()
- * @method unknown waitForPopUp()
- * @method unknown waitForPrompt
- * @method unknown waitForPromptNotPresent
- * @method unknown waitForPromptPresent
- * @method unknown waitForSelectOptions
- * @method unknown waitForSelectedId
- * @method unknown waitForSelectedIds
- * @method unknown waitForSelectedIndex
- * @method unknown waitForSelectedIndexes
- * @method unknown waitForSelectedLabel
- * @method unknown waitForSelectedLabels
- * @method unknown waitForSelectedValue
- * @method unknown waitForSelectedValues
- * @method unknown waitForSomethingSelected
- * @method unknown waitForSpeed
- * @method unknown waitForSpeedAndWait
- * @method unknown waitForTable
- * @method unknown waitForText
- * @method unknown waitForTextNotPresent
- * @method unknown waitForTextPresent
- * @method unknown waitForTitle
- * @method unknown waitForValue
- * @method unknown waitForVisible
- * @method unknown waitForWhetherThisFrameMatchFrameExpression
- * @method unknown waitForWhetherThisWindowMatchWindowExpression
- * @method unknown waitForXpathCount
- * @method unknown windowFocus()
- * @method unknown windowMaximize()
- */
- abstract class PHPUnit_Extensions_SeleniumTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var array
- */
- public static $browsers = array();
- /**
- * @var string
- */
- protected $browserName;
- /**
- * @var boolean
- */
- protected $collectCodeCoverageInformation = FALSE;
- /**
- * @var string
- */
- protected $coverageScriptUrl = '';
- /**
- * @var PHPUnit_Extensions_SeleniumTestCase_Driver[]
- */
- protected $drivers = array();
- /**
- * @var boolean
- */
- protected $inDefaultAssertions = FALSE;
- /**
- * @var string
- */
- protected $testId;
- /**
- * @var array
- * @access protected
- */
- protected $verificationErrors = array();
- /**
- * @var boolean
- */
- protected $captureScreenshotOnFailure = FALSE;
- /**
- * @var string
- */
- protected $screenshotPath = '';
- /**
- * @var string
- */
- protected $screenshotUrl = '';
- /**
- * @var string
- */
- protected $screenshotBgColor = '';
- /**
- * @var integer the number of seconds to wait before declaring
- * the Selenium server not reachable
- */
- protected $serverConnectionTimeOut = 10;
- /**
- * @var boolean
- */
- private $serverRunning;
- /**
- * @var boolean
- */
- private static $shareSession;
- /**
- * The last sessionId used for running a test.
- * @var string
- */
- private static $sessionId;
- /**
- * @param boolean
- */
- public static function shareSession($shareSession)
- {
- self::$shareSession = $shareSession;
- }
- /**
- * @param string $name
- * @param array $data
- * @param string $dataName
- * @param array $browser
- * @throws InvalidArgumentException
- */
- public function __construct($name = NULL, array $data = array(), $dataName = '', array $browser = array())
- {
- parent::__construct($name, $data, $dataName);
- $this->testId = md5(uniqid(rand(), TRUE));
- $this->getDriver($browser);
- }
- public function setupSpecificBrowser(array $browser)
- {
- $this->getDriver($browser);
- }
- /**
- * Stops any shared session still open at the end of the current
- * PHPUnit process.
- */
- public function __destruct()
- {
- $this->stopSession();
- }
- /**
- * @param string $className
- * @return PHPUnit_Framework_TestSuite
- */
- public static function suite($className)
- {
- return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
- }
- /**
- * Runs the test case and collects the results in a TestResult object.
- * If no TestResult object is passed a new one will be created.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws InvalidArgumentException
- */
- public function run(PHPUnit_Framework_TestResult $result = NULL)
- {
- if ($result === NULL) {
- $result = $this->createResult();
- }
- $this->collectCodeCoverageInformation = $result->getCollectCodeCoverageInformation();
- foreach ($this->drivers as $driver) {
- $driver->setCollectCodeCoverageInformation(
- $this->collectCodeCoverageInformation
- );
- }
- parent::run($result);
- if ($this->collectCodeCoverageInformation) {
- $result->getCodeCoverage()->append(
- $this->getCodeCoverage(), $this
- );
- }
- return $result;
- }
- /**
- * @param array $browser
- * @return PHPUnit_Extensions_SeleniumTestCase_Driver
- */
- protected function getDriver(array $browser)
- {
- if (isset($browser['name'])) {
- if (!is_string($browser['name'])) {
- throw new InvalidArgumentException(
- 'Array element "name" is no string.'
- );
- }
- } else {
- $browser['name'] = '';
- }
- if (isset($browser['browser'])) {
- if (!is_string($browser['browser'])) {
- throw new InvalidArgumentException(
- 'Array element "browser" is no string.'
- );
- }
- } else {
- $browser['browser'] = '';
- }
- if (isset($browser['host'])) {
- if (!is_string($browser['host'])) {
- throw new InvalidArgumentException(
- 'Array element "host" is no string.'
- );
- }
- } else {
- $browser['host'] = 'localhost';
- }
- if (isset($browser['port'])) {
- if (!is_int($browser['port'])) {
- throw new InvalidArgumentException(
- 'Array element "port" is no integer.'
- );
- }
- } else {
- $browser['port'] = 4444;
- }
- if (isset($browser['timeout'])) {
- if (!is_int($browser['timeout'])) {
- throw new InvalidArgumentException(
- 'Array element "timeout" is no integer.'
- );
- }
- } else {
- $browser['timeout'] = 30;
- }
- if (isset($browser['httpTimeout'])) {
- if (!is_int($browser['httpTimeout'])) {
- throw new InvalidArgumentException(
- 'Array element "httpTimeout" is no integer.'
- );
- }
- } else {
- $browser['httpTimeout'] = 45;
- }
- $driver = new PHPUnit_Extensions_SeleniumTestCase_Driver;
- $driver->setName($browser['name']);
- $driver->setBrowser($browser['browser']);
- $driver->setHost($browser['host']);
- $driver->setPort($browser['port']);
- $driver->setTimeout($browser['timeout']);
- $driver->setHttpTimeout($browser['httpTimeout']);
- $driver->setTestCase($this);
- $driver->setTestId($this->testId);
- $this->drivers[0] = $driver;
- return $driver;
- }
- public function skipWithNoServerRunning()
- {
- try {
- fsockopen($this->drivers[0]->getHost(), $this->drivers[0]->getPort(), $errno, $errstr, $this->serverConnectionTimeOut);
- $this->serverRunning = TRUE;
- } catch (PHPUnit_Framework_Error_Warning $e) {
- $this->markTestSkipped(
- sprintf(
- 'Could not connect to the Selenium Server on %s:%d.',
- $this->drivers[0]->getHost(),
- $this->drivers[0]->getPort()
- )
- );
- $this->serverRunning = FALSE;
- }
- }
- /**
- * @return string
- */
- protected function prepareTestSession()
- {
- $testCaseClassVars = get_class_vars(get_class($this));
- if ($testCaseClassVars['browsers']) {
- return $this->start();
- }
- if (self::$shareSession && self::$sessionId !== NULL) {
- $this->setSessionId(self::$sessionId);
- $this->selectWindow('null');
- } else {
- self::$sessionId = $this->start();
- }
- return self::$sessionId;
- }
- /**
- * @throws RuntimeException
- */
- protected function runTest()
- {
- $this->skipWithNoServerRunning();
- $this->prepareTestSession();
- if (!is_file($this->getName(FALSE))) {
- $result = parent::runTest();
- } else {
- $this->runSelenese($this->getName(FALSE));
- $result = NULL;
- }
- if (!empty($this->verificationErrors)) {
- $this->fail(implode("\n", $this->verificationErrors));
- }
- if (!self::$shareSession) {
- $this->stopSession();
- }
- return $result;
- }
- private function stopSession()
- {
- try {
- $this->stop();
- } catch (RuntimeException $e) { }
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- $buffer = parent::toString();
- if (!empty($this->browserName)) {
- $buffer .= ' with browser ' . $this->browserName;
- }
- return $buffer;
- }
- /**
- * Runs a test from a Selenese (HTML) specification.
- *
- * @param string $filename
- */
- public function runSelenese($filename)
- {
- $document = PHPUnit_Util_XML::loadFile($filename, TRUE);
- $xpath = new DOMXPath($document);
- $rows = $xpath->query('body/table/tbody/tr');
- foreach ($rows as $row) {
- $action = NULL;
- $arguments = array();
- $columns = $xpath->query('td', $row);
- foreach ($columns as $column) {
- if ($action === NULL) {
- $action = PHPUnit_Util_XML::nodeToText($column);
- } else {
- $arguments[] = PHPUnit_Util_XML::nodeToText($column);
- }
- }
- if (method_exists($this, $action)) {
- call_user_func_array(array($this, $action), $arguments);
- } else {
- $this->__call($action, $arguments);
- }
- }
- }
- /**
- * Delegate method calls to the driver.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- */
- public function __call($command, $arguments)
- {
- $result = call_user_func_array(
- array($this->drivers[0], $command), $arguments
- );
- $this->verificationErrors = array_merge(
- $this->verificationErrors, $this->drivers[0]->getVerificationErrors()
- );
- $this->drivers[0]->clearVerificationErrors();
- return $result;
- }
- /**
- * Asserts that an element's value is equal to a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueEquals($locator, $text, $message = '')
- {
- $this->assertEquals($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value is not equal to a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueNotEquals($locator, $text, $message = '')
- {
- $this->assertNotEquals($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value contains a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueContains($locator, $text, $message = '')
- {
- $this->assertContains($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value does not contain a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueNotContains($locator, $text, $message = '')
- {
- $this->assertNotContains($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element contains a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementContainsText($locator, $text, $message = '')
- {
- $this->assertContains($text, $this->getText($locator), $message);
- }
- /**
- * Asserts that an element does not contain a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementNotContainsText($locator, $text, $message = '')
- {
- $this->assertNotContains($text, $this->getText($locator), $message);
- }
- /**
- * Asserts that a select element has a specific option.
- *
- * @param string $selectLocator
- * @param string $option
- * @param string $message
- */
- public function assertSelectHasOption($selectLocator, $option, $message = '')
- {
- $this->assertContains($option, $this->getSelectOptions($selectLocator), $message);
- }
- /**
- * Asserts that a select element does not have a specific option.
- *
- * @param string $selectLocator
- * @param string $option
- * @param string $message
- */
- public function assertSelectNotHasOption($selectLocator, $option, $message = '')
- {
- $this->assertNotContains($option, $this->getSelectOptions($selectLocator), $message);
- }
- /**
- * Asserts that a specific label is selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertSelected($selectLocator, $option, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Label "%s" not selected in "%s".',
- $option,
- $selectLocator
- );
- }
- $this->assertEquals(
- $option,
- $this->getSelectedLabel($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific label is not selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertNotSelected($selectLocator, $option, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Label "%s" selected in "%s".',
- $option,
- $selectLocator
- );
- }
- $this->assertNotEquals(
- $option,
- $this->getSelectedLabel($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific value is selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertIsSelected($selectLocator, $value, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Value "%s" not selected in "%s".',
- $value,
- $selectLocator
- );
- }
- $this->assertEquals(
- $value, $this->getSelectedValue($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific value is not selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertIsNotSelected($selectLocator, $value, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Value "%s" selected in "%s".',
- $value,
- $selectLocator
- );
- }
- $this->assertNotEquals(
- $value,
- $this->getSelectedValue($selectLocator),
- $message
- );
- }
- /**
- * Template Method that is called after Selenium actions.
- *
- * @param string $action
- */
- protected function defaultAssertions($action)
- {
- }
- /**
- * @return array
- */
- protected function getCodeCoverage()
- {
- $coverage = new PHPUnit_Extensions_SeleniumCommon_RemoteCoverage(
- $this->coverageScriptUrl,
- $this->testId
- );
- return $coverage->get();
- }
- /**
- * @param string $action
- */
- public function runDefaultAssertions($action)
- {
- if (!$this->inDefaultAssertions) {
- $this->inDefaultAssertions = TRUE;
- $this->defaultAssertions($action);
- $this->inDefaultAssertions = FALSE;
- }
- }
- /**
- * This method is called when a test method did not execute successfully.
- *
- * @param Exception $e
- */
- protected function onNotSuccessfulTest(Exception $e)
- {
- if (!$this->serverRunning) {
- throw $e;
- }
- try {
- $this->restoreSessionStateAfterFailedTest();
- $buffer = '';
- if ($this->captureScreenshotOnFailure) {
- $buffer .= 'Current URL: ' . $this->drivers[0]->getLocation() .
- "\n";
- $screenshotInfo = $this->takeScreenshot();
- if ($screenshotInfo != '') {
- $buffer .= $screenshotInfo;
- }
- }
- $this->stopSession();
- } catch (Exception $another) {
- $buffer = "Issues while capturing the screenshot:\n" . $another->getMessage();
- }
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException
- && is_object($e->getComparisonFailure())) {
- $message = $e->getComparisonFailure()->toString();
- } else {
- $message = $e->getMessage();
- }
- $buffer .= "\n" . $message;
- // gain the screenshot path, lose the stack trace
- if ($this->captureScreenshotOnFailure) {
- throw new PHPUnit_Framework_Error($buffer, $e->getCode(), $e->getFile(), $e->getLine(), $e);
- }
- // yes to stack trace and everything
- if ($e instanceof PHPUnit_Framework_IncompleteTestError
- || $e instanceof PHPUnit_Framework_SkippedTestError
- || $e instanceof PHPUnit_Framework_AssertionFailedError) {
- throw $e;
- }
- // yes to stack trace, only for F tests
- // PHPUnit issue 471 prevents getTrace() from being useful
- throw new PHPUnit_Framework_Error($buffer, $e->getCode(), $e->getFile(), $e->getLine(), $e);
- }
- private function restoreSessionStateAfterFailedTest()
- {
- self::$sessionId = NULL;
- }
- /**
- * Returns correct path to screenshot save path.
- *
- * @return string
- */
- protected function getScreenshotPath()
- {
- $path = $this->screenshotPath;
- if (!in_array(substr($path, strlen($path) -1, 1), array("/","\\"))) {
- $path .= DIRECTORY_SEPARATOR;
- }
- return $path;
- }
- /**
- * Take a screenshot and return information about it.
- * Return an empty string if the screenshotPath and screenshotUrl
- * properties are empty.
- * Issue #88.
- *
- * @access protected
- * @return string
- */
- protected function takeScreenshot()
- {
- if (!empty($this->screenshotPath) &&
- !empty($this->screenshotUrl)) {
- $filename = $this->getScreenshotPath() . $this->testId . '.png';
- $kargs = '';
- if ($this->screenshotBgColor!='') {
- $kargs = 'background=' . $this->screenshotBgColor;
- }
- $this->drivers[0]->captureEntirePageScreenshot($filename, $kargs);
- return 'Screenshot: ' . $this->screenshotUrl . '/' .
- $this->testId . ".png\n";
- } else {
- return '';
- }
- }
- /**
- * Pause support for runSelenese() HTML cases
- * @param $milliseconds
- */
- protected function pause($milliseconds)
- {
- sleep(round($milliseconds/1000));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.2
- */
- /**
- * TestSuite class for Selenium 1 tests
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_SeleniumTestSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Overriding the default: Selenium suites are always built from a TestCase class.
- * @var boolean
- */
- protected $testCase = TRUE;
- /**
- * Making the method public.
- */
- public function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- return parent::addTestMethod($class, $method);
- }
- /**
- * @param string $className extending PHPUnit_Extensions_SeleniumTestCase
- * @return PHPUnit_Extensions_SeleniumTestSuite
- */
- public static function fromTestCaseClass($className)
- {
- $suite = new self();
- $suite->setName($className);
- $class = new ReflectionClass($className);
- $classGroups = PHPUnit_Util_Test::getGroups($className);
- $staticProperties = $class->getStaticProperties();
- if (isset($staticProperties['browsers'])) {
- $browsers = $staticProperties['browsers'];
- } else if (is_callable("{$className}::browsers")) {
- $browsers = $className::browsers();
- } else {
- $browsers = null;
- }
- //BC: renamed seleneseDirectory -> selenesePath
- if (!isset($staticProperties['selenesePath']) && isset($staticProperties['seleneseDirectory'])) {
- $staticProperties['selenesePath'] = $staticProperties['seleneseDirectory'];
- }
- // Create tests from Selenese/HTML files.
- if (isset($staticProperties['selenesePath']) &&
- (is_dir($staticProperties['selenesePath']) || is_file($staticProperties['selenesePath']))) {
- if (is_dir($staticProperties['selenesePath'])) {
- $files = array_merge(
- self::getSeleneseFiles($staticProperties['selenesePath'], '.htm'),
- self::getSeleneseFiles($staticProperties['selenesePath'], '.html')
- );
- } else {
- $files[] = realpath($staticProperties['selenesePath']);
- }
- // Create tests from Selenese/HTML files for multiple browsers.
- if ($browsers) {
- foreach ($browsers as $browser) {
- $browserSuite = PHPUnit_Extensions_SeleniumBrowserSuite::fromClassAndBrowser($className, $browser);
- foreach ($files as $file) {
- self::addGeneratedTestTo($browserSuite,
- new $className($file, array(), '', $browser),
- $classGroups
- );
- }
- $suite->addTest($browserSuite);
- }
- }
- else {
- // Create tests from Selenese/HTML files for single browser.
- foreach ($files as $file) {
- self::addGeneratedTestTo($suite,
- new $className($file),
- $classGroups);
- }
- }
- }
- // Create tests from test methods for multiple browsers.
- if ($browsers) {
- foreach ($browsers as $browser) {
- $browserSuite = PHPUnit_Extensions_SeleniumBrowserSuite::fromClassAndBrowser($className, $browser);
- foreach ($class->getMethods() as $method) {
- $browserSuite->addTestMethod($class, $method);
- }
- $browserSuite->setupSpecificBrowser($browser);
- $suite->addTest($browserSuite);
- }
- }
- else {
- // Create tests from test methods for single browser.
- foreach ($class->getMethods() as $method) {
- $suite->addTestMethod($class, $method);
- }
- }
- return $suite;
- }
- private static function addGeneratedTestTo(PHPUnit_Framework_TestSuite $suite, PHPUnit_Framework_TestCase $test, $classGroups)
- {
- list ($methodName, ) = explode(' ', $test->getName());
- $test->setDependencies(
- PHPUnit_Util_Test::getDependencies(get_class($test), $methodName)
- );
- $suite->addTest($test, $classGroups);
- }
- /**
- * @param string $directory
- * @param string $suffix
- * @return array
- */
- private static function getSeleneseFiles($directory, $suffix)
- {
- $facade = new File_Iterator_Facade;
- return $facade->getFilesAsArray($directory, $suffix);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- /**
- * Implementation of the Selenium RC client/server protocol.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_SeleniumTestCase_Driver
- {
- /**
- * @var PHPUnit_Extensions_SeleniumTestCase
- */
- protected $testCase;
- /**
- * @var string
- */
- protected $testId;
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $browser;
- /**
- * @var string
- */
- protected $browserUrl;
- /**
- * @var boolean
- */
- protected $collectCodeCoverageInformation = FALSE;
- /**
- * @var string
- */
- protected $host = 'localhost';
- /**
- * @var integer
- */
- protected $port = 4444;
- /**
- * @var integer
- */
- protected $httpTimeout = 45;
- /**
- * @var integer
- */
- protected $seleniumTimeout = 30;
- /**
- * @var string
- */
- protected $sessionId;
- /**
- * @var integer
- */
- protected $sleep = 0;
- /**
- * @var boolean
- */
- protected $useWaitForPageToLoad = TRUE;
- /**
- * @var boolean
- */
- protected $wait = 5;
- /**
- * @var array
- */
- protected static $autoGeneratedCommands = array();
- /**
- * @var array
- */
- protected $commands = array();
- /**
- * @var array $userCommands A numerical array which holds custom user commands.
- */
- protected $userCommands = array();
- /**
- * @var array
- */
- protected $verificationErrors = array();
- /**
- * @var array
- */
- private $webDriverCapabilities;
- public function __construct()
- {
- if (empty(self::$autoGeneratedCommands)) {
- self::autoGenerateCommands();
- }
- }
- /**
- * Only browserName is supported.
- */
- public function setWebDriverCapabilities(array $capabilities)
- {
- $this->webDriverCapabilities = $capabilities;
- }
- /**
- * @return string
- */
- public function start()
- {
- if ($this->browserUrl == NULL) {
- throw new PHPUnit_Framework_Exception(
- 'setBrowserUrl() needs to be called before start().'
- );
- }
- if ($this->webDriverCapabilities !== NULL) {
- $seleniumServerUrl = PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($this->host, $this->port);
- $driver = new PHPUnit_Extensions_Selenium2TestCase_Driver($seleniumServerUrl);
- $session = $driver->startSession($this->webDriverCapabilities, new PHPUnit_Extensions_Selenium2TestCase_URL($this->browserUrl));
- $webDriverSessionId = $session->id();
- $this->sessionId = $this->getString(
- 'getNewBrowserSession',
- array($this->browser, $this->browserUrl, '',
- "webdriver.remote.sessionid=$webDriverSessionId")
- );
- $this->doCommand('setTimeout', array($this->seleniumTimeout * 1000));
- }
- if (!isset($this->sessionId)) {
- $this->sessionId = $this->getString(
- 'getNewBrowserSession',
- array($this->browser, $this->browserUrl)
- );
- $this->doCommand('setTimeout', array($this->seleniumTimeout * 1000));
- }
- return $this->sessionId;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getSessionId()
- {
- return $this->sessionId;
- }
- /**
- * @param string
- * @since Method available since Release 1.2.0
- */
- public function setSessionId($sessionId)
- {
- $this->sessionId = $sessionId;
- }
- /**
- */
- public function stop()
- {
- if (!isset($this->sessionId)) {
- return;
- }
- $this->doCommand('testComplete');
- $this->sessionId = NULL;
- }
- /**
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setCollectCodeCoverageInformation($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->collectCodeCoverageInformation = $flag;
- }
- /**
- * @param PHPUnit_Extensions_SeleniumTestCase $testCase
- */
- public function setTestCase(PHPUnit_Extensions_SeleniumTestCase $testCase)
- {
- $this->testCase = $testCase;
- }
- /**
- * @param integer $testId
- */
- public function setTestId($testId)
- {
- $this->testId = $testId;
- }
-
- /**
- * @return integer $testId
- */
- public function getTestId()
- {
- return $this->testId;
- }
- /**
- * @param string $name
- * @throws InvalidArgumentException
- */
- public function setName($name)
- {
- if (!is_string($name)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->name = $name;
- }
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * @param string $browser
- * @throws InvalidArgumentException
- */
- public function setBrowser($browser)
- {
- if (!is_string($browser)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->browser = $browser;
- }
- /**
- * @return string
- */
- public function getBrowser()
- {
- return $this->browser;
- }
- /**
- * @param string $browserUrl
- * @throws InvalidArgumentException
- */
- public function setBrowserUrl($browserUrl)
- {
- if (!is_string($browserUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->browserUrl = $browserUrl;
- }
- /**
- * @param string $host
- * @throws InvalidArgumentException
- */
- public function setHost($host)
- {
- if (!is_string($host)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->host = $host;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getHost()
- {
- return $this->host;
- }
- /**
- * @param integer $port
- * @throws InvalidArgumentException
- */
- public function setPort($port)
- {
- if (!is_int($port)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->port = $port;
- }
- /**
- * @return integer
- * @since Method available since Release 1.1.0
- */
- public function getPort()
- {
- return $this->port;
- }
-
- /**
- * @param integer $timeout for Selenium RC in seconds
- * @throws InvalidArgumentException
- */
- public function setTimeout($timeout)
- {
- if (!is_int($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->seleniumTimeout = $timeout;
- }
- /**
- * @param integer $timeout for HTTP connection to Selenium RC in seconds
- * @throws InvalidArgumentException
- */
- public function setHttpTimeout($timeout)
- {
- if (!is_int($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->httpTimeout = $timeout;
- }
- /**
- * @param integer $seconds
- * @throws InvalidArgumentException
- */
- public function setSleep($seconds)
- {
- if (!is_int($seconds)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->sleep = $seconds;
- }
- /**
- * Sets the number of seconds to sleep() after *AndWait commands
- * when setWaitForPageToLoad(FALSE) is used.
- *
- * @param integer $seconds
- * @throws InvalidArgumentException
- */
- public function setWait($seconds)
- {
- if (!is_int($seconds)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->wait = $seconds;
- }
- /**
- * Sets whether waitForPageToLoad (TRUE) or sleep() (FALSE)
- * is used after *AndWait commands.
- *
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setWaitForPageToLoad($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->useWaitForPageToLoad = $flag;
- }
- /**
- * Sets whether captureScreenshotOnFailure (TRUE) or (FALSE)
- * if true, the takeScreenshot() is triggered in onNotSuccessfulTest().
- *
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setCaptureScreenshotOnFailure($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->captureScreenshotOnFailure = $flag;
- }
-
- /**
- * @param string $screenshotUrl
- * @throws InvalidArgumentException
- */
- public function setScreenshotUrl($screenshotUrl)
- {
- if (!is_string($screenshotUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->screenshotUrl = $screenshotUrl;
- }
- /**
- * @param string $screenshotPath
- * @throws InvalidArgumentException
- */
- public function setScreenshotPath($screenshotPath)
- {
- if (!is_string($screenshotPath)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->screenshotPath = $screenshotPath;
- }
-
- /**
- * Adds allowed user commands into {@link self::$userCommands}. See
- * {@link self::__call()} (switch/case -> default) for usage.
- *
- * @param string $command A command.
- *
- * @return $this
- * @see self::__call()
- */
-
-
- public function addUserCommand($command)
- {
- if (!is_string($command)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->userCommands[] = $command;
- return $this;
- }
- /**
- * This method implements the Selenium RC protocol.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- * @method unknown addLocationStrategy()
- * @method unknown addLocationStrategyAndWait()
- * @method unknown addScript()
- * @method unknown addScriptAndWait()
- * @method unknown addSelection()
- * @method unknown addSelectionAndWait()
- * @method unknown allowNativeXpath()
- * @method unknown allowNativeXpathAndWait()
- * @method unknown altKeyDown()
- * @method unknown altKeyDownAndWait()
- * @method unknown altKeyUp()
- * @method unknown altKeyUpAndWait()
- * @method unknown answerOnNextPrompt()
- * @method unknown assignId()
- * @method unknown assignIdAndWait()
- * @method unknown attachFile()
- * @method unknown break()
- * @method unknown captureEntirePageScreenshot()
- * @method unknown captureEntirePageScreenshotAndWait()
- * @method unknown captureEntirePageScreenshotToStringAndWait()
- * @method unknown captureScreenshotAndWait()
- * @method unknown captureScreenshotToStringAndWait()
- * @method unknown check()
- * @method unknown checkAndWait()
- * @method unknown chooseCancelOnNextConfirmation()
- * @method unknown chooseCancelOnNextConfirmationAndWait()
- * @method unknown chooseOkOnNextConfirmation()
- * @method unknown chooseOkOnNextConfirmationAndWait()
- * @method unknown click()
- * @method unknown clickAndWait()
- * @method unknown clickAt()
- * @method unknown clickAtAndWait()
- * @method unknown close()
- * @method unknown contextMenu()
- * @method unknown contextMenuAndWait()
- * @method unknown contextMenuAt()
- * @method unknown contextMenuAtAndWait()
- * @method unknown controlKeyDown()
- * @method unknown controlKeyDownAndWait()
- * @method unknown controlKeyUp()
- * @method unknown controlKeyUpAndWait()
- * @method unknown createCookie()
- * @method unknown createCookieAndWait()
- * @method unknown deleteAllVisibleCookies()
- * @method unknown deleteAllVisibleCookiesAndWait()
- * @method unknown deleteCookie()
- * @method unknown deleteCookieAndWait()
- * @method unknown deselectPopUp()
- * @method unknown deselectPopUpAndWait()
- * @method unknown doubleClick()
- * @method unknown doubleClickAndWait()
- * @method unknown doubleClickAt()
- * @method unknown doubleClickAtAndWait()
- * @method unknown dragAndDrop()
- * @method unknown dragAndDropAndWait()
- * @method unknown dragAndDropToObject()
- * @method unknown dragAndDropToObjectAndWait()
- * @method unknown dragDrop()
- * @method unknown dragDropAndWait()
- * @method unknown echo()
- * @method unknown fireEvent()
- * @method unknown fireEventAndWait()
- * @method unknown focus()
- * @method unknown focusAndWait()
- * @method string getAlert()
- * @method array getAllButtons()
- * @method array getAllFields()
- * @method array getAllLinks()
- * @method array getAllWindowIds()
- * @method array getAllWindowNames()
- * @method array getAllWindowTitles()
- * @method string getAttribute(string $attributeLocator)
- * @method array getAttributeFromAllWindows(string $attributeName)
- * @method string getBodyText()
- * @method string getConfirmation()
- * @method string getCookie()
- * @method string getCookieByName(string $name)
- * @method integer getCssCount(string $locator)
- * @method integer getCursorPosition(string $locator)
- * @method integer getElementHeight(string $locator)
- * @method integer getElementIndex(string $locator)
- * @method integer getElementPositionLeft(string $locator)
- * @method integer getElementPositionTop(string $locator)
- * @method integer getElementWidth(string $locator)
- * @method string getEval(string $script)
- * @method string getExpression(string $expression)
- * @method string getHtmlSource()
- * @method string getLocation()
- * @method string getLogMessages()
- * @method integer getMouseSpeed()
- * @method string getPrompt()
- * @method array getSelectOptions(string $selectLocator)
- * @method string getSelectedId(string $selectLocator)
- * @method array getSelectedIds(string $selectLocator)
- * @method string getSelectedIndex(string $selectLocator)
- * @method array getSelectedIndexes(string $selectLocator)
- * @method string getSelectedLabel(string $selectLocator)
- * @method array getSelectedLabels(string $selectLocator)
- * @method string getSelectedValue(string $selectLocator)
- * @method array getSelectedValues(string $selectLocator)
- * @method unknown getSpeed()
- * @method unknown getSpeedAndWait()
- * @method string getTable(string $tableCellAddress)
- * @method string getText(string $locator)
- * @method string getTitle()
- * @method string getValue(string $locator)
- * @method boolean getWhetherThisFrameMatchFrameExpression(string $currentFrameString, string $target)
- * @method boolean getWhetherThisWindowMatchWindowExpression(string $currentWindowString, string $target)
- * @method integer getXpathCount(string $xpath)
- * @method unknown goBack()
- * @method unknown goBackAndWait()
- * @method unknown highlight(string $locator)
- * @method unknown highlightAndWait(string $locator)
- * @method unknown ignoreAttributesWithoutValue(string $ignore)
- * @method unknown ignoreAttributesWithoutValueAndWait(string $ignore)
- * @method boolean isAlertPresent()
- * @method boolean isChecked(locator)
- * @method boolean isConfirmationPresent()
- * @method boolean isCookiePresent(string $name)
- * @method boolean isEditable(string $locator)
- * @method boolean isElementPresent(string $locator)
- * @method boolean isOrdered(string $locator1, string $locator2)
- * @method boolean isPromptPresent()
- * @method boolean isSomethingSelected(string $selectLocator)
- * @method boolean isTextPresent(pattern)
- * @method boolean isVisible(locator)
- * @method unknown keyDown()
- * @method unknown keyDownAndWait()
- * @method unknown keyDownNative()
- * @method unknown keyDownNativeAndWait()
- * @method unknown keyPress()
- * @method unknown keyPressAndWait()
- * @method unknown keyPressNative()
- * @method unknown keyPressNativeAndWait()
- * @method unknown keyUp()
- * @method unknown keyUpAndWait()
- * @method unknown keyUpNative()
- * @method unknown keyUpNativeAndWait()
- * @method unknown metaKeyDown()
- * @method unknown metaKeyDownAndWait()
- * @method unknown metaKeyUp()
- * @method unknown metaKeyUpAndWait()
- * @method unknown mouseDown()
- * @method unknown mouseDownAndWait()
- * @method unknown mouseDownAt()
- * @method unknown mouseDownAtAndWait()
- * @method unknown mouseMove()
- * @method unknown mouseMoveAndWait()
- * @method unknown mouseMoveAt()
- * @method unknown mouseMoveAtAndWait()
- * @method unknown mouseOut()
- * @method unknown mouseOutAndWait()
- * @method unknown mouseOver()
- * @method unknown mouseOverAndWait()
- * @method unknown mouseUp()
- * @method unknown mouseUpAndWait()
- * @method unknown mouseUpAt()
- * @method unknown mouseUpAtAndWait()
- * @method unknown mouseUpRight()
- * @method unknown mouseUpRightAndWait()
- * @method unknown mouseUpRightAt()
- * @method unknown mouseUpRightAtAndWait()
- * @method unknown open()
- * @method unknown openWindow()
- * @method unknown openWindowAndWait()
- * @method unknown pause()
- * @method unknown refresh()
- * @method unknown refreshAndWait()
- * @method unknown removeAllSelections()
- * @method unknown removeAllSelectionsAndWait()
- * @method unknown removeScript()
- * @method unknown removeScriptAndWait()
- * @method unknown removeSelection()
- * @method unknown removeSelectionAndWait()
- * @method unknown retrieveLastRemoteControlLogs()
- * @method unknown rollup()
- * @method unknown rollupAndWait()
- * @method unknown runScript()
- * @method unknown runScriptAndWait()
- * @method unknown select()
- * @method unknown selectAndWait()
- * @method unknown selectFrame()
- * @method unknown selectPopUp()
- * @method unknown selectPopUpAndWait()
- * @method unknown selectWindow()
- * @method unknown setBrowserLogLevel()
- * @method unknown setBrowserLogLevelAndWait()
- * @method unknown setContext()
- * @method unknown setCursorPosition()
- * @method unknown setCursorPositionAndWait()
- * @method unknown setMouseSpeed()
- * @method unknown setMouseSpeedAndWait()
- * @method unknown setSpeed()
- * @method unknown setSpeedAndWait()
- * @method unknown shiftKeyDown()
- * @method unknown shiftKeyDownAndWait()
- * @method unknown shiftKeyUp()
- * @method unknown shiftKeyUpAndWait()
- * @method unknown shutDownSeleniumServer()
- * @method unknown store()
- * @method unknown submit()
- * @method unknown submitAndWait()
- * @method unknown type()
- * @method unknown typeAndWait()
- * @method unknown typeKeys()
- * @method unknown typeKeysAndWait()
- * @method unknown uncheck()
- * @method unknown uncheckAndWait()
- * @method unknown useXpathLibrary()
- * @method unknown useXpathLibraryAndWait()
- * @method unknown waitForCondition()
- * @method unknown waitForElementPresent()
- * @method unknown waitForElementNotPresent()
- * @method unknown waitForPageToLoad()
- * @method unknown waitForPopUp()
- * @method unknown windowFocus()
- * @method unknown windowMaximize()
- */
- public function __call($command, $arguments)
- {
- $arguments = $this->preprocessParameters($arguments);
- $wait = FALSE;
- if (substr($command, -7, 7) == 'AndWait') {
- $command = substr($command, 0, -7);
- $wait = TRUE;
- }
- switch ($command) {
- case 'addLocationStrategy':
- case 'addScript':
- case 'addSelection':
- case 'allowNativeXpath':
- case 'altKeyDown':
- case 'altKeyUp':
- case 'answerOnNextPrompt':
- case 'assignId':
- case 'attachFile':
- case 'break':
- case 'captureEntirePageScreenshot':
- case 'captureScreenshot':
- case 'check':
- case 'chooseCancelOnNextConfirmation':
- case 'chooseOkOnNextConfirmation':
- case 'click':
- case 'clickAt':
- case 'close':
- case 'contextMenu':
- case 'contextMenuAt':
- case 'controlKeyDown':
- case 'controlKeyUp':
- case 'createCookie':
- case 'deleteAllVisibleCookies':
- case 'deleteCookie':
- case 'deselectPopUp':
- case 'doubleClick':
- case 'doubleClickAt':
- case 'dragAndDrop':
- case 'dragAndDropToObject':
- case 'dragDrop':
- case 'echo':
- case 'fireEvent':
- case 'focus':
- case 'goBack':
- case 'highlight':
- case 'ignoreAttributesWithoutValue':
- case 'keyDown':
- case 'keyDownNative':
- case 'keyPress':
- case 'keyPressNative':
- case 'keyUp':
- case 'keyUpNative':
- case 'metaKeyDown':
- case 'metaKeyUp':
- case 'mouseDown':
- case 'mouseDownAt':
- case 'mouseMove':
- case 'mouseMoveAt':
- case 'mouseOut':
- case 'mouseOver':
- case 'mouseUp':
- case 'mouseUpAt':
- case 'mouseUpRight':
- case 'mouseUpRightAt':
- case 'open':
- case 'openWindow':
- case 'pause':
- case 'refresh':
- case 'removeAllSelections':
- case 'removeScript':
- case 'removeSelection':
- case 'retrieveLastRemoteControlLogs':
- case 'rollup':
- case 'runScript':
- case 'select':
- case 'selectFrame':
- case 'selectPopUp':
- case 'selectWindow':
- case 'setBrowserLogLevel':
- case 'setContext':
- case 'setCursorPosition':
- case 'setMouseSpeed':
- case 'setSpeed':
- case 'shiftKeyDown':
- case 'shiftKeyUp':
- case 'shutDownSeleniumServer':
- case 'store':
- case 'submit':
- case 'type':
- case 'typeKeys':
- case 'uncheck':
- case 'useXpathLibrary':
- case 'windowFocus':
- case 'windowMaximize':
- case isset(self::$autoGeneratedCommands[$command]): {
- // Pre-Command Actions
- switch ($command) {
- case 'open':
- case 'openWindow': {
- if ($this->collectCodeCoverageInformation) {
- $this->deleteCookie('PHPUNIT_SELENIUM_TEST_ID', 'path=/');
- $this->createCookie(
- 'PHPUNIT_SELENIUM_TEST_ID=' . $this->testId,
- 'path=/'
- );
- }
- }
- break;
- case 'store':
- // store is a synonym of storeExpression
- // and RC only understands storeExpression
- $command = 'storeExpression';
- break;
- }
- if (isset(self::$autoGeneratedCommands[$command]) && self::$autoGeneratedCommands[$command]['functionHelper']) {
- $helperArguments = array($command, $arguments, self::$autoGeneratedCommands[$command]);
- call_user_func_array(array($this, self::$autoGeneratedCommands[$command]['functionHelper']), $helperArguments);
- } else {
- $this->doCommand($command, $arguments);
- }
- // Post-Command Actions
- switch ($command) {
- case 'addLocationStrategy':
- case 'allowNativeXpath':
- case 'assignId':
- case 'captureEntirePageScreenshot':
- case 'captureScreenshot': {
- // intentionally empty
- }
- break;
- default: {
- if ($wait) {
- if ($this->useWaitForPageToLoad) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- } else {
- sleep($this->wait);
- }
- }
- if ($this->sleep > 0) {
- sleep($this->sleep);
- }
- $this->testCase->runDefaultAssertions($command);
- }
- }
- }
- break;
- case 'getWhetherThisFrameMatchFrameExpression':
- case 'getWhetherThisWindowMatchWindowExpression':
- case 'isAlertPresent':
- case 'isChecked':
- case 'isConfirmationPresent':
- case 'isCookiePresent':
- case 'isEditable':
- case 'isElementPresent':
- case 'isOrdered':
- case 'isPromptPresent':
- case 'isSomethingSelected':
- case 'isTextPresent':
- case 'isVisible': {
- return $this->getBoolean($command, $arguments);
- }
- break;
- case 'getCssCount':
- case 'getCursorPosition':
- case 'getElementHeight':
- case 'getElementIndex':
- case 'getElementPositionLeft':
- case 'getElementPositionTop':
- case 'getElementWidth':
- case 'getMouseSpeed':
- case 'getSpeed':
- case 'getXpathCount': {
- $result = $this->getNumber($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'getAlert':
- case 'getAttribute':
- case 'getBodyText':
- case 'getConfirmation':
- case 'getCookie':
- case 'getCookieByName':
- case 'getEval':
- case 'getExpression':
- case 'getHtmlSource':
- case 'getLocation':
- case 'getLogMessages':
- case 'getPrompt':
- case 'getSelectedId':
- case 'getSelectedIndex':
- case 'getSelectedLabel':
- case 'getSelectedValue':
- case 'getTable':
- case 'getText':
- case 'getTitle':
- case 'captureEntirePageScreenshotToString':
- case 'captureScreenshotToString':
- case 'getValue': {
- $result = $this->getString($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'getAllButtons':
- case 'getAllFields':
- case 'getAllLinks':
- case 'getAllWindowIds':
- case 'getAllWindowNames':
- case 'getAllWindowTitles':
- case 'getAttributeFromAllWindows':
- case 'getSelectedIds':
- case 'getSelectedIndexes':
- case 'getSelectedLabels':
- case 'getSelectedValues':
- case 'getSelectOptions': {
- $result = $this->getStringArray($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'waitForCondition':
- case 'waitForElementPresent':
- case 'waitForElementNotPresent':
- case 'waitForFrameToLoad':
- case 'waitForPopUp': {
- if (count($arguments) == 1) {
- $arguments[] = $this->seleniumTimeout * 1000;
- }
- $this->doCommand($command, $arguments);
- $this->testCase->runDefaultAssertions($command);
- }
- break;
- case 'waitForPageToLoad': {
- if (empty($arguments)) {
- $arguments[] = $this->seleniumTimeout * 1000;
- }
- $this->doCommand($command, $arguments);
- $this->testCase->runDefaultAssertions($command);
- }
- break;
- default: {
- if (!in_array($command, $this->userCommands)) {
- throw new BadMethodCallException(
- "Method $command not defined."
- );
- }
- $this->doCommand($command, $arguments);
- }
- }
- }
- /**
- * Send a command to the Selenium RC server.
- *
- * @param string $command
- * @param array $arguments
- * @param array $namedArguments
- * @return string
- * @author Seth Casana <totallymeat@gmail.org>
- */
- protected function doCommand($command, array $arguments = array(), array $namedArguments = array())
- {
- $url = sprintf(
- 'http://%s:%s/selenium-server/driver/',
- $this->host,
- $this->port
- );
- $numArguments = count($arguments);
- $postData = sprintf('cmd=%s', urlencode($command));
- for ($i = 0; $i < $numArguments; $i++) {
- $argNum = strval($i + 1);
- if ($arguments[$i] == ' ') {
- $postData .= sprintf('&%s=%s', $argNum, urlencode($arguments[$i]));
- } else {
- $postData .= sprintf('&%s=%s', $argNum, urlencode(trim($arguments[$i])));
- }
- }
- foreach ($namedArguments as $key => $value) {
- $postData .= sprintf('&%s=%s', $key, urlencode($value));
- }
- if (isset($this->sessionId)) {
- $postData .= sprintf('&%s=%s', 'sessionId', $this->sessionId);
- }
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_HEADER, 0);
- curl_setopt($curl, CURLOPT_POST, TRUE);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
- 'Content-Type: application/x-www-form-urlencoded; charset=utf-8'
- ));
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
- $response = curl_exec($curl);
- $info = curl_getinfo($curl);
- if (!$response) {
- throw new RuntimeException("CURL error while accessing the Selenium Server at '$url': " . curl_error($curl));
- }
- curl_close($curl);
- if (!preg_match('/^OK/', $response)) {
- throw new RuntimeException("Invalid response while accessing the Selenium Server at '$url': " . $response);
- }
- if ($info['http_code'] != 200) {
- throw new RuntimeException(
- 'The response from the Selenium RC server is invalid: ' .
- $response
- );
- }
- return $response;
- }
- protected function preprocessParameters($params)
- {
- foreach ($params as $key => $param ) {
- if (is_string($param) && (strlen($param) > 0)) {
- $params[$key] = $this->getString('getExpression', array($param));
- }
- }
- return $params;
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a boolean.
- *
- * @param string $command
- * @param array $arguments
- * @return boolean
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getBoolean($command, array $arguments)
- {
- $result = $this->getString($command, $arguments);
- switch ($result) {
- case 'true': return TRUE;
- case 'false': return FALSE;
- default: {
- throw new PHPUnit_Framework_Exception(
- 'Result is neither "true" nor "false": ' . PHPUnit_Util_Type::export($result)
- );
- }
- }
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a number.
- *
- * @param string $command
- * @param array $arguments
- * @return numeric
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getNumber($command, array $arguments)
- {
- $result = $this->getString($command, $arguments);
- if (!is_numeric($result)) {
- throw new PHPUnit_Framework_Exception(
- 'Result is not numeric: ' . PHPUnit_Util_Type::export($result)
- );
- }
- return $result;
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a string.
- *
- * @param string $command
- * @param array $arguments
- * @return string
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getString($command, array $arguments)
- {
- try {
- $result = $this->doCommand($command, $arguments);
- }
- catch (RuntimeException $e) {
- throw $e;
- }
- return (strlen($result) > 3) ? substr($result, 3) : '';
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as an array of strings.
- *
- * @param string $command
- * @param array $arguments
- * @return array
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getStringArray($command, array $arguments)
- {
- $csv = $this->getString($command, $arguments);
- $token = '';
- $tokens = array();
- $letters = preg_split('//', $csv, -1, PREG_SPLIT_NO_EMPTY);
- $count = count($letters);
- for ($i = 0; $i < $count; $i++) {
- $letter = $letters[$i];
- switch($letter) {
- case '\\': {
- $letter = $letters[++$i];
- $token .= $letter;
- }
- break;
- case ',': {
- $tokens[] = $token;
- $token = '';
- }
- break;
- default: {
- $token .= $letter;
- }
- }
- }
- $tokens[] = $token;
- return $tokens;
- }
- public function getVerificationErrors()
- {
- return $this->verificationErrors;
- }
- public function clearVerificationErrors()
- {
- $this->verificationErrors = array();
- }
- protected function assertCommand($command, $arguments, $info)
- {
- $method = $info['originalMethod'];
- $requiresTarget = $info['requiresTarget'];
- $result = $this->__call($method, $arguments);
- $message = "Failed command: " . $command . "('"
- . (array_key_exists(0, $arguments) ? $arguments[0] . "'" : '')
- . (array_key_exists(1, $arguments) ? ", '" . $arguments[1] . "'" : '')
- . ")";
- if ($info['isBoolean']) {
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertTrue($result, $message);
- } else {
- PHPUnit_Framework_Assert::assertFalse($result, $message);
- }
- } else {
- if ($requiresTarget === TRUE) {
- $expected = $arguments[1];
- } else {
- $expected = $arguments[0];
- }
- if (strpos($expected, 'exact:') === 0) {
- $expected = substr($expected, strlen('exact:'));
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertEquals($expected, $result, $message);
- } else {
- PHPUnit_Framework_Assert::assertNotEquals($expected, $result, $message);
- }
- } else {
- $caseInsensitive = FALSE;
- if (strpos($expected, 'regexp:') === 0) {
- $expected = substr($expected, strlen('regexp:'));
- }
- else if (strpos($expected, 'regexpi:') === 0) {
- $expected = substr($expected, strlen('regexpi:'));
- $caseInsensitive = TRUE;
- }
- else {
- if (strpos($expected, 'glob:') === 0) {
- $expected = substr($expected, strlen('glob:'));
- }
- $expected = '^' . str_replace(
- array('*', '?'), array('.*', '.?'), $expected
- ) . '$';
- }
- $expected = '/' . str_replace('/', '\/', $expected) . '/';
- if ($caseInsensitive) {
- $expected .= 'i';
- }
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertRegExp(
- $expected, $result, $message
- );
- } else {
- PHPUnit_Framework_Assert::assertNotRegExp(
- $expected, $result, $message
- );
- }
- }
- }
- }
- protected function verifyCommand($command, $arguments, $info)
- {
- try {
- $this->assertCommand($command, $arguments, $info);
- }
- catch (PHPUnit_Framework_AssertionFailedError $e) {
- array_push($this->verificationErrors, $e->toString());
- }
- }
- protected function waitForCommand($command, $arguments, $info)
- {
- $lastExceptionMessage = '';
- for ($second = 0; ; $second++) {
- if ($second > $this->httpTimeout) {
- PHPUnit_Framework_Assert::fail(
- "WaitFor timeout. \n"
- . "Last exception message: \n" . $lastExceptionMessage
- );
- }
- try {
- $this->assertCommand($command, $arguments, $info);
- return;
- }
- catch (Exception $e) {
- $lastExceptionMessage = $e->getMessage();
- }
- sleep(1);
- }
- }
- /**
- * Parses the docblock of PHPUnit_Extensions_SeleniumTestCase_Driver::__call
- * for get*(), is*(), assert*(), verify*(), assertNot*(), verifyNot*(),
- * store*(), waitFor*(), and waitForNot*() methods.
- */
- protected static function autoGenerateCommands()
- {
- $method = new ReflectionMethod(__CLASS__, '__call');
- $docComment = $method->getDocComment();
- if (preg_match_all('(@method\s+(\w+)\s+([\w]+)\((.*)\))', $docComment, $matches)) {
- foreach ($matches[2] as $methodKey => $method) {
- if (preg_match('/^(get|is)([A-Z].+)$/', $method, $methodMatches)) {
- $baseName = $methodMatches[2];
- $isBoolean = $methodMatches[1] == 'is';
- $requiresTarget = (strlen($matches[3][$methodKey]) > 0);
- if (preg_match('/^(.*)Present$/', $baseName, $methodMatches)) {
- $notBaseName = $methodMatches[1] . 'NotPresent';
- } else {
- $notBaseName = 'Not' . $baseName;
- }
- self::$autoGeneratedCommands['store' . $baseName] = array(
- 'functionHelper' => FALSE
- );
- self::$autoGeneratedCommands['assert' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'assertCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['assert' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'assertCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['verify' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'verifyCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['verify' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'verifyCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['waitFor' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'waitForCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['waitFor' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'waitForCommand',
- 'requiresTarget' => $requiresTarget
- );
- }
- }
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * Class to hold the special keys Unicode entities
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.0
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/value
- */
- class PHPUnit_Extensions_Selenium2TestCase_Keys
- {
- const NULL = "\xEE\x80\x80";
- const CANCEL = "\xEE\x80\x81";
- const HELP = "\xEE\x80\x82";
- const BACKSPACE = "\xEE\x80\x83";
- const TAB = "\xEE\x80\x84";
- const CLEAR = "\xEE\x80\x85";
- const RETURN_ = "\xEE\x80\x86";
- const ENTER = "\xEE\x80\x87";
- const SHIFT = "\xEE\x80\x88";
- const CONTROL = "\xEE\x80\x89";
- const ALT = "\xEE\x80\x8A";
- const PAUSE = "\xEE\x80\x8B";
- const ESCAPE = "\xEE\x80\x8C";
- const SPACE = "\xEE\x80\x8D";
- const PAGEUP = "\xEE\x80\x8E";
- const PAGEDOWN = "\xEE\x80\x8F";
- const END = "\xEE\x80\x90";
- const HOME = "\xEE\x80\x91";
- const LEFT = "\xEE\x80\x92";
- const UP = "\xEE\x80\x93";
- const RIGHT = "\xEE\x80\x94";
- const DOWN = "\xEE\x80\x95";
- const INSERT = "\xEE\x80\x96";
- const DELETE = "\xEE\x80\x97";
- const SEMICOLON = "\xEE\x80\x98";
- const EQUALS = "\xEE\x80\x99";
- const NUMPAD0 = "\xEE\x80\x9A";
- const NUMPAD1 = "\xEE\x80\x9B";
- const NUMPAD2 = "\xEE\x80\x9C";
- const NUMPAD3 = "\xEE\x80\x9D";
- const NUMPAD4 = "\xEE\x80\x9E";
- const NUMPAD5 = "\xEE\x80\x9F";
- const NUMPAD6 = "\xEE\x80\xA0";
- const NUMPAD7 = "\xEE\x80\xA1";
- const NUMPAD8 = "\xEE\x80\xA2";
- const NUMPAD9 = "\xEE\x80\xA3";
- const MULTIPLY = "\xEE\x80\xA4";
- const ADD = "\xEE\x80\xA5";
- const SEPARATOR = "\xEE\x80\xA6";
- const SUBTRACT = "\xEE\x80\xA7";
- const DECIMAL = "\xEE\x80\xA8";
- const DIVIDE = "\xEE\x80\xA9";
- const F1 = "\xEE\x80\xB1";
- const F2 = "\xEE\x80\xB2";
- const F3 = "\xEE\x80\xB3";
- const F4 = "\xEE\x80\xB4";
- const F5 = "\xEE\x80\xB5";
- const F6 = "\xEE\x80\xB6";
- const F7 = "\xEE\x80\xB7";
- const F8 = "\xEE\x80\xB8";
- const F9 = "\xEE\x80\xB9";
- const F10 = "\xEE\x80\xBA";
- const F11 = "\xEE\x80\xBB";
- const F12 = "\xEE\x80\xBC";
- const COMMAND = "\xEE\x80\xBD";
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Adds a cookie.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- {
- private $name;
- private $value;
- private $path;
- private $domain;
- private $secure = FALSE;
- private $expiry;
- public function __construct($cookieFacade, $name, $value)
- {
- $this->cookieFacade = $cookieFacade;
- $this->name = $name;
- $this->value = $value;
- }
- /**
- * @param string
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function path($path)
- {
- $this->path = $path;
- return $this;
- }
- /**
- * @param string
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function domain($domain)
- {
- $this->domain = $domain;
- return $this;
- }
- /**
- * @param boolean
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function secure($secure)
- {
- $this->secure = $secure;
- return $this;
- }
- /**
- * @param integer
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function expiry($expiry)
- {
- $this->expiry = $expiry;
- return $this;
- }
- /**
- * @return void
- */
- public function set()
- {
- $cookieData = array(
- 'name' => $this->name,
- 'value' => $this->value,
- 'secure' => $this->secure,
- );
- foreach (array('path', 'domain', 'expiry') as $parameter) {
- if ($this->$parameter !== NULL) {
- $cookieData[$parameter] = $this->$parameter;
- }
- }
- $this->cookieFacade->postCookie($cookieData);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Manages timeouts for the current browser session.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- * @method implicitWait(int $ms) Sets timeout when searching for elements
- * @method asyncScript(int $ms) Sets timeout for asynchronous scripts executed by Session::executeAsync()
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts
- extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- private $maximumTimeout;
- private $lastImplicitWaitValue = 0;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- $maximumTimeout)
- {
- parent::__construct($driver, $url);
- $this->maximumTimeout = $maximumTimeout;
- }
- protected function initCommands()
- {
- $self = $this;
- return array(
- 'implicitWait' => function ($milliseconds, $commandUrl) use ($self) {
- $self->check($milliseconds);
- $self->setLastImplicitWaitValue($milliseconds);
- $jsonParameters = array('ms' => $milliseconds);
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $commandUrl);
- },
- 'asyncScript' => function ($milliseconds, $commandUrl) use ($self) {
- $self->check($milliseconds);
- $jsonParameters = array('ms' => $milliseconds);
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $commandUrl);
- },
- );
- }
- public function setLastImplicitWaitValue($implicitWait)
- {
- $this->lastImplicitWaitValue = $implicitWait;
- }
- public function getLastImplicitWaitValue()
- {
- return $this->lastImplicitWaitValue;
- }
- public function check($timeout)
- {
- if ($timeout > $this->maximumTimeout) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('There is no use in setting this timeout unless you also call $this->setSeleniumServerRequestsTimeout($seconds) in setUp().');
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Manage the local storage HTML 5 database.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Storage
- {
- private $driver;
- private $url;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_Driver $driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- }
- public function __set($name, $value)
- {
- $this->driver->curl('POST', $this->url, array(
- 'key' => $name,
- 'value' => (string)$value
- ));
- }
- public function __get($name)
- {
- return $this->driver->curl(
- 'GET',
- $this->url->descend('key')->descend($name)
- )->getValue();
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Adds and remove cookies.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Cookie
- {
- private $driver;
- private $url;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_Driver $driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- }
- /**
- * @param string $name
- * @param string $value
- * @return void
- */
- public function add($name, $value)
- {
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder($this, $name, $value);
- }
- /**
- * @param string $name
- * @return string
- */
- public function get($name)
- {
- $cookies = $this->driver->curl('GET', $this->url)->getValue();
- foreach ($cookies as $cookie) {
- if ($cookie['name'] == $name) {
- return $cookie['value'];
- }
- }
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is no '$name' cookie available on this page.");
- }
- /**
- * @param string $name
- * @return void
- */
- public function remove($name)
- {
- $url = $this->url->descend($name);
- $this->driver->curl('DELETE', $url);
- }
- /**
- * @return void
- */
- public function clear()
- {
- $this->driver->curl('DELETE', $this->url);
- }
- /**
- * @internal
- * @param array $data
- * @return void
- */
- public function postCookie(array $data)
- {
- $this->driver->curl('POST',
- $this->url,
- array(
- 'cookie' => $data
- ));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Indicates an exception during the execution of Selenium 2 commands.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Exception extends RuntimeException
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Object representing elements, or everything that may have subcommands.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Driver
- */
- protected $driver;
- /**
- * @var string the API URL for this element,
- */
- protected $url;
- /**
- * @var array instances of
- * PHPUnit_Extensions_Selenium2TestCase_ElementCommand
- */
- protected $commands;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- $this->commands = array();
- foreach ($this->initCommands() as $commandName => $handler) {
- if (is_string($handler)) {
- $this->commands[$commandName] = $this->factoryMethod($handler);
- } else if (is_callable($handler)) {
- $this->commands[$commandName] = $handler;
- } else {
- throw new InvalidArgumentException("Command $commandName is not configured correctly.");
- }
- }
- }
- /**
- * @return array class names, or
- * callables of the form function($parameter, $commandUrl)
- */
- protected abstract function initCommands();
- public function __call($commandName, $arguments)
- {
- $jsonParameters = $this->extractJsonParameters($arguments);
- $response = $this->driver->execute($this->newCommand($commandName, $jsonParameters));
- return $response->getValue();
- }
- protected function postCommand($name, PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $response = $this->driver->curl('POST',
- $this->url->addCommand($name),
- $criteria->getArrayCopy());
- return $response->getValue();
- }
- /**
- * @params string $commandClass a class name, descending from
- PHPUnit_Extensions_Selenium2TestCase_Command
- * @return callable
- */
- private function factoryMethod($commandClass)
- {
- return function($jsonParameters, $url) use ($commandClass) {
- return new $commandClass($jsonParameters, $url);
- };
- }
- private function extractJsonParameters($arguments)
- {
- $this->checkArguments($arguments);
- if (count($arguments) == 0) {
- return NULL;
- }
- return $arguments[0];
- }
- private function checkArguments($arguments)
- {
- if (count($arguments) > 1) {
- throw new Exception('You cannot call a command with multiple method arguments.');
- }
- }
- /**
- * @param string $commandName The called method name
- * defined as a key in initCommands()
- * @param array $jsonParameters
- * @return PHPUnit_Extensions_Selenium2TestCase_Command
- */
- protected function newCommand($commandName, $jsonParameters)
- {
- if (isset($this->commands[$commandName])) {
- $factoryMethod = $this->commands[$commandName];
- $url = $this->url->addCommand($commandName);
- $command = $factoryMethod($jsonParameters, $url);
- return $command;
- }
- throw new BadMethodCallException("The command '$commandName' is not existent or not supported yet.");
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.8
- */
- /**
- * Base class for implementing commands with special semantics.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_ScreenshotListener implements PHPUnit_Framework_TestListener
- {
- private $directory;
- public function __construct($directory)
- {
- $this->directory = $directory;
- }
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->storeAScreenshot($test);
- }
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->storeAScreenshot($test);
- }
- private function storeAScreenshot(PHPUnit_Framework_Test $test)
- {
- if ($test instanceof PHPUnit_Extensions_Selenium2TestCase)
- {
- try {
- $file = $this->directory . '/' . get_class($test) . '__' . $test->getName() . '__' . date('Y-m-d\TH-i-s') . '.png';
- file_put_contents($file, $test->currentScreenshot());
- } catch (Exception $e) {
- $file = $this->directory . '/' . get_class($test) . '__' . $test->getName() . '__' . date('Y-m-d\TH-i-s') . '.txt';
- file_put_contents($file, "Screenshot generation doesn't work." . "\n"
- . $e->getMessage() . "\n"
- . $e->getTraceAsString());
- }
- }
- }
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function startTest(PHPUnit_Framework_Test $test) {}
- public function endTest(PHPUnit_Framework_Test $test, $time) {}
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {}
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {}
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Base class for implementing commands with special semantics.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_Command
- {
- protected $jsonParameters;
- private $commandName;
- /**
- * @param array $jsonParameters null in case of no parameters
- */
- public function __construct($jsonParameters,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_array($jsonParameters) && $jsonParameters !== NULL) {
- throw new InvalidArgumentException("The JSON parameters must be an array, or a NULL value in case they are not required.");
- }
- $this->jsonParameters = $jsonParameters;
- $this->url = $url;
- }
- public function url()
- {
- return $this->url;
- }
- /**
- * @return string
- */
- abstract public function httpMethod();
- /**
- * @param array $jsonParameters null in case of no parameters
- */
- public function jsonParameters()
- {
- return $this->jsonParameters;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.5
- */
- /**
- * Gets or sets an attribute of an object.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.5
- */
- class PHPUnit_Extensions_Selenium2TestCase_StateCommand
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Object representing a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method string attribute($name) Retrieves an element's attribute
- * @method void clear() Empties the content of a form element.
- * @method void click() Clicks on element
- * @method string css($propertyName) Retrieves the value of a CSS property
- * @method bool displayed() Checks an element's visibility
- * @method bool enabled() Checks a form element's state
- * @method bool equals(PHPUnit_Extensions_Selenium2TestCase_Element $another) Checks if the two elements are the same on the page
- * @method array location() Retrieves the element's position in the page: keys 'x' and 'y' in the returned array
- * @method bool selected() Checks the state of an option or other form element
- * @method array size() Retrieves the dimensions of the element: 'width' and 'height' of the returned array
- * @method void submit() Submits a form; can be called on its children
- * @method string text() Get content of ordinary elements
- */
- class PHPUnit_Extensions_Selenium2TestCase_Element
- extends PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- {
- /**
- * @return \self
- * @throws InvalidArgumentException
- */
- public static function fromResponseValue(
- array $value,
- PHPUnit_Extensions_Selenium2TestCase_URL $parentFolder,
- PHPUnit_Extensions_Selenium2TestCase_Driver $driver)
- {
- if (!isset($value['ELEMENT'])) {
- throw new InvalidArgumentException('Element not found.');
- }
- $url = $parentFolder->descend($value['ELEMENT']);
- return new self($driver, $url);
- }
- /**
- * @return integer
- */
- public function getId()
- {
- return $this->url->lastSegment();
- }
- /**
- * @return array class names
- */
- protected function initCommands()
- {
- return array(
- 'attribute' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Attribute',
- 'clear' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'click' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Click',
- 'css' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Css',
- 'displayed' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'enabled' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'equals' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Equals',
- 'location' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'name' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'selected' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'size' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'submit' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'text' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'value' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Value',
- 'tap' => $this->touchCommandFactoryMethod('touch/click'),
- 'scroll' => $this->touchCommandFactoryMethod('touch/scroll'),
- 'doubletap' => $this->touchCommandFactoryMethod('touch/doubleclick'),
- 'longtap' => $this->touchCommandFactoryMethod('touch/longclick'),
- 'flick' => $this->touchCommandFactoryMethod('touch/flick')
- );
- }
- protected function getSessionUrl()
- {
- return $this->url->ascend()->ascend();
- }
- private function touchCommandFactoryMethod($urlSegment)
- {
- $url = $this->getSessionUrl()->addCommand($urlSegment);
- $self = $this;
- return function ($jsonParameters, $commandUrl) use ($url, $self) {
- if ((is_array($jsonParameters) &&
- !isset($jsonParameters['element'])) ||
- is_null($jsonParameters)) {
- $jsonParameters['element'] = $self->getId();
- }
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $url);
- };
- }
- /**
- * Retrieves the tag name
- * @return string
- */
- public function name()
- {
- return strtolower(parent::name());
- }
- /**
- * Generates an array that is structured as the WebDriver Object of the JSONWireProtocoll
- *
- * @return array
- */
- public function toWebDriverObject()
- {
- return array('ELEMENT' => (string)$this->getId());
- }
- /**
- * Get or set value of form elements. If the element already has a value, the set one will be appended to it.
- * Created **ONLY** for keeping backward compatibility, since in selenium v2.42.0 it was removed
- * The currently recommended solution is to use `$element->attribute('value')`
- * @see https://code.google.com/p/selenium/source/detail?r=953007b48e83f90450f3e41b11ec31e2928f1605
- * @see https://code.google.com/p/selenium/source/browse/java/CHANGELOG
- *
- * @param string $newValue
- * @return null|string
- */
- public function value($newValue = NULL)
- {
- if ($newValue !== NULL) {
- return parent::value($newValue);
- }
- return $this->attribute('value');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Object representing an HTTP response from the Selenium Server.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_Response
- {
- /**
- * @var array decoded response
- */
- private $jsonResponse;
- /**
- * @var array CURL info for the response.
- */
- private $info;
- public function __construct($jsonResponse, $info)
- {
- $this->jsonResponse = $jsonResponse;
- $this->info = $info;
- }
- public function getValue()
- {
- if (isset($this->jsonResponse['value'])) {
- return $this->jsonResponse['value'];
- }
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function getURL()
- {
- $url = $this->info['url'];
- $sessionId = $this->jsonResponse['sessionId'];
- // if url doesn't have sessionId included - append it manually
- // this change was performed in selenium v2.34
- // @see https://code.google.com/p/selenium/issues/detail?id=6089
- // @see https://github.com/sebastianbergmann/phpunit-selenium/issues/265
- if (strpos($url, $sessionId) === FALSE) {
- $url .= '/' . $sessionId;
- }
- return new PHPUnit_Extensions_Selenium2TestCase_URL($url);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.9
- */
- /**
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException
- extends PHPUnit_Extensions_Selenium2TestCase_Exception
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Keeps a Session object shared between test runs to save time.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared
- implements PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- private $original;
- private $session;
- private $mainWindow;
- private $lastTestWasNotSuccessful = FALSE;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_SessionStrategy $originalStrategy)
- {
- $this->original = $originalStrategy;
- }
- public function session(array $parameters)
- {
- if ($this->lastTestWasNotSuccessful) {
- if ($this->session !== NULL) {
- $this->session->stop();
- $this->session = NULL;
- }
- $this->lastTestWasNotSuccessful = FALSE;
- }
- if ($this->session === NULL) {
- $this->session = $this->original->session($parameters);
- $this->mainWindow = $this->session->windowHandle();
- } else {
- $this->session->window($this->mainWindow);
- }
- return $this->session;
- }
- public function notSuccessfulTest()
- {
- $this->lastTestWasNotSuccessful = TRUE;
- }
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL)
- {
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Produces a new Session object shared for each test.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated
- implements PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- public function session(array $parameters)
- {
- $seleniumServerUrl = PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($parameters['host'], $parameters['port']);
- $driver = new PHPUnit_Extensions_Selenium2TestCase_Driver($seleniumServerUrl, $parameters['seleniumServerRequestsTimeout']);
- $capabilities = array_merge($parameters['desiredCapabilities'],
- array(
- 'browserName' => $parameters['browserName']
- ));
- $session = $driver->startSession($capabilities, $parameters['browserUrl']);
- return $session;
- }
- public function notSuccessfulTest()
- {
- }
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL)
- {
- if ($session !== NULL) {
- $session->stop();
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks ok on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Click
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Checks equality (same element on the page) with another DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Equals
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $parameter
- */
- public function __construct($parameter,
- PHPUnit_Extensions_Selenium2TestCase_URL $equalsResourceBaseUrl)
- {
- $this->jsonParameters = array();
- if (!($parameter instanceof PHPUnit_Extensions_Selenium2TestCase_Element)) {
- throw new InvalidArgumentException("Elements can only test equality with other Element instances.");
- }
- $this->url = $equalsResourceBaseUrl->descend($parameter->getId());
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Class for implementing commands that just return a value
- * (obtained with GET).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2012 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Class for implementing commands that just accomplishes an action (via POST).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2012 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Get and set the element's value attribute.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Value
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- throw new BadMethodCallException("JSON Wire Protocol only supports POST to /value now. To get the value of an element GET /attribute/:naem should be used and this object should never be involved.");
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Retrieves an attribute of a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Attribute
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $parameter
- */
- public function __construct($parameter,
- PHPUnit_Extensions_Selenium2TestCase_URL $attributeResourceBaseUrl)
- {
- $this->jsonParameters = array();
- $this->url = $attributeResourceBaseUrl->descend($parameter);
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Retrieves the value of a CSS property.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Css
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $propertyName
- */
- public function __construct($propertyName,
- PHPUnit_Extensions_Selenium2TestCase_URL $cssResourceBaseUrl)
- {
- $this->jsonParameters = array();
- $this->url = $cssResourceBaseUrl->descend($propertyName);
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Conditions for selecting a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCriteria extends ArrayObject
- {
- public function __construct($strategy)
- {
- $this['using'] = $strategy;
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_ElementCriteria
- */
- public function value($searchTarget)
- {
- $this['value'] = $searchTarget;
- return $this;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.5
- */
- /**
- * Object representing a browser window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.5
- * @method array size(array $size = null) Window size as array('width' => $x, 'height' => $y)
- * @method array position(array $position = null) Window position as array('x' => $x, 'y' => $y)
- * @method array maximize() Maximize window
- */
- class PHPUnit_Extensions_Selenium2TestCase_Window extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @return array class names
- */
- protected function initCommands()
- {
- return array(
- 'size' => 'PHPUnit_Extensions_Selenium2TestCase_StateCommand',
- 'position' => 'PHPUnit_Extensions_Selenium2TestCase_StateCommand',
- 'maximize' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- );
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Driver for creating browser session with Selenium 2 (WebDriver API).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_Driver
- {
- private $seleniumServerUrl;
- private $seleniumServerRequestsTimeout;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_URL $seleniumServerUrl, $timeout = 60)
- {
- $this->seleniumServerUrl = $seleniumServerUrl;
- $this->seleniumServerRequestsTimeout = $timeout;
- }
- public function startSession(array $desiredCapabilities, PHPUnit_Extensions_Selenium2TestCase_URL $browserUrl)
- {
- $sessionCreation = $this->seleniumServerUrl->descend("/wd/hub/session");
- $response = $this->curl('POST', $sessionCreation, array(
- 'desiredCapabilities' => $desiredCapabilities
- ));
- $sessionPrefix = $response->getURL();
- $timeouts = new PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts(
- $this,
- $sessionPrefix->descend('timeouts'),
- $this->seleniumServerRequestsTimeout * 1000
- );
- return new PHPUnit_Extensions_Selenium2TestCase_Session(
- $this,
- $sessionPrefix,
- $browserUrl,
- $timeouts
- );
- }
- /**
- * Performs an HTTP request to the Selenium 2 server.
- *
- * @param string $method 'GET'|'POST'|'DELETE'|...
- * @param string $url
- * @param array $params JSON parameters for POST requests
- */
- public function curl($http_method,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- $params = NULL)
- {
- $curl = curl_init($url->getValue());
- curl_setopt($curl, CURLOPT_TIMEOUT, $this->seleniumServerRequestsTimeout);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($curl,
- CURLOPT_HTTPHEADER,
- array(
- 'Content-type: application/json;charset=UTF-8',
- 'Accept: application/json;charset=UTF-8'
- ));
- if ($http_method === 'POST') {
- curl_setopt($curl, CURLOPT_POST, TRUE);
- if ($params && is_array($params)) {
- curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
- } else {
- curl_setopt($curl, CURLOPT_POSTFIELDS, '');
- }
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
- } else if ($http_method == 'DELETE') {
- curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
- }
- $rawResponse = trim(curl_exec($curl));
- if (curl_errno($curl)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException(
- 'Error connection[' . curl_errno($curl) . '] to ' .
- $url->getValue() . ': ' . curl_error($curl)
- );
- }
- $info = curl_getinfo($curl);
- if ($info['http_code'] == 0) {
- throw new PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException();
- }
- if ($info['http_code'] == 404) {
- throw new BadMethodCallException("The command $url is not recognized by the server.");
- }
- curl_close($curl);
- $content = json_decode($rawResponse, TRUE);
- if ($info['http_code'] == 500) {
- $message = '';
- if (isset($content['value']['message'])) {
- $message .= $content['value']['message'];
- } else {
- $message .= "Internal server error while executing $http_method request at $url. Response: " . var_export($content, TRUE);
- }
- if (isset($content['value']['class'])) {
- $message .= PHP_EOL . $content['value']['class'];
- }
- throw new PHPUnit_Extensions_Selenium2TestCase_WebDriverException($message, isset($content['status']) ? $content['status'] : 13);
- }
- return new PHPUnit_Extensions_Selenium2TestCase_Response($content, $info);
- }
- public function execute(PHPUnit_Extensions_Selenium2TestCase_Command $command)
- {
- return $this->curl($command->httpMethod(),
- $command->url(),
- $command->jsonParameters());
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * The WaitUntil implementation, inspired by Java and .NET clients
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.12
- * @see http://selenium.googlecode.com/svn/trunk/dotnet/src/WebDriver.Support/UI/WebDriverWait.cs
- * @see http://selenium.googlecode.com/svn/trunk/java/client/src/org/openqa/selenium/support/ui/FluentWait.java
- */
- class PHPUnit_Extensions_Selenium2TestCase_WaitUntil
- {
- /**
- * PHPUnit Test Case instance
- *
- * @var PHPUnit_Extensions_Selenium2TestCase
- */
- private $_testCase;
- /**
- * Default timeout, ms
- *
- * @var int
- */
- private $_defaultTimeout = 0;
- /**
- * The sleep interval between iterations, ms
- *
- * @var int
- */
- private $_defaultSleepInterval = 500;
- /**
- * @param PHPUnit_Extensions_Selenium2TestCase $testCase
- */
- public function __construct(PHPUnit_Extensions_Selenium2TestCase $testCase)
- {
- $this->_testCase = $testCase;
- }
- /**
- * @param $callback Callback to run until it returns not null or timeout occurs
- * @param null $timeout
- * @return mixed
- * @throws PHPUnit_Extensions_Selenium2TestCase_Exception
- * @throws PHPUnit_Extensions_Selenium2TestCase_WebDriverException
- */
- public function run($callback, $timeout = NULL)
- {
- if (!is_callable($callback)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('The valid callback is expected');
- }
- // if there was an implicit timeout specified - remember it and temporarily turn it off
- $implicitWait = $this->_testCase->timeouts()->getLastImplicitWaitValue();
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait(0);
- }
- if (is_null($timeout)) {
- $timeout = $this->_defaultTimeout;
- }
- $timeout /= 1000;
- $endTime = microtime(TRUE) + $timeout;
- $lastException = NULL;
- while (TRUE) {
- try {
- $result = call_user_func($callback, $this->_testCase);
- if (!is_null($result)) {
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait($implicitWait);
- }
- return $result;
- }
- } catch(Exception $e) {
- $lastException = $e;
- }
- if (microtime(TRUE) > $endTime) {
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait($implicitWait);
- }
- $message = "Timed out after {$timeout} second" . ($timeout != 1 ? 's' : '');
- throw new PHPUnit_Extensions_Selenium2TestCase_WebDriverException($message,
- PHPUnit_Extensions_Selenium2TestCase_WebDriverException::Timeout, $lastException);
- }
- usleep($this->_defaultSleepInterval * 1000);
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Christian Becker <chris@beckr.org>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since
- */
- /**
- * Indicates an exception as a result of a non-sucessful WebDriver response status code.
- *
- * @package PHPUnit_Selenium
- * @author Christian Becker <chris@beckr.org>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since
- */
- class PHPUnit_Extensions_Selenium2TestCase_WebDriverException extends PHPUnit_Extensions_Selenium2TestCase_Exception
- {
- /* @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Response_Status_Codes */
- const Success = 0;
- const NoSuchDriver = 6;
- const NoSuchElement = 7;
- const NoSuchFrame = 8;
- const UnknownCommand = 9;
- const StaleElementReference = 10;
- const ElementNotVisible = 11;
- const InvalidElementState = 12;
- const UnknownError = 13;
- const ElementIsNotSelectable = 15;
- const JavaScriptError = 17;
- const XPathLookupError = 19;
- const Timeout = 21;
- const NoSuchWindow = 23;
- const InvalidCookieDomain = 24;
- const UnableToSetCookie = 25;
- const UnexpectedAlertOpen = 26;
- const NoAlertOpenError = 27;
- const ScriptTimeout = 28;
- const InvalidElementCoordinates = 29;
- const IMENotAvailable = 30;
- const IMEEngineActivationFailed = 31;
- const InvalidSelector = 32;
- const SessionNotCreatedException = 33;
- const MoveTargetOutOfBounds = 34;
- }<?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Christian Soronellas <csoronellas@emagister.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or sets the current URL of the window.
- *
- * @package PHPUnit_Selenium
- * @author Christian Soronellas <csoronellas@emagister.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($jsonParameters,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if ($jsonParameters === NULL) {
- parent::__construct(NULL, $url);
- } else {
- $jsonParameters = $this->keysForText($jsonParameters);
- parent::__construct($jsonParameters, $url);
- }
- }
- /**
- * @return string
- */
- public function httpMethod()
- {
- return 'POST';
- }
- /**
- * Given a string returns an array of the characters that compose the string
- *
- * @param string $text
- * @throws InvalidArgumentException
- * @return array
- */
- public function keysForText($text)
- {
- if (is_scalar($text)) {
- return array('value' => preg_split('//u', (string) $text, -1, PREG_SPLIT_NO_EMPTY));
- }
- if (is_array($text)) {
- return $text;
- }
- throw new InvalidArgumentException('The "text" argument should be a string or an array of special characters!');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.13
- */
- /**
- * Sends session click command for emulating LEFT, MIDDLE or RIGHT mouse buttons
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.13
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Click
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- const LEFT = 0;
- const MIDDLE = 1;
- const RIGHT = 2;
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (is_null($argument)) {
- $jsonParameters = NULL;
- } elseif (!is_scalar($argument) || !in_array($argument, array(
- self::LEFT, self::RIGHT, self::MIDDLE
- ))) {
- throw new BadMethodCallException('Wrong parameter for click(): expecting 0, 1 or 2.');
- } else {
- $jsonParameters = array('button' => $argument);
- }
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Location
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- {
- public function __construct($location, $commandUrl)
- {
- if ($location !== NULL) {
- $jsonParameters = array('location' => $location);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets an attribute from the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.3.2
- */
- /**
- * Sends a file to a RC
- * Returns the FQ path to the transfered file
- *
- * @package PHPUnit_Selenium
- * @author Kevin Ran <heilong24@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_File
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @var
- */
- private static $_zipArchive;
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_file($argument)) {
- throw new BadMethodCallException("No such file: {$argument}");
- }
- $zipfile_path = $this->_zipArchiveFile($argument);
- $contents = file_get_contents($zipfile_path);
- if ($contents === false) {
- throw new Exception("Unable to read generated zip file: {$zipfile_path}");
- }
- $file = base64_encode($contents);
- parent::__construct(array('file' => $file), $url);
- unlink($zipfile_path);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- /**
- * Creates a zip archive with the given file
- *
- * @param string $file_path FQ path to file
- * @return string Generated zip file
- */
- protected function _zipArchiveFile( $file_path )
- {
- // file MUST be readable
- if( !is_readable( $file_path ) ) {
- throw new Exception( "Unable to read {$file_path}" );
- } // if !file_data
- $filename_hash = sha1( time() . $file_path );
- $tmp_dir = $this->_getTmpDir();
- $zip_filename = "{$tmp_dir}{$filename_hash}.zip";
- $zip = $this->_getZipArchiver();
- if ($zip->open($zip_filename, ZIPARCHIVE::CREATE) === FALSE) {
- throw new Exception( "Unable to create zip archive: {$zip_filename}" );
- }
- $zip->addFile($file_path, basename($file_path));
- $zip->close();
- return $zip_filename;
- }
- /**
- * Returns a runtime instance of a ZipArchive
- *
- * @return ZipArchive
- */
- protected function _getZipArchiver()
- {
- // create ZipArchive if necessary
- if (!static::$_zipArchive) {
- static::$_zipArchive = new ZipArchive();
- }
- return static::$_zipArchive;
- }
- /**
- * Calls sys_get_temp_dir and ensures that it has a trailing slash
- * ( behavior varies across systems )
- *
- * @return string
- */
- protected function _getTmpDir()
- {
- return rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks Ok on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AcceptAlert
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Obtains the text of an alert, or types into a prompt.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AlertText
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (is_string($argument)) {
- $jsonParameters =array('text' => $argument);
- } else if ($argument == NULL) {
- $jsonParameters = NULL;
- } else {
- throw new BadMethodCallException('Wrong parameters for alertText().');
- }
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or sets the current URL of the window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Url
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($url, $commandUrl, PHPUnit_Extensions_Selenium2TestCase_URL $baseUrl)
- {
- if ($url !== NULL) {
- $absoluteLocation = $baseUrl->jump($url)->getValue();
- $jsonParameters = array('url' => $absoluteLocation);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Changes the focus to a window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Window
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($name, $commandUrl)
- {
- $jsonParameters = array('name' => $name);
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.8
- */
- /**
- * Moves the mouse pointer.
- *
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_MoveTo
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($element,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_array($element)) {
- $element = array(
- 'element' => $element,
- );
- }
- $validKeys = array(
- 'element' => NULL,
- 'xoffset' => NULL,
- 'yoffset' => NULL,
- );
- $jsonParameters = array_intersect_key($element, $validKeys);
- if (isset($jsonParameters['element'])) {
- if (!($jsonParameters['element'] instanceof PHPUnit_Extensions_Selenium2TestCase_Element)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('Only moving over an element is supported. Please pass a PHPUnit_Extensions_Selenium2TestCase_Element instance.');
- }
- $jsonParameters['element'] = $jsonParameters['element']->getId();
- }
- if (isset($jsonParameters['xoffset']) || isset($jsonParameters['yoffset'])) {
- // @see https://github.com/sebastianbergmann/phpunit-selenium/pull/250#issuecomment-21308153
- // @see https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/moveto
- error_log('Even though this method is a part of the WebDriver Wire protocol it might be not supported by your browser yet');
- }
- parent::__construct($jsonParameters, $url);
- }
- /**
- * @return string
- */
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Orientation
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- {
- public function __construct($orientation, $commandUrl)
- {
- if ($orientation !== NULL) {
- $jsonParameters = array('orientation' => $orientation);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Andrew Krasichkov <krasichkovandrew@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.3.2
- */
- /**
- * Get the log for a given log type. Log buffer is reset after each request.
- *
- * @package PHPUnit_Selenium
- * @author Andrew Krasichkov <krasichkovandrew@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Log
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($type, $commandUrl)
- {
- $jsonParameters = array('type' => $type);
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }<?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release
- */
- /**
- * Gets the active element from the session
- *
- * @package PHPUnit_Selenium
- * @author Marcel Erz <marcel.erz@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Active
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($jsonParameters, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $url = $url->addCommand('element')->addCommand('active');
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks Cancel on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_DismissAlert
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Changes the focus to a frame.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Frame
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($id, $commandUrl)
- {
- $jsonParameters = array(
- 'id' => $this->extractId($id)
- );
- parent::__construct($jsonParameters, $commandUrl);
- }
- /**
- * @param $id
- * @return array
- */
- private function extractId($id)
- {
- if ($this->isElement($id)) { //selenium-element
- return $id->toWebDriverObject();
- }
- //html-id or null
- return $id;
- }
- /**
- * @param $id
- * @return bool
- */
- private function isElement($id)
- {
- return $id instanceof PHPUnit_Extensions_Selenium2TestCase_Element;
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * URL Value Object allowing easy concatenation.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- final class PHPUnit_Extensions_Selenium2TestCase_URL
- {
- /**
- * @var string
- */
- private $value;
- /**
- * @param string $value
- */
- public function __construct($value)
- {
- $this->value = $value;
- }
- /**
- * @param string $host
- * @param int port
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public static function fromHostAndPort($host, $port)
- {
- return new self("http://{$host}:{$port}");
- }
- /**
- * @return string
- */
- public function getValue()
- {
- return $this->value;
- }
- public function __toString()
- {
- return $this->getValue();
- }
- /**
- * @param string $addition
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function descend($addition)
- {
- if ($addition == '') {
- // if we're adding nothing, respect the current url's choice of
- // whether or not to include a trailing slash; prevents inadvertent
- // adding of slashes to urls that can't handle it
- $newValue = $this->value;
- } else {
- $newValue = rtrim($this->value, '/')
- . '/'
- . ltrim($addition, '/');
- }
- return new self($newValue);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function ascend()
- {
- $lastSlash = strrpos($this->value, "/");
- $newValue = substr($this->value, 0, $lastSlash);
- return new self($newValue);
- }
- /**
- * @return string
- */
- public function lastSegment()
- {
- $segments = explode('/', $this->value);
- return end($segments);
- }
- /**
- * @param string $command
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function addCommand($command)
- {
- return $this->descend($this->camelCaseToUnderScores($command));
- }
- /**
- * @param string $newUrl
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function jump($newUrl)
- {
- if ($this->isAbsolute($newUrl)) {
- return new self($newUrl);
- } else {
- return $this->descend($newUrl);
- }
- }
- private function camelCaseToUnderScores($string)
- {
- $string = preg_replace('/([A-Z]{1,1})/', ' \1', $string);
- $string = strtolower($string);
- return str_replace(' ', '_', $string);
- }
- private function isAbsolute($urlValue)
- {
- return preg_match('/^(http|https):\/\//', $urlValue) > 0;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Specifies how to create Session objects for running tests.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- interface PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- /**
- * @param array $parameters 'host' => Selenium Server machine
- 'port' => Selenium Server port
- 'browser' => a browser name
- * 'browserUrl' => base URL to use during the test
- */
- public function session(array $parameters);
- public function notSuccessfulTest();
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL);
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * Class-mapper, that converts requested special key into correspondent Unicode character
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.12
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/value
- */
- class PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- {
- private $_keys = array(
- 'null' => "\xEE\x80\x80",
- 'cancel' => "\xEE\x80\x81",
- 'help' => "\xEE\x80\x82",
- 'backspace' => "\xEE\x80\x83",
- 'tab' => "\xEE\x80\x84",
- 'clear' => "\xEE\x80\x85",
- 'return' => "\xEE\x80\x86",
- 'enter' => "\xEE\x80\x87",
- 'shift' => "\xEE\x80\x88",
- 'control' => "\xEE\x80\x89",
- 'alt' => "\xEE\x80\x8A",
- 'pause' => "\xEE\x80\x8B",
- 'escape' => "\xEE\x80\x8C",
- 'space' => "\xEE\x80\x8D",
- 'pageup' => "\xEE\x80\x8E",
- 'pagedown' => "\xEE\x80\x8F",
- 'end' => "\xEE\x80\x90",
- 'home' => "\xEE\x80\x91",
- 'left' => "\xEE\x80\x92",
- 'up' => "\xEE\x80\x93",
- 'right' => "\xEE\x80\x94",
- 'down' => "\xEE\x80\x95",
- 'insert' => "\xEE\x80\x96",
- 'delete' => "\xEE\x80\x97",
- 'semicolon' => "\xEE\x80\x98",
- 'equals' => "\xEE\x80\x99",
- 'numpad0' => "\xEE\x80\x9A",
- 'numpad1' => "\xEE\x80\x9B",
- 'numpad2' => "\xEE\x80\x9C",
- 'numpad3' => "\xEE\x80\x9D",
- 'numpad4' => "\xEE\x80\x9E",
- 'numpad5' => "\xEE\x80\x9F",
- 'numpad6' => "\xEE\x80\xA0",
- 'numpad7' => "\xEE\x80\xA1",
- 'numpad8' => "\xEE\x80\xA2",
- 'numpad9' => "\xEE\x80\xA3",
- 'multiply' => "\xEE\x80\xA4",
- 'add' => "\xEE\x80\xA5",
- 'separator' => "\xEE\x80\xA6",
- 'subtract' => "\xEE\x80\xA7",
- 'decimal' => "\xEE\x80\xA8",
- 'divide' => "\xEE\x80\xA9",
- 'f1' => "\xEE\x80\xB1",
- 'f2' => "\xEE\x80\xB2",
- 'f3' => "\xEE\x80\xB3",
- 'f4' => "\xEE\x80\xB4",
- 'f5' => "\xEE\x80\xB5",
- 'f6' => "\xEE\x80\xB6",
- 'f7' => "\xEE\x80\xB7",
- 'f8' => "\xEE\x80\xB8",
- 'f9' => "\xEE\x80\xB9",
- 'f10' => "\xEE\x80\xBA",
- 'f11' => "\xEE\x80\xBB",
- 'f12' => "\xEE\x80\xBC",
- 'command' => "\xEE\x80\xBD",
- );
- public function specialKey($name)
- {
- $normalizedName = strtolower($name);
- if (!isset($this->_keys[$normalizedName])) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is no special key '$name' defined");
- }
- return $this->_keys[$normalizedName];
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- */
- /**
- * Provides access to /element and /elements commands
- *
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @param string $value e.g. 'container'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byClassName($value)
- {
- return $this->by('class name', $value);
- }
- /**
- * @param string $value e.g. 'div.container'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byCssSelector($value)
- {
- return $this->by('css selector', $value);
- }
- /**
- * @param string $value e.g. 'uniqueId'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byId($value)
- {
- return $this->by('id', $value);
- }
- /**
- * @param string $value e.g. 'Link text'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byLinkText($value)
- {
- return $this->by('link text', $value);
- }
- /**
- * @param string $value e.g. 'Link te'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byPartialLinkText($value)
- {
- return $this->by('partial link text', $value);
- }
- /**
- * @param string $value e.g. 'email_address'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byName($value)
- {
- return $this->by('name', $value);
- }
- /**
- * @param string $value e.g. 'body'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byTag($value)
- {
- return $this->by('tag name', $value);
- }
- /**
- * @param string $value e.g. '/div[@attribute="value"]'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byXPath($value)
- {
- return $this->by('xpath', $value);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function element(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $value = $this->postCommand('element', $criteria);
- return PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue(
- $value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- /**
- * @return array instances of PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function elements(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $values = $this->postCommand('elements', $criteria);
- $elements = array();
- foreach ($values as $value) {
- $elements[] =
- PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue(
- $value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- return $elements;
- }
- /**
- * @param string $strategy
- * @return PHPUnit_Extensions_Selenium2TestCase_ElementCriteria
- */
- public function using($strategy)
- {
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCriteria($strategy);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- protected abstract function getSessionUrl();
- /**
- * @param string $strategy supported by JsonWireProtocol element/ command
- * @param string $value
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- private function by($strategy, $value)
- {
- return $this->element($this->using($strategy)->value($value));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.2
- */
- /**
- * Object representing a <select> element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_Element_Select
- extends PHPUnit_Extensions_Selenium2TestCase_Element
- {
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element_Select
- */
- public static function fromElement(PHPUnit_Extensions_Selenium2TestCase_Element $element)
- {
- return new self($element->driver, $element->url);
- }
- /**
- * @return string
- */
- public function selectedLabel()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->text();
- }
- /**
- * @return string
- */
- public function selectedValue()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->value();
- }
- /**
- * @return string
- */
- public function selectedId()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->attribute('id');
- }
- /**
- * @return array
- */
- public function selectedLabels()
- {
- $labels = array();
- foreach ($this->selectedOptions() as $option) {
- $labels[] = $option->text();
- }
- return $labels;
- }
- /**
- * @return array
- */
- public function selectedValues()
- {
- $values = array();
- foreach ($this->selectedOptions() as $option) {
- $values[] = $option->value();
- }
- return $values;
- }
- /**
- * @return array
- */
- public function selectedIds()
- {
- $id = array();
- foreach ($this->selectedOptions() as $option) {
- $values[] = $option->attribute('id');
- }
- return $id;
- }
- /**
- * @param string $label the text appearing in the option
- * @return void
- */
- public function selectOptionByLabel($label)
- {
- $toSelect = $this->using('xpath')->value(".//option[.='$label']");
- $this->selectOptionByCriteria($toSelect);
- }
- /**
- * @param string $value the value attribute of the option
- * @return void
- */
- public function selectOptionByValue($value)
- {
- $toSelect = $this->using('xpath')->value(".//option[@value='$value']");
- $this->selectOptionByCriteria($toSelect);
- }
- /**
- * @param PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $localCriteria condiotions for selecting an option
- * @return void
- */
- public function selectOptionByCriteria(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $localCriteria)
- {
- $option = $this->element($localCriteria);
- if (!$option->selected()) {
- $option->click();
- }
- }
- /**
- * @return array
- */
- public function selectOptionValues()
- {
- $options = array();
- foreach ($this->options() as $option) {
- $options[] = $option->value();
- }
- return $options;
- }
- /**
- * @return array
- */
- public function selectOptionLabels()
- {
- $options = array();
- foreach ($this->options() as $option) {
- $options[] = $option->text();
- }
- return $options;
- }
- /***
- * @return array
- */
- private function selectedOptions()
- {
- $options = array();
- foreach ($this->options() as $option) {
- if ($option->selected()) {
- $options[] = $option;
- }
- }
- return $options;
- }
- public function clearSelectedOptions()
- {
- foreach ($this->selectedOptions() as $option) {
- $option->click();
- }
- }
- private function selectedOption()
- {
- foreach ($this->options() as $option) {
- if ($option->selected()) {
- return $option;
- }
- }
- return NULL;
- }
- private function options()
- {
- $onlyTheOptions = $this->using('css selector')->value('option');
- return $this->elements($onlyTheOptions);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Browser session for Selenium 2: main point of entry for functionality.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method void acceptAlert() Press OK on an alert, or confirms a dialog
- * @method mixed alertText($value = NULL) Gets the alert dialog text, or sets the text for a prompt dialog
- * @method void back()
- * @method void dismissAlert() Press Cancel on an alert, or does not confirm a dialog
- * @method void doubleclick() Double-clicks at the current mouse coordinates (set by moveto).
- * @method string execute(array $javaScriptCode) Injects arbitrary JavaScript in the page and returns the last. See unit tests for usage
- * @method string executeAsync(array $javaScriptCode) Injects arbitrary JavaScript and wait for the callback (last element of arguments) to be called. See unit tests for usage
- * @method void forward()
- * @method void frame(mixed $element) Changes the focus to a frame in the page (by frameCount of type int, htmlId of type string, htmlName of type string or element of type \PHPUnit_Extensions_Selenium2TestCase_Element)
- * @method void moveto(\PHPUnit_Extensions_Selenium2TestCase_Element $element) Move the mouse by an offset of the specificed element.
- * @method void refresh()
- * @method string source() Returns the HTML source of the page
- * @method string title()
- * @method void|string url($url = NULL)
- * @method void window($name) Changes the focus to another window
- * @method string windowHandle() Retrieves the current window handle
- * @method string windowHandles() Retrieves a list of all available window handles
- * @method string keys() Send a sequence of key strokes to the active element.
- * @method string file($file_path) Upload a local file. Returns the fully qualified path to the transferred file.
- * @method array log(string $type) Get the log for a given log type. Log buffer is reset after each request.
- * @method array logTypes() Get available log types.
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session
- extends PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- {
- /**
- * @var string the base URL for this session,
- * which all relative URLs will refer to
- */
- private $baseUrl;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts
- */
- private $timeouts;
- /**
- * @var boolean
- */
- private $stopped = FALSE;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- PHPUnit_Extensions_Selenium2TestCase_URL $baseUrl,
- PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts $timeouts)
- {
- $this->baseUrl = $baseUrl;
- $this->timeouts = $timeouts;
- parent::__construct($driver, $url);
- }
- /**
- * @return string
- */
- public function id()
- {
- return $this->url->lastSegment();
- }
- protected function initCommands()
- {
- $baseUrl = $this->baseUrl;
- return array(
- 'acceptAlert' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AcceptAlert',
- 'alertText' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AlertText',
- 'back' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'click' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Click',
- 'buttondown' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'buttonup' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'dismissAlert' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_DismissAlert',
- 'doubleclick' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'execute' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'executeAsync' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'forward' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'frame' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Frame',
- 'keys' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys',
- 'moveto' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_MoveTo',
- 'refresh' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'screenshot' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'source' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'title' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'log' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Log',
- 'logTypes' => $this->attributeCommandFactoryMethod('log/types'),
- 'url' => function ($jsonParameters, $commandUrl) use ($baseUrl) {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Url($jsonParameters, $commandUrl, $baseUrl);
- },
- 'window' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Window',
- 'windowHandle' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'windowHandles' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'touchDown' => $this->touchCommandFactoryMethod('touch/down'),
- 'touchUp' => $this->touchCommandFactoryMethod('touch/up'),
- 'touchMove' => $this->touchCommandFactoryMethod('touch/move'),
- 'touchScroll' => $this->touchCommandFactoryMethod('touch/scroll'),
- 'flick' => $this->touchCommandFactoryMethod('touch/flick'),
- 'location' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Location',
- 'orientation' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Orientation',
- 'file' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_File'
- );
- }
- private function attributeCommandFactoryMethod($urlSegment)
- {
- $url = $this->url->addCommand($urlSegment);
- return function ($jsonParameters, $commandUrl) use ($url) {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute($jsonParameters, $url);
- };
- }
- private function touchCommandFactoryMethod($urlSegment)
- {
- $url = $this->url->addCommand($urlSegment);
- return function ($jsonParameters, $commandUrl) use ($url) {
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $url);
- };
- }
- public function __destruct()
- {
- $this->stop();
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function getSessionUrl()
- {
- return $this->url;
- }
- /**
- * Closed the browser.
- * @return void
- */
- public function stop()
- {
- if ($this->stopped) {
- return;
- }
- try {
- $this->driver->curl('DELETE', $this->url);
- } catch (Exception $e) {
- // sessions which aren't closed because of sharing can time out on the server. In no way trying to close them should make a test fail, as it already finished before arriving here.
- "Closing sessions: " . $e->getMessage() . "\n";
- }
- $this->stopped = TRUE;
- if ($this->stopped) {
- return;
- }
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element_Select
- */
- public function select(PHPUnit_Extensions_Selenium2TestCase_Element $element)
- {
- $tag = $element->name();
- if ($tag !== 'select') {
- throw new InvalidArgumentException("The element is not a `select` tag but a `$tag`.");
- }
- return PHPUnit_Extensions_Selenium2TestCase_Element_Select::fromElement($element);
- }
- /**
- * @param array WebElement JSON object
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function elementFromResponseValue($value)
- {
- return PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue($value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- /**
- * @param string $id id attribute, e.g. 'container'
- * @return void
- */
- public function clickOnElement($id)
- {
- return $this->element($this->using('id')->value($id))->click();
- }
- public function timeouts()
- {
- return $this->timeouts;
- }
- /**
- * @return string a BLOB of a PNG file
- */
- public function currentScreenshot()
- {
- return base64_decode($this->screenshot());
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Window
- */
- public function currentWindow()
- {
- $url = $this->url->descend('window')->descend(trim($this->windowHandle(), '{}'));
- return new PHPUnit_Extensions_Selenium2TestCase_Window($this->driver, $url);
- }
- public function closeWindow()
- {
- $this->driver->curl('DELETE', $this->url->descend('window'));
- }
- /**
- * Get the element on the page that currently has focus.
- *
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function active()
- {
- $command = new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Active(null, $this->url);
- $response = $this->driver->execute($command);
- return $this->elementFromResponseValue($response->getValue());
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie
- */
- public function cookie()
- {
- $url = $this->url->descend('cookie');
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Cookie($this->driver, $url);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Storage
- */
- public function localStorage()
- {
- $url = $this->url->addCommand('localStorage');
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Storage($this->driver, $url);
- }
- public function landscape()
- {
- $this->orientation('LANDSCAPE');
- }
- public function portrait()
- {
- $this->orientation('PORTRAIT');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- // By default the code coverage files are written to the same directory
- // that contains the covered sourcecode files. Use this setting to change
- // the default behaviour and set a specific directory to write the files to.
- // If you change the default setting, please make sure to also configure
- // the same directory in phpunit_coverage.php. Also note that the webserver
- // needs write access to the directory.
- if (!isset($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'])) {
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] = FALSE;
- }
- if ( isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) &&
- !isset($_GET['PHPUNIT_SELENIUM_TEST_ID']) &&
- extension_loaded('xdebug')) {
- $GLOBALS['PHPUNIT_FILTERED_FILES'] = array(__FILE__);
- xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
- }
- include ('ExitHandler.php');
- PHPUnit_Extensions_SeleniumCommon_ExitHandler::init();
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- if ( isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) &&
- !isset($_GET['PHPUNIT_SELENIUM_TEST_ID']) &&
- extension_loaded('xdebug')) {
- $GLOBALS['PHPUNIT_FILTERED_FILES'][] = __FILE__;
- $data = xdebug_get_code_coverage();
- xdebug_stop_code_coverage();
- foreach ($GLOBALS['PHPUNIT_FILTERED_FILES'] as $file) {
- unset($data[$file]);
- }
- if (is_string($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY']) &&
- is_dir($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'])) {
- $file = $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] .
- DIRECTORY_SEPARATOR . md5($_SERVER['SCRIPT_FILENAME']);
- } else {
- $file = $_SERVER['SCRIPT_FILENAME'];
- }
- file_put_contents(
- $name = $file . '.' . md5(uniqid(rand(), TRUE)) . '.' . $_COOKIE['PHPUNIT_SELENIUM_TEST_ID'],
- serialize($data)
- );
- }
- <?php
- class PHPUnit_Extensions_SeleniumCommon_RemoteCoverage
- {
- public function __construct($coverageScriptUrl, $testId)
- {
- $this->coverageScriptUrl = $coverageScriptUrl;
- $this->testId = $testId;
- }
- public function get()
- {
- if (!empty($this->coverageScriptUrl)) {
- $url = sprintf(
- '%s?PHPUNIT_SELENIUM_TEST_ID=%s',
- $this->coverageScriptUrl,
- urlencode($this->testId)
- );
- $buffer = @file_get_contents($url);
- if ($buffer !== FALSE) {
- $coverageData = unserialize($buffer);
- if (is_array($coverageData)) {
- return $this->matchLocalAndRemotePaths($coverageData);
- } else {
- throw new Exception('Empty or invalid code coverage data received from url "' . $url . '"');
- }
- }
- }
- return array();
- }
- /**
- * @param array $coverage
- * @return array
- * @author Mattis Stordalen Flister <mattis@xait.no>
- */
- protected function matchLocalAndRemotePaths(array $coverage)
- {
- $coverageWithLocalPaths = array();
- foreach ($coverage as $originalRemotePath => $data) {
- $remotePath = $originalRemotePath;
- $separator = $this->findDirectorySeparator($remotePath);
- while (!($localpath = stream_resolve_include_path($remotePath)) &&
- strpos($remotePath, $separator) !== FALSE) {
- $remotePath = substr($remotePath, strpos($remotePath, $separator) + 1);
- }
- if ($localpath && md5_file($localpath) == $data['md5']) {
- $coverageWithLocalPaths[$localpath] = $data['coverage'];
- }
- }
- return $coverageWithLocalPaths;
- }
- /**
- * @param string $path
- * @return string
- * @author Mattis Stordalen Flister <mattis@xait.no>
- */
- protected function findDirectorySeparator($path)
- {
- if (strpos($path, '/') !== FALSE) {
- return '/';
- }
- return '\\';
- }
- }
- <?php
- /**
- * If Ececution was stopped by calling exit();
- * php does not append append.php, so no code coverage date is collected
- * We have to add shutdown handler to append this file manualy.
- * @author Arbuzov <info@whitediver.com>
- *
- */
- class PHPUnit_Extensions_SeleniumCommon_ExitHandler
- {
- /**
- * Register handler.
- * If project have own shutdown hanldler user have to add function to handler
- *
- */
- public static function init()
- {
- register_shutdown_function( array( 'PHPUnit_Extensions_SeleniumCommon_ExitHandler', 'handle' ) );
- }
- /**
- * Manual include apendable files
- */
- public static function handle()
- {
- $execFile = ini_get('auto_append_file');
- if ($execFile!=='') {
- include_once ($execFile);
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- $directory = realpath(__DIR__);
- while ($directory != '/') {
- $autoloadCandidate = $directory . '/vendor/autoload.php';
- if (file_exists($autoloadCandidate)) {
- require_once $autoloadCandidate;
- break;
- }
- $directory = realpath($directory . '/..');
- }
- // Set this to the directory that contains the code coverage files.
- // It defaults to getcwd(). If you have configured a different directory
- // in prepend.php, you need to configure the same directory here.
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] = getcwd();
- if (isset($_GET['PHPUNIT_SELENIUM_TEST_ID'])) {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray(
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'],
- $_GET['PHPUNIT_SELENIUM_TEST_ID']
- );
- $coverage = array();
- foreach ($files as $file) {
- $data = unserialize(file_get_contents($file));
- unlink($file);
- unset($file);
- $filter = new PHP_CodeCoverage_Filter();
- foreach ($data as $file => $lines) {
- if ($filter->isFile($file)) {
- if (!isset($coverage[$file])) {
- $coverage[$file] = array(
- 'md5' => md5_file($file), 'coverage' => $lines
- );
- } else {
- foreach ($lines as $line => $flag) {
- if (!isset($coverage[$file]['coverage'][$line]) ||
- $flag > $coverage[$file]['coverage'][$line]) {
- $coverage[$file]['coverage'][$line] = $flag;
- }
- }
- }
- }
- }
- }
- print serialize($coverage);
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * TestSuite class for a set of tests from a single Testcase Class
- * executed with a particular browser.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_SeleniumBrowserSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Overriding the default: Selenium suites are always built from a TestCase class.
- * @var boolean
- */
- protected $testCase = TRUE;
- public function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- return parent::addTestMethod($class, $method);
- }
- public static function fromClassAndBrowser($className, array $browser)
- {
- $browserSuite = new self();
- if (isset($browser['browserName'])) {
- $name = $browser['browserName'];
- } else if (isset($browser['name'])) {
- $name = $browser['name'];
- } else {
- $name = $browser['browser'];
- }
- $browserSuite->setName($className . ': ' . $name);
- return $browserSuite;
- }
- public function setupSpecificBrowser(array $browser)
- {
- $this->browserOnAllTests($this, $browser);
- }
- private function browserOnAllTests(PHPUnit_Framework_TestSuite $suite, array $browser)
- {
- foreach ($suite->tests() as $test) {
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- $this->browserOnAllTests($test, $browser);
- } else {
- $test->setupSpecificBrowser($browser);
- }
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * TestCase class that uses Selenium 2
- * (WebDriver API and JsonWire protocol) to provide
- * the functionality required for web testing.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method void acceptAlert() Press OK on an alert, or confirms a dialog
- * @method mixed alertText() alertText($value = NULL) Gets the alert dialog text, or sets the text for a prompt dialog
- * @method void back()
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byClassName() byClassName($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byCssSelector() byCssSelector($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byId() byId($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byLinkText() byLinkText($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byName() byName($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byTag() byTag($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byXPath() byXPath($value)
- * @method void click() click(int $button = 0) Click any mouse button (at the coordinates set by the last moveto command).
- * @method void clickOnElement() clickOnElement($id)
- * @method string currentScreenshot() BLOB of the image file
- * @method void dismissAlert() Press Cancel on an alert, or does not confirm a dialog
- * @method void doubleclick() Double clicks (at the coordinates set by the last moveto command).
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element element() element(\PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria) Retrieves an element
- * @method array elements() elements(\PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria) Retrieves an array of Element instances
- * @method string execute() execute($javaScriptCode) Injects arbitrary JavaScript in the page and returns the last
- * @method string executeAsync() executeAsync($javaScriptCode) Injects arbitrary JavaScript and wait for the callback (last element of arguments) to be called
- * @method void forward()
- * @method void frame() frame(mixed $element) Changes the focus to a frame in the page (by frameCount of type int, htmlId of type string, htmlName of type string or element of type \PHPUnit_Extensions_Selenium2TestCase_Element)
- * @method void moveto() moveto(\PHPUnit_Extensions_Selenium2TestCase_Element $element) Move the mouse by an offset of the specificed element.
- * @method void refresh()
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element_Select select() select($element)
- * @method string source() Returns the HTML source of the page
- * @method \PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts timeouts()
- * @method string title()
- * @method void|string url() url($url = NULL)
- * @method PHPUnit_Extensions_Selenium2TestCase_ElementCriteria using() using($strategy) Factory Method for Criteria objects
- * @method void window() window($name) Changes the focus to another window
- * @method string windowHandle() Retrieves the current window handle
- * @method string windowHandles() Retrieves a list of all available window handles
- * @method string keys() Send a sequence of key strokes to the active element.
- * @method string file($file_path) Upload a local file. Returns the fully qualified path to the transferred file.
- * @method array log(string $type) Get the log for a given log type. Log buffer is reset after each request.
- * @method array logTypes() Get available log types.
- * @method void closeWindow() Close the current window.
- * @method void close() Close the current window and clear session data.
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element active() Get the element on the page that currently has focus.
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase extends PHPUnit_Framework_TestCase
- {
- const VERSION = '1.4.2';
- /**
- * @var string override to provide code coverage data from the server
- */
- protected $coverageScriptUrl;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Session
- */
- private $session;
- /**
- * @var array
- */
- private $parameters;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected static $sessionStrategy;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected static $browserSessionStrategy;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected $localSessionStrategy;
- /**
- * @var array
- */
- private static $lastBrowserParams;
- /**
- * @var string
- */
- private $testId;
- /**
- * @var boolean
- */
- private $collectCodeCoverageInformation;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- */
- private $keysHolder;
- /**
- * @param boolean
- */
- public static function shareSession($shareSession)
- {
- if (!is_bool($shareSession)) {
- throw new InvalidArgumentException("The shared session support can only be switched on or off.");
- }
- if (!$shareSession) {
- self::$sessionStrategy = self::defaultSessionStrategy();
- } else {
- self::$sessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared(self::defaultSessionStrategy());
- }
- }
- private static function sessionStrategy()
- {
- if (!self::$sessionStrategy) {
- self::$sessionStrategy = self::defaultSessionStrategy();
- }
- return self::$sessionStrategy;
- }
- private static function defaultSessionStrategy()
- {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated;
- }
- public function __construct($name = NULL, array $data = array(), $dataName = '')
- {
- parent::__construct($name, $data, $dataName);
- $this->parameters = array(
- 'host' => 'localhost',
- 'port' => 4444,
- 'browser' => NULL,
- 'browserName' => NULL,
- 'desiredCapabilities' => array(),
- 'seleniumServerRequestsTimeout' => 60
- );
- $this->keysHolder = new PHPUnit_Extensions_Selenium2TestCase_KeysHolder();
- }
- public function setupSpecificBrowser($params)
- {
- $this->setUpSessionStrategy($params);
- $params = array_merge($this->parameters, $params);
- $this->setHost($params['host']);
- $this->setPort($params['port']);
- $this->setBrowser($params['browserName']);
- $this->parameters['browser'] = $params['browser'];
- $this->setDesiredCapabilities($params['desiredCapabilities']);
- $this->setSeleniumServerRequestsTimeout(
- $params['seleniumServerRequestsTimeout']);
- }
- protected function setUpSessionStrategy($params)
- {
- // This logic enables us to have a session strategy reused for each
- // item in self::$browsers. We don't want them both to share one
- // and we don't want each test for a specific browser to have a
- // new strategy
- if ($params == self::$lastBrowserParams) {
- // do nothing so we use the same session strategy for this
- // browser
- } elseif (isset($params['sessionStrategy'])) {
- $strat = $params['sessionStrategy'];
- if ($strat != "isolated" && $strat != "shared") {
- throw new InvalidArgumentException("Session strategy must be either 'isolated' or 'shared'");
- } elseif ($strat == "isolated") {
- self::$browserSessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated;
- } else {
- self::$browserSessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared(self::defaultSessionStrategy());
- }
- } else {
- self::$browserSessionStrategy = self::defaultSessionStrategy();
- }
- self::$lastBrowserParams = $params;
- $this->localSessionStrategy = self::$browserSessionStrategy;
- }
- private function getStrategy()
- {
- if ($this->localSessionStrategy) {
- return $this->localSessionStrategy;
- } else {
- return self::sessionStrategy();
- }
- }
- public function prepareSession()
- {
- try {
- if (!$this->session) {
- $this->session = $this->getStrategy()->session($this->parameters);
- }
- } catch (PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException $e) {
- $this->markTestSkipped("The Selenium Server is not active on host {$this->parameters['host']} at port {$this->parameters['port']}.");
- }
- return $this->session;
- }
- public function run(PHPUnit_Framework_TestResult $result = NULL)
- {
- $this->testId = get_class($this) . '__' . $this->getName();
- if ($result === NULL) {
- $result = $this->createResult();
- }
- $this->collectCodeCoverageInformation = $result->getCollectCodeCoverageInformation();
- parent::run($result);
- if ($this->collectCodeCoverageInformation) {
- $coverage = new PHPUnit_Extensions_SeleniumCommon_RemoteCoverage(
- $this->coverageScriptUrl,
- $this->testId
- );
- $result->getCodeCoverage()->append(
- $coverage->get(), $this
- );
- }
- // do not call this before to give the time to the Listeners to run
- $this->getStrategy()->endOfTest($this->session);
- return $result;
- }
- /**
- * @throws RuntimeException
- */
- protected function runTest()
- {
- $this->prepareSession();
- $thrownException = NULL;
- if ($this->collectCodeCoverageInformation) {
- $this->url($this->coverageScriptUrl); // phpunit_coverage.php won't do anything if the cookie isn't set, which is exactly what we want
- $this->session->cookie()->add('PHPUNIT_SELENIUM_TEST_ID', $this->testId)->set();
- }
- try {
- $this->setUpPage();
- $result = parent::runTest();
- if (!empty($this->verificationErrors)) {
- $this->fail(implode("\n", $this->verificationErrors));
- }
- } catch (Exception $e) {
- $thrownException = $e;
- }
-
- if ($this->collectCodeCoverageInformation) {
- $this->session->cookie()->remove('PHPUNIT_SELENIUM_TEST_ID');
- }
- if (NULL !== $thrownException) {
- throw $thrownException;
- }
- return $result;
- }
- public static function suite($className)
- {
- return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
- }
- public function onNotSuccessfulTest(Exception $e)
- {
- $this->getStrategy()->notSuccessfulTest();
- parent::onNotSuccessfulTest($e);
- }
- /**
- * Delegate method calls to the Session.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- */
- public function __call($command, $arguments)
- {
- if ($this->session === NULL) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is currently no active session to execute the '$command' command. You're probably trying to set some option in setUp() with an incorrect setter name. You may consider using setUpPage() instead.");
- }
- $result = call_user_func_array(
- array($this->session, $command), $arguments
- );
- return $result;
- }
- /**
- * @param string $host
- * @throws InvalidArgumentException
- */
- public function setHost($host)
- {
- if (!is_string($host)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['host'] = $host;
- }
- public function getHost()
- {
- return $this->parameters['host'];
- }
- /**
- * @param integer $port
- * @throws InvalidArgumentException
- */
- public function setPort($port)
- {
- if (!is_int($port)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->parameters['port'] = $port;
- }
- public function getPort()
- {
- return $this->parameters['port'];
- }
- /**
- * @param string $browser
- * @throws InvalidArgumentException
- */
- public function setBrowser($browserName)
- {
- if (!is_string($browserName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['browserName'] = $browserName;
- }
- public function getBrowser()
- {
- return $this->parameters['browserName'];
- }
- /**
- * @param string $browserUrl
- * @throws InvalidArgumentException
- */
- public function setBrowserUrl($browserUrl)
- {
- if (!is_string($browserUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['browserUrl'] = new PHPUnit_Extensions_Selenium2TestCase_URL($browserUrl);
- }
- public function getBrowserUrl()
- {
- if (isset($this->parameters['browserUrl'])) {
- return $this->parameters['browserUrl'];
- }
- return '';
- }
- /**
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol
- */
- public function setDesiredCapabilities(array $capabilities)
- {
- $this->parameters['desiredCapabilities'] = $capabilities;
- }
- public function getDesiredCapabilities()
- {
- return $this->parameters['desiredCapabilities'];
- }
- /**
- * @param int $timeout seconds
- */
- public function setSeleniumServerRequestsTimeout($timeout)
- {
- $this->parameters['seleniumServerRequestsTimeout'] = $timeout;
- }
- public function getSeleniumServerRequestsTimeout()
- {
- return $this->parameters['seleniumServerRequestsTimeout'];
- }
- /**
- * Get test id (generated internally)
- * @return string
- */
- public function getTestId()
- {
- return $this->testId;
- }
- /**
- * Get Selenium2 current session id
- * @return string
- */
- public function getSessionId()
- {
- if ($this->session) {
- return $this->session->id();
- }
- return FALSE;
- }
- /**
- * Wait until callback isn't null or timeout occurs
- *
- * @param $callback
- * @param null $timeout
- * @return mixed
- */
- public function waitUntil($callback, $timeout = NULL)
- {
- $waitUntil = new PHPUnit_Extensions_Selenium2TestCase_WaitUntil($this);
- return $waitUntil->run($callback, $timeout);
- }
- /**
- * Sends a special key
- * Deprecated due to issues with IE webdriver. Use keys() method instead
- * @deprecated
- * @param string $name
- * @throws PHPUnit_Extensions_Selenium2TestCase_Exception
- * @see PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- */
- public function keysSpecial($name)
- {
- $names = explode(',', $name);
- foreach ($names as $key) {
- $this->keys($this->keysHolder->specialKey(trim($key)));
- }
- }
- /**
- * setUp method that is called after the session has been prepared.
- * It is possible to use session-specific commands like url() here.
- */
- public function setUpPage()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Util
- {
- /**
- * @param float $a
- * @param float $b
- * @return float ($a / $b) * 100
- */
- public static function percent($a, $b, $asString = false, $fixedWidth = false)
- {
- if ($asString && $b == 0) {
- return '';
- }
- if ($b > 0) {
- $percent = ($a / $b) * 100;
- } else {
- $percent = 100;
- }
- if ($asString) {
- if ($fixedWidth) {
- return sprintf('%6.2F%%', $percent);
- }
- return sprintf('%01.2F%%', $percent);
- } else {
- return $percent;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception class for PHP_CodeCoverage component.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Exception extends RuntimeException
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Base class for PHP_CodeCoverage_Report_Node renderers.
- *
- * @since Class available since Release 1.1.0
- */
- abstract class PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @var string
- */
- protected $templatePath;
- /**
- * @var string
- */
- protected $generator;
- /**
- * @var string
- */
- protected $date;
- /**
- * @var int
- */
- protected $lowUpperBound;
- /**
- * @var int
- */
- protected $highLowerBound;
- /**
- * @var string
- */
- protected $version;
- /**
- * Constructor.
- *
- * @param string $templatePath
- * @param string $generator
- * @param string $date
- * @param int $lowUpperBound
- * @param int $highLowerBound
- */
- public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound)
- {
- $version = new SebastianBergmann\Version('2.1.8', dirname(dirname(dirname(dirname(__DIR__)))));
- $this->templatePath = $templatePath;
- $this->generator = $generator;
- $this->date = $date;
- $this->lowUpperBound = $lowUpperBound;
- $this->highLowerBound = $highLowerBound;
- $this->version = $version->getVersion();
- }
- /**
- * @param Text_Template $template
- * @param array $data
- * @return string
- */
- protected function renderItemTemplate(Text_Template $template, array $data)
- {
- $numSeparator = ' / ';
- $classesBar = ' ';
- $classesLevel = 'None';
- $classesNumber = ' ';
- if (isset($data['numClasses']) && $data['numClasses'] > 0) {
- $classesLevel = $this->getColorLevel($data['testedClassesPercent']);
- $classesNumber = $data['numTestedClasses'] . $numSeparator .
- $data['numClasses'];
- $classesBar = $this->getCoverageBar(
- $data['testedClassesPercent']
- );
- }
- $methodsBar = ' ';
- $methodsLevel = 'None';
- $methodsNumber = ' ';
- if ($data['numMethods'] > 0) {
- $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']);
- $methodsNumber = $data['numTestedMethods'] . $numSeparator .
- $data['numMethods'];
- $methodsBar = $this->getCoverageBar(
- $data['testedMethodsPercent']
- );
- }
- $linesBar = ' ';
- $linesLevel = 'None';
- $linesNumber = ' ';
- if ($data['numExecutableLines'] > 0) {
- $linesLevel = $this->getColorLevel($data['linesExecutedPercent']);
- $linesNumber = $data['numExecutedLines'] . $numSeparator .
- $data['numExecutableLines'];
- $linesBar = $this->getCoverageBar(
- $data['linesExecutedPercent']
- );
- }
- $template->setVar(
- array(
- 'icon' => isset($data['icon']) ? $data['icon'] : '',
- 'crap' => isset($data['crap']) ? $data['crap'] : '',
- 'name' => $data['name'],
- 'lines_bar' => $linesBar,
- 'lines_executed_percent' => $data['linesExecutedPercentAsString'],
- 'lines_level' => $linesLevel,
- 'lines_number' => $linesNumber,
- 'methods_bar' => $methodsBar,
- 'methods_tested_percent' => $data['testedMethodsPercentAsString'],
- 'methods_level' => $methodsLevel,
- 'methods_number' => $methodsNumber,
- 'classes_bar' => $classesBar,
- 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '',
- 'classes_level' => $classesLevel,
- 'classes_number' => $classesNumber
- )
- );
- return $template->render();
- }
- /**
- * @param Text_Template $template
- * @param PHP_CodeCoverage_Report_Node $node
- */
- protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node)
- {
- $runtime = new Runtime;
- $template->setVar(
- array(
- 'id' => $node->getId(),
- 'full_path' => $node->getPath(),
- 'path_to_root' => $this->getPathToRoot($node),
- 'breadcrumbs' => $this->getBreadcrumbs($node),
- 'date' => $this->date,
- 'version' => $this->version,
- 'runtime_name' => $runtime->getName(),
- 'runtime_version' => $runtime->getVersion(),
- 'runtime_link' => $runtime->getVendorUrl(),
- 'generator' => $this->generator,
- 'low_upper_bound' => $this->lowUpperBound,
- 'high_lower_bound' => $this->highLowerBound
- )
- );
- }
- protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node)
- {
- $breadcrumbs = '';
- $path = $node->getPathAsArray();
- $pathToRoot = array();
- $max = count($path);
- if ($node instanceof PHP_CodeCoverage_Report_Node_File) {
- $max--;
- }
- for ($i = 0; $i < $max; $i++) {
- $pathToRoot[] = str_repeat('../', $i);
- }
- foreach ($path as $step) {
- if ($step !== $node) {
- $breadcrumbs .= $this->getInactiveBreadcrumb(
- $step,
- array_pop($pathToRoot)
- );
- } else {
- $breadcrumbs .= $this->getActiveBreadcrumb($step);
- }
- }
- return $breadcrumbs;
- }
- protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node)
- {
- $buffer = sprintf(
- ' <li class="active">%s</li>' . "\n",
- $node->getName()
- );
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $buffer .= ' <li>(<a href="dashboard.html">Dashboard</a>)</li>' . "\n";
- }
- return $buffer;
- }
- protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pathToRoot)
- {
- return sprintf(
- ' <li><a href="%sindex.html">%s</a></li>' . "\n",
- $pathToRoot,
- $node->getName()
- );
- }
- protected function getPathToRoot(PHP_CodeCoverage_Report_Node $node)
- {
- $id = $node->getId();
- $depth = substr_count($id, '/');
- if ($id != 'index' &&
- $node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $depth++;
- }
- return str_repeat('../', $depth);
- }
- protected function getCoverageBar($percent)
- {
- $level = $this->getColorLevel($percent);
- $template = new Text_Template(
- $this->templatePath . 'coverage_bar.html',
- '{{',
- '}}'
- );
- $template->setVar(array('level' => $level, 'percent' => sprintf('%.2F', $percent)));
- return $template->render();
- }
- /**
- * @param int $percent
- * @return string
- */
- protected function getColorLevel($percent)
- {
- if ($percent <= $this->lowUpperBound) {
- return 'danger';
- } elseif ($percent > $this->lowUpperBound &&
- $percent < $this->highLowerBound) {
- return 'warning';
- } else {
- return 'success';
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
- {
- $classes = $node->getClassesAndTraits();
- $template = new Text_Template(
- $this->templatePath . 'dashboard.html',
- '{{',
- '}}'
- );
- $this->setCommonTemplateVariables($template, $node);
- $baseLink = $node->getId() . '/';
- $complexity = $this->complexity($classes, $baseLink);
- $coverageDistribution = $this->coverageDistribution($classes);
- $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink);
- $projectRisks = $this->projectRisks($classes, $baseLink);
- $template->setVar(
- array(
- 'insufficient_coverage_classes' => $insufficientCoverage['class'],
- 'insufficient_coverage_methods' => $insufficientCoverage['method'],
- 'project_risks_classes' => $projectRisks['class'],
- 'project_risks_methods' => $projectRisks['method'],
- 'complexity_class' => $complexity['class'],
- 'complexity_method' => $complexity['method'],
- 'class_coverage_distribution' => $coverageDistribution['class'],
- 'method_coverage_distribution' => $coverageDistribution['method']
- )
- );
- $template->renderTo($file);
- }
- /**
- * Returns the data for the Class/Method Complexity charts.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function complexity(array $classes, $baseLink)
- {
- $result = array('class' => array(), 'method' => array());
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($className != '*') {
- $methodName = $className . '::' . $methodName;
- }
- $result['method'][] = array(
- $method['coverage'],
- $method['ccn'],
- sprintf(
- '<a href="%s">%s</a>',
- str_replace($baseLink, '', $method['link']),
- $methodName
- )
- );
- }
- $result['class'][] = array(
- $class['coverage'],
- $class['ccn'],
- sprintf(
- '<a href="%s">%s</a>',
- str_replace($baseLink, '', $class['link']),
- $className
- )
- );
- }
- return array(
- 'class' => json_encode($result['class']),
- 'method' => json_encode($result['method'])
- );
- }
- /**
- * Returns the data for the Class / Method Coverage Distribution chart.
- *
- * @param array $classes
- * @return array
- */
- protected function coverageDistribution(array $classes)
- {
- $result = array(
- 'class' => array(
- '0%' => 0,
- '0-10%' => 0,
- '10-20%' => 0,
- '20-30%' => 0,
- '30-40%' => 0,
- '40-50%' => 0,
- '50-60%' => 0,
- '60-70%' => 0,
- '70-80%' => 0,
- '80-90%' => 0,
- '90-100%' => 0,
- '100%' => 0
- ),
- 'method' => array(
- '0%' => 0,
- '0-10%' => 0,
- '10-20%' => 0,
- '20-30%' => 0,
- '30-40%' => 0,
- '40-50%' => 0,
- '50-60%' => 0,
- '60-70%' => 0,
- '70-80%' => 0,
- '80-90%' => 0,
- '90-100%' => 0,
- '100%' => 0
- )
- );
- foreach ($classes as $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] == 0) {
- $result['method']['0%']++;
- } elseif ($method['coverage'] == 100) {
- $result['method']['100%']++;
- } else {
- $key = floor($method['coverage'] / 10) * 10;
- $key = $key . '-' . ($key + 10) . '%';
- $result['method'][$key]++;
- }
- }
- if ($class['coverage'] == 0) {
- $result['class']['0%']++;
- } elseif ($class['coverage'] == 100) {
- $result['class']['100%']++;
- } else {
- $key = floor($class['coverage'] / 10) * 10;
- $key = $key . '-' . ($key + 10) . '%';
- $result['class'][$key]++;
- }
- }
- return array(
- 'class' => json_encode(array_values($result['class'])),
- 'method' => json_encode(array_values($result['method']))
- );
- }
- /**
- * Returns the classes / methods with insufficient coverage.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function insufficientCoverage(array $classes, $baseLink)
- {
- $leastTestedClasses = array();
- $leastTestedMethods = array();
- $result = array('class' => '', 'method' => '');
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] < $this->highLowerBound) {
- if ($className != '*') {
- $key = $className . '::' . $methodName;
- } else {
- $key = $methodName;
- }
- $leastTestedMethods[$key] = $method['coverage'];
- }
- }
- if ($class['coverage'] < $this->highLowerBound) {
- $leastTestedClasses[$className] = $class['coverage'];
- }
- }
- asort($leastTestedClasses);
- asort($leastTestedMethods);
- foreach ($leastTestedClasses as $className => $coverage) {
- $result['class'] .= sprintf(
- ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d%%</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$className]['link']),
- $className,
- $coverage
- );
- }
- foreach ($leastTestedMethods as $methodName => $coverage) {
- list($class, $method) = explode('::', $methodName);
- $result['method'] .= sprintf(
- ' <tr><td><a href="%s"><abbr title="%s">%s</a></a></td><td class="text-right">%d%%</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']),
- $methodName,
- $method,
- $coverage
- );
- }
- return $result;
- }
- /**
- * Returns the project risks according to the CRAP index.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function projectRisks(array $classes, $baseLink)
- {
- $classRisks = array();
- $methodRisks = array();
- $result = array('class' => '', 'method' => '');
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] < $this->highLowerBound &&
- $method['ccn'] > 1) {
- if ($className != '*') {
- $key = $className . '::' . $methodName;
- } else {
- $key = $methodName;
- }
- $methodRisks[$key] = $method['crap'];
- }
- }
- if ($class['coverage'] < $this->highLowerBound &&
- $class['ccn'] > count($class['methods'])) {
- $classRisks[$className] = $class['crap'];
- }
- }
- arsort($classRisks);
- arsort($methodRisks);
- foreach ($classRisks as $className => $crap) {
- $result['class'] .= sprintf(
- ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$className]['link']),
- $className,
- $crap
- );
- }
- foreach ($methodRisks as $methodName => $crap) {
- list($class, $method) = explode('::', $methodName);
- $result['method'] .= sprintf(
- ' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']),
- $methodName,
- $method,
- $crap
- );
- }
- return $result;
- }
- protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node)
- {
- return sprintf(
- ' <li><a href="index.html">%s</a></li>' . "\n" .
- ' <li class="active">(Dashboard)</li>' . "\n",
- $node->getName()
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- // @codeCoverageIgnoreStart
- if (!defined('T_TRAIT')) {
- define('T_TRAIT', 1001);
- }
- if (!defined('T_INSTEADOF')) {
- define('T_INSTEADOF', 1002);
- }
- if (!defined('T_CALLABLE')) {
- define('T_CALLABLE', 1003);
- }
- if (!defined('T_FINALLY')) {
- define('T_FINALLY', 1004);
- }
- if (!defined('T_YIELD')) {
- define('T_YIELD', 1005);
- }
- // @codeCoverageIgnoreEnd
- /**
- * Renders a PHP_CodeCoverage_Report_Node_File node.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @var int
- */
- private $htmlspecialcharsFlags;
- /**
- * Constructor.
- *
- * @param string $templatePath
- * @param string $generator
- * @param string $date
- * @param int $lowUpperBound
- * @param int $highLowerBound
- */
- public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound)
- {
- parent::__construct(
- $templatePath,
- $generator,
- $date,
- $lowUpperBound,
- $highLowerBound
- );
- $this->htmlspecialcharsFlags = ENT_COMPAT;
- if (PHP_VERSION_ID >= 50400 && defined('ENT_SUBSTITUTE')) {
- $this->htmlspecialcharsFlags = $this->htmlspecialcharsFlags | ENT_HTML401 | ENT_SUBSTITUTE;
- }
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_File $node, $file)
- {
- $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}');
- $template->setVar(
- array(
- 'items' => $this->renderItems($node),
- 'lines' => $this->renderSource($node)
- )
- );
- $this->setCommonTemplateVariables($template, $node);
- $template->renderTo($file);
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @return string
- */
- protected function renderItems(PHP_CodeCoverage_Report_Node_File $node)
- {
- $template = new Text_Template($this->templatePath . 'file_item.html', '{{', '}}');
- $methodItemTemplate = new Text_Template(
- $this->templatePath . 'method_item.html',
- '{{',
- '}}'
- );
- $items = $this->renderItemTemplate(
- $template,
- array(
- 'name' => 'Total',
- 'numClasses' => $node->getNumClassesAndTraits(),
- 'numTestedClasses' => $node->getNumTestedClassesAndTraits(),
- 'numMethods' => $node->getNumMethods(),
- 'numTestedMethods' => $node->getNumTestedMethods(),
- 'linesExecutedPercent' => $node->getLineExecutedPercent(false),
- 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(),
- 'numExecutedLines' => $node->getNumExecutedLines(),
- 'numExecutableLines' => $node->getNumExecutableLines(),
- 'testedMethodsPercent' => $node->getTestedMethodsPercent(false),
- 'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(),
- 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false),
- 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(),
- 'crap' => '<abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr>'
- )
- );
- $items .= $this->renderFunctionItems(
- $node->getFunctions(),
- $methodItemTemplate
- );
- $items .= $this->renderTraitOrClassItems(
- $node->getTraits(),
- $template,
- $methodItemTemplate
- );
- $items .= $this->renderTraitOrClassItems(
- $node->getClasses(),
- $template,
- $methodItemTemplate
- );
- return $items;
- }
- /**
- * @param array $items
- * @param Text_Template $template
- * @param Text_Template $methodItemTemplate
- * @return string
- */
- protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate)
- {
- if (empty($items)) {
- return '';
- }
- $buffer = '';
- foreach ($items as $name => $item) {
- $numMethods = count($item['methods']);
- $numTestedMethods = 0;
- foreach ($item['methods'] as $method) {
- if ($method['executedLines'] == $method['executableLines']) {
- $numTestedMethods++;
- }
- }
- $buffer .= $this->renderItemTemplate(
- $template,
- array(
- 'name' => $name,
- 'numClasses' => 1,
- 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0,
- 'numMethods' => $numMethods,
- 'numTestedMethods' => $numTestedMethods,
- 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- false
- ),
- 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- true
- ),
- 'numExecutedLines' => $item['executedLines'],
- 'numExecutableLines' => $item['executableLines'],
- 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods,
- $numMethods,
- false
- ),
- 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods,
- $numMethods,
- true
- ),
- 'testedClassesPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods == $numMethods ? 1 : 0,
- 1,
- false
- ),
- 'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods == $numMethods ? 1 : 0,
- 1,
- true
- ),
- 'crap' => $item['crap']
- )
- );
- foreach ($item['methods'] as $method) {
- $buffer .= $this->renderFunctionOrMethodItem(
- $methodItemTemplate,
- $method,
- ' '
- );
- }
- }
- return $buffer;
- }
- /**
- * @param array $functions
- * @param Text_Template $template
- * @return string
- */
- protected function renderFunctionItems(array $functions, Text_Template $template)
- {
- if (empty($functions)) {
- return '';
- }
- $buffer = '';
- foreach ($functions as $function) {
- $buffer .= $this->renderFunctionOrMethodItem(
- $template,
- $function
- );
- }
- return $buffer;
- }
- /**
- * @param Text_Template $template
- * @return string
- */
- protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '')
- {
- $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0;
- return $this->renderItemTemplate(
- $template,
- array(
- 'name' => sprintf(
- '%s<a href="#%d"><abbr title="%s">%s</abbr></a>',
- $indent,
- $item['startLine'],
- htmlspecialchars($item['signature']),
- isset($item['functionName']) ? $item['functionName'] : $item['methodName']
- ),
- 'numMethods' => 1,
- 'numTestedMethods' => $numTestedItems,
- 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- false
- ),
- 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- true
- ),
- 'numExecutedLines' => $item['executedLines'],
- 'numExecutableLines' => $item['executableLines'],
- 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedItems,
- 1,
- false
- ),
- 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedItems,
- 1,
- true
- ),
- 'crap' => $item['crap']
- )
- );
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @return string
- */
- protected function renderSource(PHP_CodeCoverage_Report_Node_File $node)
- {
- $coverageData = $node->getCoverageData();
- $testData = $node->getTestData();
- $codeLines = $this->loadFile($node->getPath());
- $lines = '';
- $i = 1;
- foreach ($codeLines as $line) {
- $trClass = '';
- $popoverContent = '';
- $popoverTitle = '';
- if (array_key_exists($i, $coverageData)) {
- $numTests = count($coverageData[$i]);
- if ($coverageData[$i] === null) {
- $trClass = ' class="warning"';
- } elseif ($numTests == 0) {
- $trClass = ' class="danger"';
- } else {
- $lineCss = 'covered-by-large-tests';
- $popoverContent = '<ul>';
- if ($numTests > 1) {
- $popoverTitle = $numTests . ' tests cover line ' . $i;
- } else {
- $popoverTitle = '1 test covers line ' . $i;
- }
- foreach ($coverageData[$i] as $test) {
- if ($lineCss == 'covered-by-large-tests' && $testData[$test]['size'] == 'medium') {
- $lineCss = 'covered-by-medium-tests';
- } elseif ($testData[$test]['size'] == 'small') {
- $lineCss = 'covered-by-small-tests';
- }
- switch ($testData[$test]['status']) {
- case 0:
- switch ($testData[$test]['size']) {
- case 'small':
- $testCSS = ' class="covered-by-small-tests"';
- break;
- case 'medium':
- $testCSS = ' class="covered-by-medium-tests"';
- break;
- default:
- $testCSS = ' class="covered-by-large-tests"';
- break;
- }
- break;
- case 1:
- case 2:
- $testCSS = ' class="warning"';
- break;
- case 3:
- $testCSS = ' class="danger"';
- break;
- case 4:
- $testCSS = ' class="danger"';
- break;
- default:
- $testCSS = '';
- }
- $popoverContent .= sprintf(
- '<li%s>%s</li>',
- $testCSS,
- htmlspecialchars($test)
- );
- }
- $popoverContent .= '</ul>';
- $trClass = ' class="' . $lineCss . ' popin"';
- }
- }
- if (!empty($popoverTitle)) {
- $popover = sprintf(
- ' data-title="%s" data-content="%s" data-placement="bottom" data-html="true"',
- $popoverTitle,
- htmlspecialchars($popoverContent)
- );
- } else {
- $popover = '';
- }
- $lines .= sprintf(
- ' <tr%s%s><td><div align="right"><a name="%d"></a><a href="#%d">%d</a></div></td><td class="codeLine">%s</td></tr>' . "\n",
- $trClass,
- $popover,
- $i,
- $i,
- $i,
- $line
- );
- $i++;
- }
- return $lines;
- }
- /**
- * @param string $file
- * @return array
- */
- protected function loadFile($file)
- {
- $buffer = file_get_contents($file);
- $tokens = token_get_all($buffer);
- $result = array('');
- $i = 0;
- $stringFlag = false;
- $fileEndsWithNewLine = substr($buffer, -1) == "\n";
- unset($buffer);
- foreach ($tokens as $j => $token) {
- if (is_string($token)) {
- if ($token === '"' && $tokens[$j - 1] !== '\\') {
- $result[$i] .= sprintf(
- '<span class="string">%s</span>',
- htmlspecialchars($token)
- );
- $stringFlag = !$stringFlag;
- } else {
- $result[$i] .= sprintf(
- '<span class="keyword">%s</span>',
- htmlspecialchars($token)
- );
- }
- continue;
- }
- list ($token, $value) = $token;
- $value = str_replace(
- array("\t", ' '),
- array(' ', ' '),
- htmlspecialchars($value, $this->htmlspecialcharsFlags)
- );
- if ($value === "\n") {
- $result[++$i] = '';
- } else {
- $lines = explode("\n", $value);
- foreach ($lines as $jj => $line) {
- $line = trim($line);
- if ($line !== '') {
- if ($stringFlag) {
- $colour = 'string';
- } else {
- switch ($token) {
- case T_INLINE_HTML:
- $colour = 'html';
- break;
- case T_COMMENT:
- case T_DOC_COMMENT:
- $colour = 'comment';
- break;
- case T_ABSTRACT:
- case T_ARRAY:
- case T_AS:
- case T_BREAK:
- case T_CALLABLE:
- case T_CASE:
- case T_CATCH:
- case T_CLASS:
- case T_CLONE:
- case T_CONTINUE:
- case T_DEFAULT:
- case T_ECHO:
- case T_ELSE:
- case T_ELSEIF:
- case T_EMPTY:
- case T_ENDDECLARE:
- case T_ENDFOR:
- case T_ENDFOREACH:
- case T_ENDIF:
- case T_ENDSWITCH:
- case T_ENDWHILE:
- case T_EXIT:
- case T_EXTENDS:
- case T_FINAL:
- case T_FINALLY:
- case T_FOREACH:
- case T_FUNCTION:
- case T_GLOBAL:
- case T_IF:
- case T_IMPLEMENTS:
- case T_INCLUDE:
- case T_INCLUDE_ONCE:
- case T_INSTANCEOF:
- case T_INSTEADOF:
- case T_INTERFACE:
- case T_ISSET:
- case T_LOGICAL_AND:
- case T_LOGICAL_OR:
- case T_LOGICAL_XOR:
- case T_NAMESPACE:
- case T_NEW:
- case T_PRIVATE:
- case T_PROTECTED:
- case T_PUBLIC:
- case T_REQUIRE:
- case T_REQUIRE_ONCE:
- case T_RETURN:
- case T_STATIC:
- case T_THROW:
- case T_TRAIT:
- case T_TRY:
- case T_UNSET:
- case T_USE:
- case T_VAR:
- case T_WHILE:
- case T_YIELD:
- $colour = 'keyword';
- break;
- default:
- $colour = 'default';
- }
- }
- $result[$i] .= sprintf(
- '<span class="%s">%s</span>',
- $colour,
- $line
- );
- }
- if (isset($lines[$jj + 1])) {
- $result[++$i] = '';
- }
- }
- }
- }
- if ($fileEndsWithNewLine) {
- unset($result[count($result)-1]);
- }
- return $result;
- }
- }
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Dashboard for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/nv.d3.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <h2>Classes</h2>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Coverage Distribution</h3>
- <div id="classCoverageDistribution" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Complexity</h3>
- <div id="classComplexity" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Insufficient Coverage</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Class</th>
- <th class="text-right">Coverage</th>
- </tr>
- </thead>
- <tbody>
- {{insufficient_coverage_classes}}
- </tbody>
- </table>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Project Risks</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Class</th>
- <th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
- </tr>
- </thead>
- <tbody>
- {{project_risks_classes}}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <h2>Methods</h2>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Coverage Distribution</h3>
- <div id="methodCoverageDistribution" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Complexity</h3>
- <div id="methodComplexity" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Insufficient Coverage</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Method</th>
- <th class="text-right">Coverage</th>
- </tr>
- </thead>
- <tbody>
- {{insufficient_coverage_methods}}
- </tbody>
- </table>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Project Risks</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Method</th>
- <th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
- </tr>
- </thead>
- <tbody>
- {{project_risks_methods}}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <footer>
- <hr/>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/d3.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/nv.d3.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- nv.addGraph(function() {
- var chart = nv.models.multiBarChart();
- chart.tooltips(false)
- .showControls(false)
- .showLegend(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .yAxis.tickFormat(d3.format('d'));
- d3.select('#classCoverageDistribution svg')
- .datum(getCoverageDistributionData({{class_coverage_distribution}}, "Class Coverage"))
- .transition().duration(500).call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- nv.addGraph(function() {
- var chart = nv.models.multiBarChart();
- chart.tooltips(false)
- .showControls(false)
- .showLegend(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .yAxis.tickFormat(d3.format('d'));
- d3.select('#methodCoverageDistribution svg')
- .datum(getCoverageDistributionData({{method_coverage_distribution}}, "Method Coverage"))
- .transition().duration(500).call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- function getCoverageDistributionData(data, label) {
- var labels = [
- '0%',
- '0-10%',
- '10-20%',
- '20-30%',
- '30-40%',
- '40-50%',
- '50-60%',
- '60-70%',
- '70-80%',
- '80-90%',
- '90-100%',
- '100%'
- ];
- var values = [];
- $.each(labels, function(key) {
- values.push({x: labels[key], y: data[key]});
- });
- return [
- {
- key: label,
- values: values,
- color: "#4572A7"
- }
- ];
- }
- nv.addGraph(function() {
- var chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .showLegend(false)
- .forceX([0, 100]);
- chart.tooltipContent(function(key, y, e, graph) {
- return '<p>' + graph.point.class + '</p>';
- });
- chart.xAxis.axisLabel('Code Coverage (in percent)');
- chart.yAxis.axisLabel('Cyclomatic Complexity');
- d3.select('#classComplexity svg')
- .datum(getComplexityData({{complexity_class}}, 'Class Complexity'))
- .transition()
- .duration(500)
- .call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- nv.addGraph(function() {
- var chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .showLegend(false)
- .forceX([0, 100]);
- chart.tooltipContent(function(key, y, e, graph) {
- return '<p>' + graph.point.class + '</p>';
- });
- chart.xAxis.axisLabel('Code Coverage (in percent)');
- chart.yAxis.axisLabel('Method Complexity');
- d3.select('#methodComplexity svg')
- .datum(getComplexityData({{complexity_method}}, 'Method Complexity'))
- .transition()
- .duration(500)
- .call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- function getComplexityData(data, label) {
- var values = [];
- $.each(data, function(key) {
- var value = Math.round(data[key][0]*100) / 100;
- values.push({
- x: value,
- y: data[key][1],
- class: data[key][2],
- size: 0.05,
- shape: 'diamond'
- });
- });
- return [
- {
- key: label,
- values: values,
- color: "#4572A7"
- }
- ];
- }
- });
- </script>
- </body>
- </html>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Code Coverage for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <table class="table table-bordered">
- <thead>
- <tr>
- <td> </td>
- <td colspan="9"><div align="center"><strong>Code Coverage</strong></div></td>
- </tr>
- <tr>
- <td> </td>
- <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
- <td colspan="3"><div align="center"><strong>Functions and Methods</strong></div></td>
- <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
- </tr>
- </thead>
- <tbody>
- {{items}}
- </tbody>
- </table>
- <footer>
- <hr/>
- <h4>Legend</h4>
- <p>
- <span class="danger"><strong>Low</strong>: 0% to {{low_upper_bound}}%</span>
- <span class="warning"><strong>Medium</strong>: {{low_upper_bound}}% to {{high_lower_bound}}%</span>
- <span class="success"><strong>High</strong>: {{high_lower_bound}}% to 100%</span>
- </p>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- </body>
- </html>
- <div class="progress">
- <div class="progress-bar progress-bar-{{level}}" role="progressbar" aria-valuenow="{{percent}}" aria-valuemin="0" aria-valuemax="100" style="width: {{percent}}%">
- <span class="sr-only">{{percent}}% covered ({{level}})</span>
- </div>
- </div>
- /*!
- * Bootstrap v3.3.4 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
- if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
- var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function E(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function A(n){return ya(n,_a),n}function N(n){return"function"==typeof n?n:function(){return Ma(n,this)}}function C(n){return"function"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function q(n){return n.trim().replace(/\s+/g," ")}function L(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",q(u+" "+n))):e.setAttribute("class",q(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=$;a>0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n.toLowerCase()))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=sc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&cc!==jt,o=new(i?jt:cc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Xt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function $t(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Wt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Jt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function le(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function se(n,t){n&&dc.hasOwnProperty(n.type)&&dc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function _e(n,t){n*=Da;var e=Math.cos(t*=Da);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++xc,_c+=(n-_c)/xc,wc+=(t-wc)/xc,Sc+=(e-Sc)/xc}function Se(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);bc+=l,kc+=l*(t+(t=o)),Ec+=l*(e+(e=a)),Ac+=l*(r+(r=c)),we(t,e,r)}var t,e,r;qc.point=function(u,i){u*=Da;var o=Math.cos(i*=Da);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),qc.point=n,we(t,e,r)}}function ke(){qc.point=_e}function Ee(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Nc+=p*l,Cc+=p*s,zc+=p*f,bc+=v,kc+=v*(r+(r=o)),Ec+=v*(u+(u=a)),Ac+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;qc.point=function(o,a){t=o,e=a,qc.point=n,o*=Da;var c=Math.cos(a*=Da);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},qc.lineEnd=function(){n(t,e),qc.lineEnd=ke,qc.point=_e}}function Ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ne(){return!0}function Ce(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(be(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function qe(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Le(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+o)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-a)<Ca&&(i-=a*Ca),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return ga(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Fe(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;yc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)<Ca,C=N||Ca>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)<Ca?k:E):k<=b[1]&&b[1]<=E:A>qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c
- },polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=qa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ar(n){return n[0]}function Nr(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),Xr(c);for(var l=o;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)o=l.N,a.push(l),Pr(l),l=o;a.push(l),Xr(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Yr(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}tl.insert(y,m),y||(nl=m)}}}}function Xr(n){var t=n.circle;t&&(t.P||(nl=t.N),tl.remove(t),rl.push(t),tu(t),n.circle=null)}function $r(n){for(var t,e=Gc,r=Oe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Wr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Jr(n,t,e,r){var u=new Wr(n,t);return Gc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Kc[n.i].edges.push(new Qr(u,n,t)),Kc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Wr(n,null);return r.a=t,r.b=e,Gc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Gc=[],Kc=new Array(n.length),Qc=new nu,tl=new nu;;)if(u=nl,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Kc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&($r(t),Ir(t));var o={cells:Kc,edges:Gc};return Qc=tl=Gc=Kc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function lu(n){return n.y}function su(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function Uu(n,t){return n[0]*t[0]+n[1]*t[1]}function ju(n){var t=Math.sqrt(Uu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Fu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:vu(a[0],c[0])},{i:3,x:vu(a[1],c[1])})):r.push(c[0]||c[1]?"translate("+c+")":""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Ou(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Yu(n){for(var t=n.source,e=n.target,r=Vu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Zu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Vu(n,t){if(n===t)return n;for(var e=Zu(n),r=Zu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Xu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Bu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Wu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Gu(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ri,n}function Ku(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ni(n){return n.children}function ti(n){return n.value}function ei(n,t){return t.value-n.value}function ri(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ui(n){return n.x}function ii(n){return n.y}function oi(n,t,e){n.y0=t,n.y=e}function ai(n){return ta.range(n.length)}function ci(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function li(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?mi(r,u=a):mi(r=c,u),o--):(di(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)_i(u[i],t,e,r)}function wi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Si(n,t){return n.parent==t.parent?1:2}function ki(n){var t=n.children;return t.length?t[0]:n.t}function Ei(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ai(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ni(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++o<a;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+a)|0;return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Pi(t.a[0])},e.copy=function(){return Qi(n,t)},e.domain(n)}function no(n,t){function i(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ta.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ta.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},o.range=function(n){return arguments.length?(t=n,i()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return no(n,t)},i()}function to(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ar,r=Nr,u=Ne,i=go,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=El.get(n)||go).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function go(n){return n.join("L")}function po(n){return go(n)+"Z"}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Mo(n,t){return n.length<4?go(n):n[1]+_o(n.slice(1,-1),wo(n,t))}function xo(n,t){return n.length<3?go(n):n[0]+_o((n.push(n[0]),n),wo([n[n.length-2]].concat(n,[n[1]]),t))}function bo(n,t){return n.length<3?go(n):n[0]+_o(n,wo(n,t))}function _o(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return go(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function wo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function So(n){if(n.length<3)return go(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",No(Cl,o),",",No(Cl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Co(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ko(n){if(n.length<4)return go(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(No(Cl,i)+","+No(Cl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Co(e,i,o);return e.join("")}function Eo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[No(Cl,o),",",No(Cl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Co(t,o,a);return t.join("")}function Ao(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return So(n)}function No(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Co(n,t,e){n.push("C",No(Al,t),",",No(Al,e),",",No(Nl,t),",",No(Nl,e),",",No(Cl,t),",",No(Cl,e))}function zo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=zo(u,i);++t<e;)r[t]=(o+(o=zo(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=qo(n),a=-1,c=n.length-1;++a<c;)t=zo(n[a],n[a+1]),ga(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Do(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ar,r=Ar,u=0,i=Nr,o=Ne,a=go,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r
- },t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=El.get(n)||go).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Po(n){return n.radius}function Uo(n){return[n.x,n.y]}function jo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fo(){return 64}function Ho(){return"circle"}function Oo(n){var t=Math.sqrt(n/qa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yo(n,t,e){return ya(n,Pl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var a=u.time;o=i[r]={tween:new l,time:a,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]<Vl[i]/u?i-1:i]:[Bl,Vi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Pi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Fi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.5"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)u(e=+n[o])&&(r+=e);else for(;++o<i;)u(e=+t.call(n,n[o],o))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)u(e=r(n[a]))?i+=e:--c;else for(;++a<o;)u(e=r(t.call(n,n[a],a)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,o=[],a=n.length,c=-1;if(1===arguments.length)for(;++c<a;)u(i=r(n[c]))&&o.push(i);else for(;++c<a;)u(i=r(t.call(n,n[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,o=n.length,a=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<o;)u(e=r(n[l]))&&(i=e-a,a+=i/++s,c+=i*(e-a));else for(;++l<o;)u(e=r(t.call(n,n[l],l)))&&(i=e-a,a+=i/++s,c+=i*(e-a));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var pa="__proto__",va="\x00";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,o,a){if(a>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g<p;)(h=d.get(c=v(s=o[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,a))}):(s={},f=function(e,r){s[e]=n(t,r,a)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return A(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return A(r)};var wa={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var a=Z([]),c=A([]),s=A([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return c.enter=function(){return a},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return A(o)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return"string"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),A([e])},ta.selectAll=function(n){var t;return"string"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),A([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||n({type:"zoomend"}),d=null}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(v=e(d=m||ta.mouse(this)),Dl.call(this),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t
- },reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)se(e[r].geometry,t)}},dc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)se(e[r],t)}};ta.geo.area=function(n){return mc=0,ta.geo.stream(n,Mc),mc};var mc,yc=new ce,Mc={sphere:function(){mc+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){yc.reset(),Mc.lineStart=ge},polygonEnd:function(){var n=2*yc;mc+=0>n?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Mc.polygonStart()},polygonEnd:function(){Mc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>yc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Ar,r=Nr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Jc),n};var Jc=ta.geom.polygon.prototype=[];Jc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Jc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Jc.clip=function(n){for(var t,e,r,u,i,o,a=Tr(n),c=-1,l=this.length-Tr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],qr(o,s,u)?(qr(i,s,u)||n.push(Lr(i,o,s,u)),n.push(o)):qr(i,s,u)&&n.push(Lr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Gc,Kc,Qc,nl,tl,el=[],rl=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Yr),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?ul:n,t):a===ul?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===ul?null:a&&a[1]},t)};var ul=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Ar,c=Nr;return(o=arguments.length)?(a=cu,c=lu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=gu,ta.interpolateObject=pu,ta.interpolateNumber=vu,ta.interpolateString=du;var il=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ol=new RegExp(il.source,"g");ta.interpolate=mu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ga.has(t)||/^(#|rgb\(|hsl\()/.test(t)?gu:du:t instanceof ot?gu:Array.isArray(t)?yu:"object"===e&&isNaN(t)?pu:vu)(n,t)}],ta.interpolateArray=yu;var al=function(){return y},cl=ta.map({linear:al,poly:ku,quad:function(){return _u},cubic:function(){return wu},sin:function(){return Eu},exp:function(){return Au},circle:function(){return Nu},elastic:Cu,back:zu,bounce:function(){return qu}}),ll=ta.map({"in":y,out:xu,"in-out":bu,"out-in":function(n){return bu(xu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(y-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Ju(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(M=n,a):M},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Gu(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Ri,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));
- return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ri(t):Di(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Di(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ri:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Gu(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Yo(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Dl:Io(Xo(n)))};var Tl,Rl,Dl=Io(Xo()),Pl=[],Ul=0;Pl.call=_a.call,Pl.empty=_a.empty,Pl.node=_a.node,Pl.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Tl?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Pl,Pl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=N(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yo(o,i,u)},Pl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Yo(c,a,o)},Pl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),A&&m(n,l,0)&&(r(k),t=!0),N&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Ui(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}();/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
- * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
- * */
- !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);/**
- * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
- */
- !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document);/*!
- Holder - client side image placeholders
- Version 2.7.1+6hydf
- © 2015 Ivan Malopinsky - http://imsky.co
- Site: http://holderjs.com
- Issues: https://github.com/imsky/holder/issues
- License: http://opensource.org/licenses/MIT
- */
- !function(a){if(a.document){var b=a.document;b.querySelectorAll||(b.querySelectorAll=function(c){var d,e=b.createElement("style"),f=[];for(b.documentElement.firstChild.appendChild(e),b._qsa=[],e.styleSheet.cssText=c+"{x-qsa:expression(document._qsa && document._qsa.push(this))}",a.scrollBy(0,0),e.parentNode.removeChild(e);b._qsa.length;)d=b._qsa.shift(),d.style.removeAttribute("x-qsa"),f.push(d);return b._qsa=null,f}),b.querySelector||(b.querySelector=function(a){var c=b.querySelectorAll(a);return c.length?c[0]:null}),b.getElementsByClassName||(b.getElementsByClassName=function(a){return a=String(a).replace(/^|\s+/g,"."),b.querySelectorAll(a)}),Object.keys||(Object.keys=function(a){if(a!==Object(a))throw TypeError("Object.keys called on non-object");var b,c=[];for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&c.push(b);return c}),function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a.atob=a.atob||function(a){a=String(a);var c,d=0,e=[],f=0,g=0;if(a=a.replace(/\s/g,""),a.length%4===0&&(a=a.replace(/=+$/,"")),a.length%4===1)throw Error("InvalidCharacterError");if(/[^+/0-9A-Za-z]/.test(a))throw Error("InvalidCharacterError");for(;d<a.length;)c=b.indexOf(a.charAt(d)),f=f<<6|c,g+=6,24===g&&(e.push(String.fromCharCode(f>>16&255)),e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f)),g=0,f=0),d+=1;return 12===g?(f>>=4,e.push(String.fromCharCode(255&f))):18===g&&(f>>=2,e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f))),e.join("")},a.btoa=a.btoa||function(a){a=String(a);var c,d,e,f,g,h,i,j=0,k=[];if(/[^\x00-\xFF]/.test(a))throw Error("InvalidCharacterError");for(;j<a.length;)c=a.charCodeAt(j++),d=a.charCodeAt(j++),e=a.charCodeAt(j++),f=c>>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,j===a.length+2?(h=64,i=64):j===a.length+1&&(i=64),k.push(b.charAt(f),b.charAt(g),b.charAt(h),b.charAt(i));return k.join("")}}(a),Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(a){var b=this.__proto__||this.constructor.prototype;return a in this&&(!(a in b)||b[a]!==this[a])}),function(){if("performance"in a==!1&&(a.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in a.performance==!1){var b=Date.now();performance.timing&&performance.timing.navigationStart&&(b=performance.timing.navigationStart),a.performance.now=function(){return Date.now()-b}}}(),a.requestAnimationFrame||(a.webkitRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return webkitRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=webkitCancelAnimationFrame}(a):a.mozRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return mozRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=mozCancelAnimationFrame}(a):!function(a){a.requestAnimationFrame=function(b){return a.setTimeout(b,1e3/60)},a.cancelAnimationFrame=a.clearTimeout}(a))}}(this),function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Holder=b():a.Holder=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){(function(b){function d(a,b,c,d){var f=e(c.substr(c.lastIndexOf(a.domain)),a);f&&h({mode:null,el:d,flags:f,engineSettings:b})}function e(a,b){var c={theme:B(J.settings.themes.gray,null),stylesheets:b.stylesheets,instanceOptions:b};return a.match(/([\d]+p?)x([\d]+p?)(?:\?|$)/)?f(a,c):g(a,c)}function f(a,b){var c=a.split("?"),d=c[0].split("/");b.holderURL=a;var e=d[1],f=e.match(/([\d]+p?)x([\d]+p?)/);if(!f)return!1;if(b.fluid=-1!==e.indexOf("p"),b.dimensions={width:f[1].replace("p","%"),height:f[2].replace("p","%")},2===c.length){var g=A.parse(c[1]);if(g.bg&&(b.theme.background=(-1===g.bg.indexOf("#")?"#":"")+g.bg),g.fg&&(b.theme.foreground=(-1===g.fg.indexOf("#")?"#":"")+g.fg),g.theme&&b.instanceOptions.themes.hasOwnProperty(g.theme)&&(b.theme=B(b.instanceOptions.themes[g.theme],null)),g.text&&(b.text=g.text),g.textmode&&(b.textmode=g.textmode),g.size&&(b.size=g.size),g.font&&(b.font=g.font),g.align&&(b.align=g.align),b.nowrap=z.truthy(g.nowrap),b.auto=z.truthy(g.auto),z.truthy(g.random)){J.vars.cache.themeKeys=J.vars.cache.themeKeys||Object.keys(b.instanceOptions.themes);var h=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(b.instanceOptions.themes[h],null)}}return b}function g(a,b){var c=!1,d=String.fromCharCode(11),e=a.replace(/([^\\])\//g,"$1"+d).split(d),f=/%[0-9a-f]{2}/gi,g=b.instanceOptions;b.holderURL=[];for(var h=e.length,i=0;h>i;i++){var j=e[i];if(j.match(f))try{j=decodeURIComponent(j)}catch(k){j=e[i]}var l=!1;if(J.flags.dimensions.match(j))c=!0,b.dimensions=J.flags.dimensions.output(j),l=!0;else if(J.flags.fluid.match(j))c=!0,b.dimensions=J.flags.fluid.output(j),b.fluid=!0,l=!0;else if(J.flags.textmode.match(j))b.textmode=J.flags.textmode.output(j),l=!0;else if(J.flags.colors.match(j)){var m=J.flags.colors.output(j);b.theme=B(b.theme,m),l=!0}else if(g.themes[j])g.themes.hasOwnProperty(j)&&(b.theme=B(g.themes[j],null)),l=!0;else if(J.flags.font.match(j))b.font=J.flags.font.output(j),l=!0;else if(J.flags.auto.match(j))b.auto=!0,l=!0;else if(J.flags.text.match(j))b.text=J.flags.text.output(j),l=!0;else if(J.flags.size.match(j))b.size=J.flags.size.output(j),l=!0;else if(J.flags.random.match(j)){null==J.vars.cache.themeKeys&&(J.vars.cache.themeKeys=Object.keys(g.themes));var n=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(g.themes[n],null),l=!0}l&&b.holderURL.push(j)}return b.holderURL.unshift(g.domain),b.holderURL=b.holderURL.join("/"),c?b:!1}function h(a){var b=a.mode,c=a.el,d=a.flags,e=a.engineSettings,f=d.dimensions,g=d.theme,h=f.width+"x"+f.height;if(b=null==b?d.fluid?"fluid":"image":b,null!=d.text&&(g.text=d.text,"object"===c.nodeName.toLowerCase())){for(var j=g.text.split("\\n"),k=0;k<j.length;k++)j[k]=z.encodeHtmlEntity(j[k]);g.text=j.join("\\n")}var n=d.holderURL,o=B(e,null);if(d.font&&(g.font=d.font,!o.noFontFallback&&"img"===c.nodeName.toLowerCase()&&J.setup.supportsCanvas&&"svg"===o.renderer&&(o=B(o,{renderer:"canvas"}))),d.font&&"canvas"==o.renderer&&(o.reRender=!0),"background"==b)null==c.getAttribute("data-background-src")&&r(c,{"data-background-src":n});else{var p={};p[J.vars.dataAttr]=n,r(c,p)}d.theme=g,c.holderData={flags:d,engineSettings:o},("image"==b||"fluid"==b)&&r(c,{alt:g.text?g.text+" ["+h+"]":h});var q={mode:b,el:c,holderSettings:{dimensions:f,theme:g,flags:d},engineSettings:o};"image"==b?("html"!=o.renderer&&d.auto||(c.style.width=f.width+"px",c.style.height=f.height+"px"),"html"==o.renderer?c.style.backgroundColor=g.background:(i(q),"exact"==d.textmode&&(c.holderData.resizeUpdate=!0,J.vars.resizableImages.push(c),l(c)))):"background"==b&&"html"!=o.renderer?i(q):"fluid"==b&&(c.holderData.resizeUpdate=!0,"%"==f.height.slice(-1)?c.style.height=f.height:null!=d.auto&&d.auto||(c.style.height=f.height+"px"),"%"==f.width.slice(-1)?c.style.width=f.width:null!=d.auto&&d.auto||(c.style.width=f.width+"px"),("inline"==c.style.display||""===c.style.display||"none"==c.style.display)&&(c.style.display="block"),m(c),"html"==o.renderer?c.style.backgroundColor=g.background:(J.vars.resizableImages.push(c),l(c)))}function i(a){function c(){var b=null;switch(h.renderer){case"canvas":b=L(k,a);break;case"svg":b=M(k,a);break;default:throw"Holder: invalid renderer: "+h.renderer}return b}var d=null,e=a.mode,f=a.holderSettings,g=a.el,h=a.engineSettings;switch(h.renderer){case"svg":if(!J.setup.supportsSVG)return;break;case"canvas":if(!J.setup.supportsCanvas)return;break;default:return}var i={width:f.dimensions.width,height:f.dimensions.height,theme:f.theme,flags:f.flags},k=j(i);if(d=c(),null==d)throw"Holder: couldn't render placeholder";"background"==e?(g.style.backgroundImage="url("+d+")",g.style.backgroundSize=i.width+"px "+i.height+"px"):("img"===g.nodeName.toLowerCase()?r(g,{src:d}):"object"===g.nodeName.toLowerCase()&&(r(g,{data:d}),r(g,{type:"image/svg+xml"})),h.reRender&&b.setTimeout(function(){var a=c();if(null==a)throw"Holder: couldn't render placeholder";"img"===g.nodeName.toLowerCase()?r(g,{src:a}):"object"===g.nodeName.toLowerCase()&&(r(g,{data:a}),r(g,{type:"image/svg+xml"}))},100)),r(g,{"data-holder-rendered":!0})}function j(a){function b(a,b,c,d){b.width=c,b.height=d,a.width=Math.max(a.width,b.width),a.height+=b.height}var c=J.defaults.size;switch(parseFloat(a.theme.size)?c=a.theme.size:parseFloat(a.flags.size)&&(c=a.flags.size),a.font={family:a.theme.font?a.theme.font:"Arial, Helvetica, Open Sans, sans-serif",size:k(a.width,a.height,c),units:a.theme.units?a.theme.units:J.defaults.units,weight:a.theme.fontweight?a.theme.fontweight:"bold"},a.text=a.theme.text||Math.floor(a.width)+"x"+Math.floor(a.height),a.noWrap=a.theme.nowrap||a.flags.nowrap,a.align=a.theme.align||a.flags.align||"center",a.flags.textmode){case"literal":a.text=a.flags.dimensions.width+"x"+a.flags.dimensions.height;break;case"exact":if(!a.flags.exactDimensions)break;a.text=Math.floor(a.flags.exactDimensions.width)+"x"+Math.floor(a.flags.exactDimensions.height)}var d=new y({width:a.width,height:a.height}),e=d.Shape,f=new e.Rect("holderBg",{fill:a.theme.background});f.resize(a.width,a.height),d.root.add(f);var g=new e.Group("holderTextGroup",{text:a.text,align:a.align,font:a.font,fill:a.theme.foreground});g.moveTo(null,null,1),d.root.add(g);var h=g.textPositionData=K(d);if(!h)throw"Holder: staging fallback not supported yet.";g.properties.leading=h.boundingBox.height;var i=null,j=null,l=a.width*J.setup.lineWrapRatio,m=l;if(h.lineCount>1){var n,o=0,p=0,q=0;j=new e.Group("line"+q),("left"===a.align||"right"===a.align)&&(m=a.width*(1-2*(1-J.setup.lineWrapRatio)));for(var r=0;r<h.words.length;r++){var s=h.words[r];i=new e.Text(s.text);var t="\\n"==s.text;!a.noWrap&&(o+s.width>=m||t===!0)&&(b(g,j,o,g.properties.leading),g.add(j),o=0,p+=g.properties.leading,q+=1,j=new e.Group("line"+q),j.y=p),t!==!0&&(i.moveTo(o,0),o+=h.spaceWidth+s.width,j.add(i))}if(b(g,j,o,g.properties.leading),g.add(j),"left"===a.align)g.moveTo(a.width-l,null,null);else if("right"===a.align){for(n in g.children)j=g.children[n],j.moveTo(a.width-j.width,null,null);g.moveTo(0-(a.width-l),null,null)}else{for(n in g.children)j=g.children[n],j.moveTo((g.width-j.width)/2,null,null);g.moveTo((a.width-g.width)/2,null,null)}g.moveTo(null,(a.height-g.height)/2,null),(a.height-g.height)/2<0&&g.moveTo(null,0,null)}else i=new e.Text(a.text),j=new e.Group("line0"),j.add(i),g.add(j),"left"===a.align?g.moveTo(a.width-l,null,null):"right"===a.align?g.moveTo(0-(a.width-l),null,null):g.moveTo((a.width-h.boundingBox.width)/2,null,null),g.moveTo(null,(a.height-h.boundingBox.height)/2,null);return d}function k(a,b,c){var d=parseInt(a,10),e=parseInt(b,10),f=Math.max(d,e),g=Math.min(d,e),h=.8*Math.min(g,f*J.defaults.scale);return Math.round(Math.max(c,h))}function l(a){var b;b=null==a||null==a.nodeType?J.vars.resizableImages:[a];for(var c=0,d=b.length;d>c;c++){var e=b[c];if(e.holderData){var f=e.holderData.flags,g=D(e);if(g){if(!e.holderData.resizeUpdate)continue;if(f.fluid&&f.auto){var h=e.holderData.fluidConfig;switch(h.mode){case"width":g.height=g.width/h.ratio;break;case"height":g.width=g.height*h.ratio}}var j={mode:"image",holderSettings:{dimensions:g,theme:f.theme,flags:f},el:e,engineSettings:e.holderData.engineSettings};"exact"==f.textmode&&(f.exactDimensions=g,j.holderSettings.dimensions=f.dimensions),i(j)}else p(e)}}}function m(a){if(a.holderData){var b=D(a);if(b){var c=a.holderData.flags,d={fluidHeight:"%"==c.dimensions.height.slice(-1),fluidWidth:"%"==c.dimensions.width.slice(-1),mode:null,initialDimensions:b};d.fluidWidth&&!d.fluidHeight?(d.mode="width",d.ratio=d.initialDimensions.width/parseFloat(c.dimensions.height)):!d.fluidWidth&&d.fluidHeight&&(d.mode="height",d.ratio=parseFloat(c.dimensions.width)/d.initialDimensions.height),a.holderData.fluidConfig=d}else p(a)}}function n(){for(var a,c=[],d=Object.keys(J.vars.invisibleImages),e=0,f=d.length;f>e;e++)a=J.vars.invisibleImages[d[e]],D(a)&&"img"==a.nodeName.toLowerCase()&&(c.push(a),delete J.vars.invisibleImages[d[e]]);c.length&&I.run({images:c}),b.requestAnimationFrame(n)}function o(){J.vars.visibilityCheckStarted||(b.requestAnimationFrame(n),J.vars.visibilityCheckStarted=!0)}function p(a){a.holderData.invisibleId||(J.vars.invisibleId+=1,J.vars.invisibleImages["i"+J.vars.invisibleId]=a,a.holderData.invisibleId=J.vars.invisibleId)}function q(a,b){return null==b?document.createElement(a):document.createElementNS(b,a)}function r(a,b){for(var c in b)a.setAttribute(c,b[c])}function s(a,b,c){var d,e;null==a?(a=q("svg",E),d=q("defs",E),e=q("style",E),r(e,{type:"text/css"}),d.appendChild(e),a.appendChild(d)):e=a.querySelector("style"),a.webkitMatchesSelector&&a.setAttribute("xmlns",E);for(var f=0;f<a.childNodes.length;f++)a.childNodes[f].nodeType===F&&a.removeChild(a.childNodes[f]);for(;e.childNodes.length;)e.removeChild(e.childNodes[0]);return r(a,{width:b,height:c,viewBox:"0 0 "+b+" "+c,preserveAspectRatio:"none"}),a}function t(a,c){if(b.XMLSerializer){var d=new XMLSerializer,e="",f=c.stylesheets;if(c.svgXMLStylesheet){for(var g=u(),h=f.length-1;h>=0;h--){var i=g.createProcessingInstruction("xml-stylesheet",'href="'+f[h]+'" rel="stylesheet"');g.insertBefore(i,g.firstChild)}g.removeChild(g.documentElement),e=d.serializeToString(g)}var j=d.serializeToString(a);return j=j.replace(/\&(\#[0-9]{2,}\;)/g,"&$1"),e+j}}function u(){return b.DOMParser?(new DOMParser).parseFromString("<xml />","application/xml"):void 0}function v(a){J.vars.debounceTimer||a.call(this),J.vars.debounceTimer&&b.clearTimeout(J.vars.debounceTimer),J.vars.debounceTimer=b.setTimeout(function(){J.vars.debounceTimer=null,a.call(this)},J.setup.debounce)}function w(){v(function(){l(null)})}var x=c(1),y=c(2),z=c(3),A=c(4),B=z.extend,C=z.getNodeArray,D=z.dimensionCheck,E="http://www.w3.org/2000/svg",F=8,G="2.7.1",H="\nCreated with Holder.js "+G+".\nLearn more at http://holderjs.com\n(c) 2012-2015 Ivan Malopinsky - http://imsky.co\n",I={version:G,addTheme:function(a,b){return null!=a&&null!=b&&(J.settings.themes[a]=b),delete J.vars.cache.themeKeys,this},addImage:function(a,b){var c=document.querySelectorAll(b);if(c.length)for(var d=0,e=c.length;e>d;d++){var f=q("img"),g={};g[J.vars.dataAttr]=a,r(f,g),c[d].appendChild(f)}return this},setResizeUpdate:function(a,b){a.holderData&&(a.holderData.resizeUpdate=!!b,a.holderData.resizeUpdate&&l(a))},run:function(a){a=a||{};var c={},f=B(J.settings,a);J.vars.preempted=!0,J.vars.dataAttr=f.dataAttr||J.vars.dataAttr,c.renderer=f.renderer?f.renderer:J.setup.renderer,-1===J.setup.renderers.join(",").indexOf(c.renderer)&&(c.renderer=J.setup.supportsSVG?"svg":J.setup.supportsCanvas?"canvas":"html");var g=C(f.images),i=C(f.bgnodes),j=C(f.stylenodes),k=C(f.objects);c.stylesheets=[],c.svgXMLStylesheet=!0,c.noFontFallback=f.noFontFallback?f.noFontFallback:!1;for(var l=0;l<j.length;l++){var m=j[l];if(m.attributes.rel&&m.attributes.href&&"stylesheet"==m.attributes.rel.value){var n=m.attributes.href.value,o=q("a");o.href=n;var p=o.protocol+"//"+o.host+o.pathname+o.search;c.stylesheets.push(p)}}for(l=0;l<i.length;l++)if(b.getComputedStyle){var r=b.getComputedStyle(i[l],null).getPropertyValue("background-image"),s=i[l].getAttribute("data-background-src"),t=null;t=null==s?r:s;var u=null,v="?"+f.domain+"/";if(0===t.indexOf(v))u=t.slice(1);else if(-1!=t.indexOf(v)){var w=t.substr(t.indexOf(v)).slice(1),x=w.match(/([^\"]*)"?\)/);null!=x&&(u=x[1])}if(null!=u){var y=e(u,f);y&&h({mode:"background",el:i[l],flags:y,engineSettings:c})}}for(l=0;l<k.length;l++){var A=k[l],D={};try{D.data=A.getAttribute("data"),D.dataSrc=A.getAttribute(J.vars.dataAttr)}catch(E){}var F=null!=D.data&&0===D.data.indexOf(f.domain),G=null!=D.dataSrc&&0===D.dataSrc.indexOf(f.domain);F?d(f,c,D.data,A):G&&d(f,c,D.dataSrc,A)}for(l=0;l<g.length;l++){var H=g[l],I={};try{I.src=H.getAttribute("src"),I.dataSrc=H.getAttribute(J.vars.dataAttr),I.rendered=H.getAttribute("data-holder-rendered")}catch(E){}var K=null!=I.src,L=null!=I.dataSrc&&0===I.dataSrc.indexOf(f.domain),M=null!=I.rendered&&"true"==I.rendered;K?0===I.src.indexOf(f.domain)?d(f,c,I.src,H):L&&(M?d(f,c,I.dataSrc,H):!function(a,b,c,e,f){z.imageExists(a,function(a){a||d(b,c,e,f)})}(I.src,f,c,I.dataSrc,H)):L&&d(f,c,I.dataSrc,H)}return this}},J={settings:{domain:"holder.js",images:"img",objects:"object",bgnodes:"body .holderjs",stylenodes:"head link.holderjs",stylesheets:[],themes:{gray:{background:"#EEEEEE",foreground:"#AAAAAA"},social:{background:"#3a5a97",foreground:"#FFFFFF"},industrial:{background:"#434A52",foreground:"#C2F200"},sky:{background:"#0D8FDB",foreground:"#FFFFFF"},vine:{background:"#39DBAC",foreground:"#1E292C"},lava:{background:"#F8591A",foreground:"#1C2846"}}},defaults:{size:10,units:"pt",scale:1/16},flags:{dimensions:{regex:/^(\d+)x(\d+)$/,output:function(a){var b=this.regex.exec(a);return{width:+b[1],height:+b[2]}}},fluid:{regex:/^([0-9]+%?)x([0-9]+%?)$/,output:function(a){var b=this.regex.exec(a);return{width:b[1],height:b[2]}}},colors:{regex:/(?:#|\^)([0-9a-f]{3,})\:(?:#|\^)([0-9a-f]{3,})/i,output:function(a){var b=this.regex.exec(a);return{foreground:"#"+b[2],background:"#"+b[1]}}},text:{regex:/text\:(.*)/,output:function(a){return this.regex.exec(a)[1].replace("\\/","/")}},font:{regex:/font\:(.*)/,output:function(a){return this.regex.exec(a)[1]}},auto:{regex:/^auto$/},textmode:{regex:/textmode\:(.*)/,output:function(a){return this.regex.exec(a)[1]}},random:{regex:/^random$/},size:{regex:/size\:(\d+)/,output:function(a){return this.regex.exec(a)[1]}}}},K=function(){var a=null,b=null,c=null;return function(d){var e=d.root;if(J.setup.supportsSVG){var f=!1,g=function(a){return document.createTextNode(a)};(null==a||a.parentNode!==document.body)&&(f=!0),a=s(a,e.properties.width,e.properties.height),a.style.display="block",f&&(b=q("text",E),c=g(null),r(b,{x:0}),b.appendChild(c),a.appendChild(b),document.body.appendChild(a),a.style.visibility="hidden",a.style.position="absolute",a.style.top="-100%",a.style.left="-100%");var h=e.children.holderTextGroup,i=h.properties;r(b,{y:i.font.size,style:z.cssProps({"font-weight":i.font.weight,"font-size":i.font.size+i.font.units,"font-family":i.font.family})}),c.nodeValue=i.text;var j=b.getBBox(),k=Math.ceil(j.width/(e.properties.width*J.setup.lineWrapRatio)),l=i.text.split(" "),m=i.text.match(/\\n/g);k+=null==m?0:m.length,c.nodeValue=i.text.replace(/[ ]+/g,"");var n=b.getComputedTextLength(),o=j.width-n,p=Math.round(o/Math.max(1,l.length-1)),t=[];if(k>1){c.nodeValue="";for(var u=0;u<l.length;u++)if(0!==l[u].length){c.nodeValue=z.decodeHtmlEntity(l[u]);var v=b.getBBox();t.push({text:l[u],width:v.width})}}return a.style.display="none",{spaceWidth:p,lineCount:k,boundingBox:j,words:t}}return!1}}(),L=function(){var a=q("canvas"),b=null;return function(c){null==b&&(b=a.getContext("2d"));var d=c.root;a.width=J.dpr(d.properties.width),a.height=J.dpr(d.properties.height),b.textBaseline="middle",b.fillStyle=d.children.holderBg.properties.fill,b.fillRect(0,0,J.dpr(d.children.holderBg.width),J.dpr(d.children.holderBg.height));{var e=d.children.holderTextGroup;e.properties}b.font=e.properties.font.weight+" "+J.dpr(e.properties.font.size)+e.properties.font.units+" "+e.properties.font.family+", monospace",b.fillStyle=e.properties.fill;for(var f in e.children){var g=e.children[f];for(var h in g.children){var i=g.children[h],j=J.dpr(e.x+g.x+i.x),k=J.dpr(e.y+g.y+i.y+e.properties.leading/2);b.fillText(i.properties.text,j,k)}}return a.toDataURL("image/png")}}(),M=function(){if(b.XMLSerializer){var a=u(),c=s(null,0,0),d=q("rect",E);return c.appendChild(d),function(b,e){var f=b.root;s(c,f.properties.width,f.properties.height);for(var g=c.querySelectorAll("g"),h=0;h<g.length;h++)g[h].parentNode.removeChild(g[h]);var i=e.holderSettings.flags.holderURL,j="holder_"+(Number(new Date)+32768+(0|32768*Math.random())).toString(16),k=q("g",E),l=f.children.holderTextGroup,m=l.properties,n=q("g",E),o=l.textPositionData,p="#"+j+" text { "+z.cssProps({fill:m.fill,"font-weight":m.font.weight,"font-family":m.font.family+", monospace","font-size":m.font.size+m.font.units})+" } ",u=a.createComment("\nSource URL: "+i+H),v=a.createCDATASection(p),w=c.querySelector("style");r(k,{id:j}),c.insertBefore(u,c.firstChild),w.appendChild(v),k.appendChild(d),k.appendChild(n),c.appendChild(k),r(d,{width:f.children.holderBg.width,height:f.children.holderBg.height,fill:f.children.holderBg.properties.fill}),l.y+=.8*o.boundingBox.height;for(var x in l.children){var y=l.children[x];for(var A in y.children){var B=y.children[A],C=l.x+y.x+B.x,D=l.y+y.y+B.y,F=q("text",E),G=document.createTextNode(null);r(F,{x:C,y:D}),G.nodeValue=B.properties.text,F.appendChild(G),n.appendChild(F)}}var I=N(t(c,e.engineSettings),"background"===e.mode);return I}}}(),N=function(){var a="data:image/svg+xml;charset=UTF-8,",b="data:image/svg+xml;charset=UTF-8;base64,";return function(c,d){return d?b+btoa(unescape(encodeURIComponent(c))):a+encodeURIComponent(c)}}();for(var O in J.flags)J.flags.hasOwnProperty(O)&&(J.flags[O].match=function(a){return a.match(this.regex)});J.setup={renderer:"html",debounce:100,ratio:1,supportsCanvas:!1,supportsSVG:!1,lineWrapRatio:.9,renderers:["html","canvas","svg"]},J.dpr=function(a){return a*J.setup.ratio},J.vars={preempted:!1,resizableImages:[],invisibleImages:{},invisibleId:0,visibilityCheckStarted:!1,debounceTimer:null,cache:{},dataAttr:"data-src"},function(){var a=1,c=1,d=q("canvas"),e=null;d.getContext&&-1!=d.toDataURL("image/png").indexOf("data:image/png")&&(J.setup.renderer="canvas",e=d.getContext("2d"),J.setup.supportsCanvas=!0),J.setup.supportsCanvas&&(a=b.devicePixelRatio||1,c=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1),J.setup.ratio=a/c,document.createElementNS&&document.createElementNS(E,"svg").createSVGRect&&(J.setup.renderer="svg",J.setup.supportsSVG=!0)}(),o(),x&&x(function(){J.vars.preempted||I.run(),b.addEventListener?(b.addEventListener("resize",w,!1),b.addEventListener("orientationchange",w,!1)):b.attachEvent("onresize",w),"object"==typeof b.Turbolinks&&b.document.addEventListener("page:change",function(){I.run()})}),a.exports=I}).call(b,function(){return this}())},function(a){function b(a){function b(a){if(!v){if(!g.body)return e(b);for(v=!0;a=w.shift();)e(a)}}function c(a){(t||a.type===i||g[m]===l)&&(d(),b())}function d(){t?(g[s](q,c,j),a[s](i,c,j)):(g[o](r,c),a[o](k,c))}function e(a,b){setTimeout(a,+b>=0?b:1)}function f(a){v?e(a):w.push(a)}null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function y(){document.removeEventListener("DOMContentLoaded",y,!1),document.readyState="complete"},!1),document.readyState="loading");var g=a.document,h=g.documentElement,i="load",j=!1,k="on"+i,l="complete",m="readyState",n="attachEvent",o="detachEvent",p="addEventListener",q="DOMContentLoaded",r="onreadystatechange",s="removeEventListener",t=p in g,u=j,v=j,w=[];if(g[m]===l)e(b);else if(t)g[p](q,c,j),a[p](i,c,j);else{g[n](r,c),a[n](k,c);try{u=null==a.frameElement&&h}catch(x){}u&&u.doScroll&&!function z(){if(!v){try{u.doScroll("left")}catch(a){return e(z,50)}d(),b()}}()}return f.version="1.4.0",f.isReady=function(){return v},f}a.exports="undefined"!=typeof window&&b(window)},function(a,b,c){var d=c(5),e=function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}var c=1,e=d.defclass({constructor:function(a){c++,this.parent=null,this.children={},this.id=c,this.name="n"+c,null!=a&&(this.name=a),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(a,b){null!=a&&(this.width=a),null!=b&&(this.height=b)},moveTo:function(a,b,c){this.x=null!=a?a:this.x,this.y=null!=b?b:this.y,this.z=null!=c?c:this.z},add:function(a){var b=a.name;if(null!=this.children[b])throw"SceneGraph: child with that name already exists: "+b;this.children[b]=a,a.parent=this}}),f=d(e,function(b){this.constructor=function(){b.constructor.call(this,"root"),this.properties=a}}),g=d(e,function(a){function c(c,d){if(a.constructor.call(this,c),this.properties={fill:"#000"},null!=d)b(this.properties,d);else if(null!=c&&"string"!=typeof c)throw"SceneGraph: invalid node name"}this.Group=d.extend(this,{constructor:c,type:"group"}),this.Rect=d.extend(this,{constructor:c,type:"rect"}),this.Text=d.extend(this,{constructor:function(a){c.call(this),this.properties.text=a},type:"text"})}),h=new f;return this.Shape=g,this.root=h,this};a.exports=e},function(a,b){(function(a){b.extend=function(a,b){var c={};for(var d in a)a.hasOwnProperty(d)&&(c[d]=a[d]);if(null!=b)for(var e in b)b.hasOwnProperty(e)&&(c[e]=b[e]);return c},b.cssProps=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]);return b.join(";")},b.encodeHtmlEntity=function(a){for(var b=[],c=0,d=a.length-1;d>=0;d--)c=a.charCodeAt(d),b.unshift(c>128?["&#",c,";"].join(""):a[d]);return b.join("")},b.getNodeArray=function(b){var c=null;return"string"==typeof b?c=document.querySelectorAll(b):a.NodeList&&b instanceof a.NodeList?c=b:a.Node&&b instanceof a.Node?c=[b]:a.HTMLCollection&&b instanceof a.HTMLCollection?c=b:b instanceof Array?c=b:null===b&&(c=[]),c},b.imageExists=function(a,b){var c=new Image;c.onerror=function(){b.call(this,!1)},c.onload=function(){b.call(this,!0)},c.src=a},b.decodeHtmlEntity=function(a){return a.replace(/&#(\d+);/g,function(a,b){return String.fromCharCode(b)})},b.dimensionCheck=function(a){var b={height:a.clientHeight,width:a.clientWidth};return b.height&&b.width?b:!1},b.truthy=function(a){return"string"==typeof a?"true"===a||"yes"===a||"1"===a||"on"===a||"✓"===a:!!a}}).call(b,function(){return this}())},function(a,b,c){var d=encodeURIComponent,e=decodeURIComponent,f=c(6),g=c(7),h=/(\w+)\[(\d+)\]/,i=/\w+\.\w+/;b.parse=function(a){if("string"!=typeof a)return{};if(a=f(a),""===a)return{};"?"===a.charAt(0)&&(a=a.slice(1));for(var b={},c=a.split("&"),d=0;d<c.length;d++){var g,j,k,l=c[d].split("="),m=e(l[0]);if(g=h.exec(m))b[g[1]]=b[g[1]]||[],b[g[1]][g[2]]=e(l[1]);else if(g=i.test(m)){for(g=m.split("."),j=b;g.length;)if(k=g.shift(),k.length){if(j[k]){if(j[k]&&"object"!=typeof j[k])break}else j[k]={};g.length||(j[k]=e(l[1])),j=j[k]}}else b[l[0]]=null==l[1]?"":e(l[1])}return b},b.stringify=function(a){if(!a)return"";var b=[];for(var c in a){var e=a[c];if("array"!=g(e))b.push(d(c)+"="+d(a[c]));else for(var f=0;f<e.length;++f)b.push(d(c+"["+f+"]")+"="+d(e[f]))}return b.join("&")}},function(a){var b=function(){},c=Array.prototype.slice,d=function(a,d){var e=b.prototype="function"==typeof a?a.prototype:a,f=new b,g=d.apply(f,c.call(arguments,2).concat(e));if("object"==typeof g)for(var h in g)f[h]=g[h];if(!f.hasOwnProperty("constructor"))return f;var i=f.constructor;return i.prototype=f,i};d.defclass=function(a){var b=a.constructor;return b.prototype=a,b},d.extend=function(a,b){return d(a,function(a){return this.uber=a,b})},a.exports=d},function(a,b){function c(a){return a.replace(/^\s*|\s*$/g,"")}b=a.exports=c,b.left=function(a){return a.replace(/^\s*/,"")},b.right=function(a){return a.replace(/\s*$/,"")}},function(a){var b=Object.prototype.toString;a.exports=function(a){switch(b.call(a)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}return null===a?"null":void 0===a?"undefined":a!==a?"nan":a&&1===a.nodeType?"element":(a=a.valueOf?a.valueOf():Object.prototype.valueOf.apply(a),typeof a)}}])}),function(a,b){b&&(Holder=a.Holder)}(this,"undefined"!=typeof Meteor&&"undefined"!=typeof Package);
- /* nvd3 version 1.8.1 (https://github.com/novus/nvd3) 2015-06-17 */
- !function(){var a={};a.dev=!1,a.tooltip=a.tooltip||{},a.utils=a.utils||{},a.models=a.models||{},a.charts={},a.logs={},a.dom={},a.dispatch=d3.dispatch("render_start","render_end"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),a.dev&&(a.dispatch.on("render_start",function(){a.logs.startTime=+new Date}),a.dispatch.on("render_end",function(){a.logs.endTime=+new Date,a.logs.totalTime=a.logs.endTime-a.logs.startTime,a.log("total",a.logs.totalTime)})),a.log=function(){if(a.dev&&window.console&&console.log&&console.log.apply)console.log.apply(console,arguments);else if(a.dev&&window.console&&"function"==typeof console.log&&Function.prototype.bind){var b=Function.prototype.bind.call(console.log,console);b.apply(console,arguments)}return arguments[arguments.length-1]},a.deprecated=function(a,b){console&&console.warn&&console.warn("nvd3 warning: `"+a+"` has been deprecated. ",b||"")},a.render=function(b){b=b||1,a.render.active=!0,a.dispatch.render_start();var c=function(){for(var d,e,f=0;b>f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+="<div class='footer'>"+a.footer+"</div>"),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;e<c.length;e+=1){var f=c[e]&&c[e].values?c[e].values.length:0;d=f>d?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)<d.range()[1]+10||d(a)>d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)<E[0]||d(a)>E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g");
- x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f);
- var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'<path d="M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z" class="nv-box"></path><path d="M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511" class="nv-check"></path>').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&C<B.length;)E[C]=B[C],D+=B[C++];for(0===C&&(C=1);D>p&&C>1;){E=[],C--;for(var F=0;F<B.length;F++)B[F]>(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,d<c.left+c.right+J+a&&(L=J=5,K+=A),L+=a,L>M&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open<c.close?"2ca02c":"d62728";return'<h3 style="color: #'+d+'">'+a.value+"</h3><table><tr><td>open:</td><td>"+b.yAxis.tickFormat()(c.open)+"</td></tr><tr><td>close:</td><td>"+b.yAxis.tickFormat()(c.close)+"</td></tr><tr><td>high</td><td>"+b.yAxis.tickFormat()(c.high)+"</td></tr><tr><td>low:</td><td>"+b.yAxis.tickFormat()(c.low)+"</td></tr></table>"}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open<c.close?"2ca02c":"d62728";return'<h3 style="color: #'+d+'">'+a.value+"</h3><table><tr><td>open:</td><td>"+b.yAxis.tickFormat()(c.open)+"</td></tr><tr><td>close:</td><td>"+b.yAxis.tickFormat()(c.close)+"</td></tr><tr><td>high</td><td>"+b.yAxis.tickFormat()(c.high)+"</td></tr><tr><td>low:</td><td>"+b.yAxis.tickFormat()(c.low)+"</td></tr></table>"}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'<path d="M0.5,5 L22.5,5 L22.5,26.5 L0.5,26.5 L0.5,5 Z" class="nv-box"></path><path d="M5.5,12.8618467 L11.9185089,19.2803556 L31,0.198864511" class="nv-check"></path>').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&E<D.length;)F[E]=D[E],C+=D[E++];for(0===E&&(E=1);C>g&&E>1;){F=[],E--;for(var G=0;G<D.length;G++)D[G]>(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,d<c.left+c.right+K+a&&(M=K=5,L+=x),M+=a,M>N&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D]
- }if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),k.pointActive(function(){return!1}),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},focusMargin:{get:function(){return x},set:function(a){x.top=void 0!==a.top?a.top:x.top,x.right=void 0!==a.right?a.right:x.right,x.bottom=void 0!==a.bottom?a.bottom:x.bottom,x.left=void 0!==a.left?a.left:x.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),h.pointActive(function(){return!1}),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},focusMargin:{get:function(){return r},set:function(a){r.top=void 0!==a.top?a.top:r.top,r.right=void 0!==a.right?a.right:r.right,r.bottom=void 0!==a.bottom?a.bottom:r.bottom,r.left=void 0!==a.left?a.left:r.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(G){return E.reset(),G.each(function(b){var G=k-j.left-j.right,H=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var I=0;if(z&&b.length&&(z=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),v){var J=d3.layout.stack().offset(w).values(function(a){return a.values}).y(r)(!b.length&&z?z:b);J.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=I++,J[c]=b[c]):c>0&&J[c-1].nonStackable&&J[c].values.map(function(a,b){a.y0-=J[c-1].values[b].y,a.y1=a.y0+a.y})}),b=J}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),v&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var K=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b,yErr:s(a,c)}})});m.domain(d||d3.merge(K).map(function(a){return a.x})).rangeBands(f||[0,G],C),n.domain(e||d3.extent(d3.merge(d3.merge(K).map(function(a){var c=a.y;v&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y);var d=a.yErr;return d?d.length?[c+d[0],c+d[1]]:(d=Math.abs(d),[c-d,c+d]):[c]})).concat(t))).range(g||[H,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var L=p.selectAll("g.nv-wrap.nv-multibar").data([b]),M=L.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),N=M.append("defs"),O=M.append("g"),P=L.select("g");O.append("g").attr("class","nv-groups"),L.attr("transform","translate("+j.left+","+j.top+")"),N.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),L.select("#nv-edge-clip-"+o+" rect").attr("width",G).attr("height",H),P.attr("clip-path",u?"url(#nv-edge-clip-"+o+")":"");var Q=L.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});Q.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var R=E.transition(Q.exit().selectAll("g.nv-bar"),"multibarExit",Math.min(100,B)).attr("y",function(a){var c=i(0)||0;return v&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();R.delay&&R.delay(function(a,b){var c=b*(B/(F+1))-b;return c}),Q.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return x(a,b)}).style("stroke",function(a,b){return x(a,b)}),Q.style("stroke-opacity",1).style("fill-opacity",.75);var S=Q.selectAll("g.nv-bar").data(function(a){return z&&!b.length?z.values:a.values});S.exit().remove();var T=S.enter().append("g").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,c,d){var e=v&&!b[d].nonStackable?0:d*m.rangeBand()/b.length,f=i(v&&!b[d].nonStackable?a.y0:0)||0;return"translate("+e+","+f+")"});T.append("rect").attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(v&&!b[d].nonStackable?1:b.length)}).style("fill",function(a,b,c){return x(a,c,b)}).style("stroke",function(a,b,c){return x(a,c,b)}),S.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0].values[0],0)&&(T.append("polyline"),S.select("polyline").attr("fill","none").attr("stroke",function(a,b,c){return y(a,c,b)}).attr("points",function(a,c){var d=s(a,c),e=.8*m.rangeBand()/(2*(v?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return n(a)-n(0)});var f=[[-e,d[0]],[e,d[0]],[0,d[0]],[0,d[1]],[-e,d[1]],[e,d[1]]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=m.rangeBand()/(2*(v?1:b.length)),e=r(a,c)<0?n(r(a,c))-n(0):0;return"translate("+d+", "+e+")"})),S.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),A&&(c||(c=b.map(function(){return!0})),S.select("rect").style("fill",function(a,b,d){return d3.rgb(A(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(A(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var U=S.watchTransition(E,"multibar",Math.min(250,B)).delay(function(a,c){return c*B/b[0].values.length});v?U.attr("transform",function(a,c,d){var e=0;e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1);var f=0;b[d].nonStackable&&(f=a.series*m.rangeBand()/b.length,b.length!==I&&(f=b[d].nonStackableSeries*m.rangeBand()/(2*I)));var g=f+m(q(a,c));return"translate("+g+","+e+")"}).select("rect").attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/I;return b.length!==I&&(e=m.rangeBand()/(2*I)),e}return m.rangeBand()}):U.attr("transform",function(a,c){var d=a.series*m.rangeBand()/b.length+m(q(a,c)),e=r(a,c)<0?n(0):n(0)-n(r(a,c))<1?n(0)-1:n(r(a,c))||0;return"translate("+d+","+e+")"}).select("rect").attr("width",m.rangeBand()/b.length).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(F=b[0].values.length)}),E.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=!0,v=!1,w="zero",x=a.utils.defaultColor(),y=a.utils.defaultColor(),z=!1,A=null,B=500,C=.1,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,B),F=0;return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return v},set:function(a){v=a}},stackOffset:{get:function(){return w},set:function(a){w=a}},clipEdge:{get:function(){return u},set:function(a){u=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return z
- },set:function(a){z=a}},groupSpacing:{get:function(){return C},set:function(a){C=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return B},set:function(a){B=a,E.reset(B)}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}},barColor:{get:function(){return A},set:function(b){A=b?a.utils.getColor(b):null}},errorBarColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return F.reset(),m.each(function(b){var m=k-j.left-j.right,D=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),x&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),x&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var G=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1,yErr:s(a,b)}})});o.domain(d||d3.merge(G).map(function(a){return a.x})).rangeBands(f||[0,D],B),p.domain(e||d3.extent(d3.merge(d3.merge(G).map(function(a){var b=a.y;x&&(b=a.y>0?a.y1+a.y:a.y1);var c=a.yErr;return c?c.length?[b+c[0],b+c[1]]:(c=Math.abs(c),[b-c,b+c]):[b]})).concat(t))),p.range(y&&!x?g||[p.domain()[0]<0?A:0,m-(p.domain()[1]>0?A:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var H=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),I=H.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),J=(I.append("defs"),I.append("g"));H.select("g")}J.append("g").attr("class","nv-groups"),H.attr("transform","translate("+j.left+","+j.top+")");var K=H.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});K.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),K.exit().watchTransition(F,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),K.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),K.watchTransition(F,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var L=K.selectAll("g.nv-bar").data(function(a){return a.values});L.exit().remove();var M=L.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(x?a.y0:0)+","+(x?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});M.append("rect").attr("width",0).attr("height",o.rangeBand()/(x?1:b.length)),L.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),E.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),E.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){E.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){E.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){E.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){E.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0].values[0],0)&&(M.append("polyline"),L.select("polyline").attr("fill","none").attr("stroke",function(a,b,c){return w(a,c,b)}).attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(x?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(x?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),M.append("text"),y&&!x?(L.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=C(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+C(Math.abs(d[1]))+"-"+C(Math.abs(d[0])):c+"±"+C(Math.abs(d))}),L.watchTransition(F,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):L.selectAll("text").text(""),z&&!x?(M.append("text").classed("nv-bar-label",!0),L.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),L.watchTransition(F,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):L.selectAll("text.nv-bar-label").text(""),L.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),L.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),x?L.watchTransition(F,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):L.watchTransition(F,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),F.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=a.utils.defaultColor(),x=!1,y=!1,z=!1,A=60,B=.1,C=d3.format(",.2f"),D=250,E=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),F=a.utils.renderWatch(E,D);return b.dispatch=E,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return x},set:function(a){x=a}},showValues:{get:function(){return y},set:function(a){y=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return C},set:function(a){C=a}},valuePadding:{get:function(){return A},set:function(a){A=a}},groupSpacing:{get:function(){return B},set:function(a){B=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return D},set:function(a){D=a,F.reset(D)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}},errorBarColor:{get:function(){return w},set:function(b){w=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?B:A;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},D.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?B:A;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},D.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.seriesIndex].yAxis?B:A;a.point.x=x.x()(a.point),a.point.y=x.y()(a.point),D.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function E(a){var b=2===j[a.data.series].yAxis?B:A;a.value=v.x()(a.data),a.series={value:v.y()(a.data),color:a.color},D.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var F=d3.select(this);a.utils.initSVG(F),b.update=function(){F.transition().call(b)},b.container=this;var G=a.utils.availableWidth(g,F,e),H=a.utils.availableHeight(h,F,e),I=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),J=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),K=j.filter(function(a){return"scatter"==a.type&&1==a.yAxis}),L=j.filter(function(a){return"scatter"==a.type&&2==a.yAxis}),M=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),N=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),O=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),P=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,F),b;F.selectAll(".nv-noData").remove();var Q=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),R=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(Q.concat(R)),function(a){return a.x})).range([0,G]);var S=F.selectAll("g.wrap.multiChart").data([j]),T=S.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");T.append("g").attr("class","nv-x nv-axis"),T.append("g").attr("class","nv-y1 nv-axis"),T.append("g").attr("class","nv-y2 nv-axis"),T.append("g").attr("class","lines1Wrap"),T.append("g").attr("class","lines2Wrap"),T.append("g").attr("class","scatters1Wrap"),T.append("g").attr("class","scatters2Wrap"),T.append("g").attr("class","bars1Wrap"),T.append("g").attr("class","bars2Wrap"),T.append("g").attr("class","stack1Wrap"),T.append("g").attr("class","stack2Wrap"),T.append("g").attr("class","legendWrap");var U=S.select("g"),V=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var W=C.align()?G/2:G,X=C.align()?W:0;C.width(W),C.color(V),U.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(C),e.top!=C.height()&&(e.top=C.height(),H=a.utils.availableHeight(h,F,e)),U.select(".legendWrap").attr("transform","translate("+X+","+-e.top+")")}r.width(G).height(H).interpolate(m).color(V.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(G).height(H).interpolate(m).color(V.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"scatter"==j[b].type})),u.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"scatter"==j[b].type})),v.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),w.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),x.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),y.width(G).height(H).color(V.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),U.attr("transform","translate("+e.left+","+e.top+")");var Y=U.select(".lines1Wrap").datum(I.filter(function(a){return!a.disabled})),Z=U.select(".scatters1Wrap").datum(K.filter(function(a){return!a.disabled})),$=U.select(".bars1Wrap").datum(M.filter(function(a){return!a.disabled})),_=U.select(".stack1Wrap").datum(O.filter(function(a){return!a.disabled})),ab=U.select(".lines2Wrap").datum(J.filter(function(a){return!a.disabled})),bb=U.select(".scatters2Wrap").datum(L.filter(function(a){return!a.disabled})),cb=U.select(".bars2Wrap").datum(N.filter(function(a){return!a.disabled})),db=U.select(".stack2Wrap").datum(P.filter(function(a){return!a.disabled})),eb=O.length?O.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],fb=P.length?P.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(Q).concat(eb),function(a){return a.y})).range([0,H]),q.domain(d||d3.extent(d3.merge(R).concat(fb),function(a){return a.y})).range([0,H]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),x.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),y.yDomain(q.domain()),O.length&&d3.transition(_).call(x),P.length&&d3.transition(db).call(y),M.length&&d3.transition($).call(v),N.length&&d3.transition(cb).call(w),I.length&&d3.transition(Y).call(r),J.length&&d3.transition(ab).call(s),K.length&&d3.transition(Z).call(t),L.length&&d3.transition(bb).call(u),z._ticks(a.utils.calcTicksX(G/100,j)).tickSize(-H,0),U.select(".nv-x.nv-axis").attr("transform","translate(0,"+H+")"),d3.transition(U.select(".nv-x.nv-axis")).call(z),A._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-G,0),d3.transition(U.select(".nv-y1.nv-axis")).call(A),B._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-G,0),d3.transition(U.select(".nv-y2.nv-axis")).call(B),U.select(".nv-y1.nv-axis").classed("nv-disabled",Q.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),U.select(".nv-y2.nv-axis").classed("nv-disabled",R.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),C.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",l),u.dispatch.on("elementMouseover.tooltip",l),t.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),x.dispatch.on("elementMouseover.tooltip",n),y.dispatch.on("elementMouseover.tooltip",n),x.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),y.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",E),w.dispatch.on("elementMouseover.tooltip",E),v.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){D.hidden(!0)}),v.dispatch.on("elementMousemove.tooltip",function(){D.position({top:d3.event.pageY,left:d3.event.pageX})()}),w.dispatch.on("elementMousemove.tooltip",function(){D.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.scatter().yScale(p),u=a.models.scatter().yScale(q),v=a.models.multiBar().stacked(!1).yScale(p),w=a.models.multiBar().stacked(!1).yScale(q),x=a.models.stackedArea().yScale(p),y=a.models.stackedArea().yScale(q),z=a.models.axis().scale(o).orient("bottom").tickPadding(5),A=a.models.axis().scale(p).orient("left"),B=a.models.axis().scale(q).orient("right"),C=a.models.legend().height(30),D=a.models.tooltip(),E=d3.dispatch();return b.dispatch=E,b.lines1=r,b.lines2=s,b.scatters1=t,b.scatters2=u,b.bars1=v,b.bars2=w,b.stack1=x,b.stack2=y,b.xAxis=z,b.yAxis1=A,b.yAxis2=B,b.tooltip=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return D.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),D.enabled(!!b)}},tooltipContent:{get:function(){return D.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),D.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a),x.x(a),y.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),t.y(a),u.y(a),x.y(a),y.y(a),v.y(a),w.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),x.useVoronoi(a),y.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b
- }).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;M<b[0].length;M++)I.push(K),J.push(L);else I=z.map(function(a){return(a.outer-a.outer/5)*H}),J=z.map(function(a){return(a.inner-a.inner/5)*H}),y=d3.min(z.map(function(a){return a.inner-a.inner/5}));a.utils.initSVG(i);var N=i.selectAll(".nv-wrap.nv-pie").data(b),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-pie nv-chart-"+h),P=O.append("g"),Q=N.select("g"),R=P.append("g").attr("class","nv-pie");P.append("g").attr("class","nv-pieLabels"),N.attr("transform","translate("+c.left+","+c.top+")"),Q.select(".nv-pie").attr("transform","translate("+F/2+","+G/2+")"),Q.select(".nv-pieLabels").attr("transform","translate("+F/2+","+G/2+")"),i.on("click",function(a,b){A.chartClick({data:a,index:b,pos:d3.event,id:h})}),B=[],C=[];for(var M=0;M<b[0].length;M++){var S=d3.svg.arc().outerRadius(I[M]),T=d3.svg.arc().outerRadius(I[M]+5);u!==!1&&(S.startAngle(u),T.startAngle(u)),w!==!1&&(S.endAngle(w),T.endAngle(w)),p&&(S.innerRadius(J[M]),T.innerRadius(J[M])),S.cornerRadius&&x&&(S.cornerRadius(x),T.cornerRadius(x)),B.push(S),C.push(T)}var U=d3.layout.pie().sort(null).value(function(a){return a.disabled?0:g(a)});U.padAngle&&v&&U.padAngle(v),p&&q&&(R.append("text").attr("class","nv-pie-title"),N.select(".nv-pie-title").style("text-anchor","middle").text(function(){return q}).style("font-size",Math.min(F,G)*y*2/(q.length+2)+"px").attr("dy","0.35em").attr("transform",function(){return"translate(0, "+s+")"}));var V=N.select(".nv-pie").selectAll(".nv-slice").data(U),W=N.select(".nv-pieLabels").selectAll(".nv-label").data(U);V.exit().remove(),W.exit().remove();var X=V.enter().append("g");X.attr("class","nv-slice"),X.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),r&&d3.select(this).select("path").transition().duration(70).attr("d",C[b]),A.elementMouseover({data:a.data,index:b,color:d3.select(this).style("fill")})}),X.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),r&&d3.select(this).select("path").transition().duration(50).attr("d",B[b]),A.elementMouseout({data:a.data,index:b})}),X.on("mousemove",function(a,b){A.elementMousemove({data:a.data,index:b})}),X.on("click",function(a,b){A.elementClick({data:a.data,index:b,color:d3.select(this).style("fill")})}),X.on("dblclick",function(a,b){A.elementDblClick({data:a.data,index:b,color:d3.select(this).style("fill")})}),V.attr("fill",function(a,b){return j(a.data,b)}),V.attr("stroke",function(a,b){return j(a.data,b)});X.append("path").each(function(a){this._current=a});if(V.select("path").transition().attr("d",function(a,b){return B[b](a)}).attrTween("d",E),l){for(var Y=[],M=0;M<b[0].length;M++)Y.push(B[M]),m?p&&(Y[M]=d3.svg.arc().outerRadius(B[M].outerRadius()),u!==!1&&Y[M].startAngle(u),w!==!1&&Y[M].endAngle(w)):p||Y[M].innerRadius(0);W.enter().append("g").classed("nv-label",!0).each(function(a){var b=d3.select(this);b.attr("transform",function(a,b){if(t){a.outerRadius=I[b]+10,a.innerRadius=I[b]+15;var c=(a.startAngle+a.endAngle)/2*(180/Math.PI);return(a.startAngle+a.endAngle)/2<Math.PI?c-=90:c+=90,"translate("+Y[b].centroid(a)+") rotate("+c+")"}return a.outerRadius=H+10,a.innerRadius=H+15,"translate("+Y[b].centroid(a)+")"}),b.append("rect").style("stroke","#fff").style("fill","#fff").attr("rx",3).attr("ry",3),b.append("text").style("text-anchor",t?(a.startAngle+a.endAngle)/2<Math.PI?"start":"end":"middle").style("fill","#000")});var Z={},$=14,_=140,ab=function(a){return Math.floor(a[0]/_)*_+","+Math.floor(a[1]/$)*$};W.watchTransition(D,"pie labels").attr("transform",function(a,b){if(t){a.outerRadius=I[b]+10,a.innerRadius=I[b]+15;var c=(a.startAngle+a.endAngle)/2*(180/Math.PI);return(a.startAngle+a.endAngle)/2<Math.PI?c-=90:c+=90,"translate("+Y[b].centroid(a)+") rotate("+c+")"}a.outerRadius=H+10,a.innerRadius=H+15;var d=Y[b].centroid(a);if(a.value){var e=ab(d);Z[e]&&(d[1]-=$),Z[ab(d)]=!0}return"translate("+d+")"}),W.select(".nv-label text").style("text-anchor",function(a){return t?(a.startAngle+a.endAngle)/2<Math.PI?"start":"end":"middle"}).text(function(a,b){var c=(a.endAngle-a.startAngle)/(2*Math.PI),d="";if(!a.value||o>c)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+k+"-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+k+"-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var o=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){o(a,L.elementClick)}).on("dblclick",function(a){o(a,L.elementDblClick)}).on("mouseover",function(a){o(a,L.elementMouseover)}).on("mouseout",function(a){o(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)
- }).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b)}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;f<a.length;f++)Math.abs(e.x()(a[f],f)-b)<c&&(c=Math.abs(e.x()(a[f],f)-b),d=f);return d}if(!j){var b=d3.mouse(this)[0]-f.left;i=[a(p,Math.round(c.invert(b)))],q()}}var s=d3.select(this);a.utils.initSVG(s);var t=a.utils.availableWidth(g,s,f),u=a.utils.availableHeight(h,s,f);if(b.update=function(){s.call(b)},b.container=this,!p||!p.length)return a.utils.noData(b,s),b;s.selectAll(".nv-noData").remove();var v=e.y()(p[p.length-1],p.length-1);c=e.xScale(),d=e.yScale();var w=s.selectAll("g.nv-wrap.nv-sparklineplus").data([p]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-sparklineplus"),y=x.append("g"),z=w.select("g");y.append("g").attr("class","nv-sparklineWrap"),y.append("g").attr("class","nv-valueWrap"),y.append("g").attr("class","nv-hoverArea"),w.attr("transform","translate("+f.left+","+f.top+")");var A=z.select(".nv-sparklineWrap");if(e.width(t).height(u),A.call(e),m){var B=z.select(".nv-valueWrap"),C=B.selectAll(".nv-currentValue").data([v]);C.enter().append("text").attr("class","nv-currentValue").attr("dx",o?-8:8).attr("dy",".9em").style("text-anchor",o?"end":"start"),C.attr("x",t+(o?f.right:0)).attr("y",n?function(a){return d(a)}:0).style("fill",e.color()(p[p.length-1],p.length-1)).text(l(v))}y.select(".nv-hoverArea").append("rect").on("mousemove",r).on("click",function(){j=!j}).on("mouseout",function(){i=[],q()}),z.select(".nv-hoverArea rect").attr("transform",function(){return"translate("+-f.left+","+-f.top+")"}).attr("width",t+f.left+f.right).attr("height",u+f.top)}),b}var c,d,e=a.models.sparkline(),f={top:15,right:100,bottom:10,left:50},g=null,h=null,i=[],j=!1,k=d3.format(",r"),l=d3.format(",.2f"),m=!0,n=!0,o=!1,p=null;return b.sparkline=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},xTickFormat:{get:function(){return k},set:function(a){k=a}},yTickFormat:{get:function(){return l},set:function(a){l=a}},showLastValue:{get:function(){return m},set:function(a){m=a}},alignValue:{get:function(){return n},set:function(a){n=a}},rightAlignValue:{get:function(){return o},set:function(a){o=a}},noData:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.stackedArea=function(){"use strict";function b(m){return u.reset(),u.models(r),m.each(function(m){var s=f-e.left-e.right,v=g-e.top-e.bottom;j=d3.select(this),a.utils.initSVG(j),c=r.xScale(),d=r.yScale();var w=m;m.forEach(function(a,b){a.seriesIndex=b,a.values=a.values.map(function(a,c){return a.index=c,a.seriesIndex=b,a})});var x=m.filter(function(a){return!a.disabled});m=d3.layout.stack().order(o).offset(n).values(function(a){return a.values}).x(k).y(l).out(function(a,b,c){a.display={y:c,y0:b}})(x);var y=j.selectAll("g.nv-wrap.nv-stackedarea").data([m]),z=y.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedarea"),A=z.append("defs"),B=z.append("g"),C=y.select("g");B.append("g").attr("class","nv-areaWrap"),B.append("g").attr("class","nv-scatterWrap"),y.attr("transform","translate("+e.left+","+e.top+")"),0==r.forceY().length&&r.forceY().push(0),r.width(s).height(v).x(k).y(function(a){return a.display.y+a.display.y0}).forceY([0]).color(m.map(function(a){return a.color||h(a,a.seriesIndex)}));var D=C.select(".nv-scatterWrap").datum(m);D.call(r),A.append("clipPath").attr("id","nv-edge-clip-"+i).append("rect"),y.select("#nv-edge-clip-"+i+" rect").attr("width",s).attr("height",v),C.attr("clip-path",q?"url(#nv-edge-clip-"+i+")":"");var E=d3.svg.area().x(function(a,b){return c(k(a,b))}).y0(function(a){return d(a.display.y0)}).y1(function(a){return d(a.display.y+a.display.y0)}).interpolate(p),F=d3.svg.area().x(function(a,b){return c(k(a,b))}).y0(function(a){return d(a.display.y0)}).y1(function(a){return d(a.display.y0)}),G=C.select(".nv-areaWrap").selectAll("path.nv-area").data(function(a){return a});G.enter().append("path").attr("class",function(a,b){return"nv-area nv-area-"+b}).attr("d",function(a){return F(a.values,a.seriesIndex)}).on("mouseover",function(a){d3.select(this).classed("hover",!0),t.areaMouseover({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}).on("mouseout",function(a){d3.select(this).classed("hover",!1),t.areaMouseout({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}).on("click",function(a){d3.select(this).classed("hover",!1),t.areaClick({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}),G.exit().remove(),G.style("fill",function(a){return a.color||h(a,a.seriesIndex)}).style("stroke",function(a){return a.color||h(a,a.seriesIndex)}),G.watchTransition(u,"stackedArea path").attr("d",function(a,b){return E(a.values,b)}),r.dispatch.on("elementMouseover.area",function(a){C.select(".nv-chart-"+i+" .nv-area-"+a.seriesIndex).classed("hover",!0)}),r.dispatch.on("elementMouseout.area",function(a){C.select(".nv-chart-"+i+" .nv-area-"+a.seriesIndex).classed("hover",!1)}),b.d3_stackedOffset_stackPercent=function(a){var b,c,d,e=a.length,f=a[0].length,g=[];for(c=0;f>c;++c){for(b=0,d=0;b<w.length;b++)d+=l(w[b].values[c]);if(d)for(b=0;e>b;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}();/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
- !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
- return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
- return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
- <tr>
- <td class="{{classes_level}}">{{name}}</td>
- <td class="{{classes_level}} big">{{classes_bar}}</td>
- <td class="{{classes_level}} small"><div align="right">{{classes_tested_percent}}</div></td>
- <td class="{{classes_level}} small"><div align="right">{{classes_number}}</div></td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{methods_level}} small">{{crap}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- </tr>
- <tr>
- <td class="{{methods_level}}" colspan="4">{{name}}</td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{methods_level}} small">{{crap}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- </tr>
- <tr>
- <td class="{{lines_level}}">{{icon}}{{name}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{classes_level}} big">{{classes_bar}}</td>
- <td class="{{classes_level}} small"><div align="right">{{classes_tested_percent}}</div></td>
- <td class="{{classes_level}} small"><div align="right">{{classes_number}}</div></td>
- </tr>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Code Coverage for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <table class="table table-bordered">
- <thead>
- <tr>
- <td> </td>
- <td colspan="10"><div align="center"><strong>Code Coverage</strong></div></td>
- </tr>
- <tr>
- <td> </td>
- <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
- <td colspan="4"><div align="center"><strong>Functions and Methods</strong></div></td>
- <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
- </tr>
- </thead>
- <tbody>
- {{items}}
- </tbody>
- </table>
- <table id="code" class="table table-borderless table-condensed">
- <tbody>
- {{lines}}
- </tbody>
- </table>
- <footer>
- <hr/>
- <h4>Legend</h4>
- <p>
- <span class="success"><strong>Executed</strong></span>
- <span class="danger"><strong>Not Executed</strong></span>
- <span class="warning"><strong>Dead Code</strong></span>
- </p>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- <a title="Back to the top" id="toplink" href="#"><span class="glyphicon glyphicon-arrow-up"></span></a>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(function() {
- var $window = $(window)
- , $top_link = $('#toplink')
- , $body = $('body, html')
- , offset = $('#code').offset().top;
- $top_link.hide().click(function(event) {
- event.preventDefault();
- $body.animate({scrollTop:0}, 800);
- });
- $window.scroll(function() {
- if($window.scrollTop() > offset) {
- $top_link.fadeIn();
- } else {
- $top_link.fadeOut();
- }
- }).scroll();
- $('.popin').popover({trigger: 'hover'});
- });
- </script>
- </body>
- </html>
- body {
- padding-top: 10px;
- }
- .popover {
- max-width: none;
- }
- .glyphicon {
- margin-right:.25em;
- }
- .table-bordered>thead>tr>td {
- border-bottom-width: 1px;
- }
- .table tbody>tr>td, .table thead>tr>td {
- padding-top: 3px;
- padding-bottom: 3px;
- }
- .table-condensed tbody>tr>td {
- padding-top: 0;
- padding-bottom: 0;
- }
- .table .progress {
- margin-bottom: inherit;
- }
- .table-borderless th, .table-borderless td {
- border: 0 !important;
- }
- .table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success {
- background-color: #dff0d8;
- }
- .table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests {
- background-color: #c3e3b5;
- }
- .table tbody tr.covered-by-small-tests, li.covered-by-small-tests {
- background-color: #99cb84;
- }
- .table tbody tr.danger, .table tbody td.danger, li.danger, span.danger {
- background-color: #f2dede;
- }
- .table tbody td.warning, li.warning, span.warning {
- background-color: #fcf8e3;
- }
- .table tbody td.info {
- background-color: #d9edf7;
- }
- td.big {
- width: 117px;
- }
- td.small {
- }
- td.codeLine {
- font-family: monospace;
- white-space: pre;
- }
- td span.comment {
- color: #888a85;
- }
- td span.default {
- color: #2e3436;
- }
- td span.html {
- color: #888a85;
- }
- td span.keyword {
- color: #2e3436;
- font-weight: bold;
- }
- pre span.string {
- color: #2e3436;
- }
- span.success, span.warning, span.danger {
- margin-right: 2px;
- padding-left: 10px;
- padding-right: 10px;
- text-align: center;
- }
- #classCoverageDistribution, #classComplexity {
- height: 200px;
- width: 475px;
- }
- #toplink {
- position: fixed;
- left: 5px;
- bottom: 5px;
- outline: 0;
- }
- svg text {
- font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif;
- font-size: 11px;
- color: #666;
- fill: #666;
- }
- .scrollbox {
- height:245px;
- overflow-x:hidden;
- overflow-y:scroll;
- }
- .nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc}/*!
- * Bootstrap v3.3.4 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}�����€��pFFTMm*—Ü���ü���GDEFD������ OS/2g¹k‰��8���`cmapÚã���˜��rcvt �(ø�����gaspÿÿ������glyf}]Âo����”¤headM/Ø��œ¼���6hhea
- D��œô���$hmtxÒÇ `�����tlocaoû•Î�� Œ��0maxpj�Ø��¢¼��� name³, ›��¢Ü��¢postº£å5��¦€��
- ÑwebfÃTP��±T����������Ì=¢Ï����Ðv�u����Ðvs—����������������������‹���Ð���ZÐ��¤�2¸��������������������������UKWN�@� ÿÿÀÿ���{�������������� ����������,���
- �������h�����,��
- ��Ü�°���h�@��(� �+� �¥
- / _ ¬ ½"#%ü&&ú' 'àà àà)à9àIàYà`àiàyà‰à—á áá)á9áFáIáYáiáyá‰á•á™ââ âââ!â'â9âIâYâ`øÿÿÿ��� �*� �¥ � / _ ¬ ½"#%ü&&ú' 'àààà à0à@àPà`àbàpà€à�ááá á0á@áHáPá`ápá€á�á—â�â âââ!â#â0â@âPâ`øÿÿÿÿãÿÚÿfÿbàßäßµßißYÞÜýÚÚÙ!ÙÙ
- þø÷ñëå|vpjdc]WQKEDÞÜÖÕÎÍÅ¿¹³��������������������������������������������������������������������������������������������������������������Œ�������5��� ��� ������*���+������ ��� ������¥���¥����� ���
- ����� /�� /����� _�� _����� ¬�� ¬����� ½�� ½�����"��"�����#��#�����%ü��%ü�����&��&�����&ú��&ú�����' ��' �����'��'�����à��à�����à��à ���!��à��à���&��à ��à)���0��à0��à9���:��à@��àI���D��àP��àY���N��à`��à`���X��àb��ài���Y��àp��ày���a��à€��à‰���k��à���à—���u��á��á ���}��á��á���†��á ��á)������á0��á9���š��á@��áF���¤��áH��áI���«��áP��áY�����á`��ái���·��áp��áy���Á��á€��á‰���Ë��á���á•���Õ��á—��á™���Û��â���â���Þ��â ��â ���å��â��â���æ��â��â���í��â!��â!���ï��â#��â'���ð��â0��â9���õ��â@��âI���ÿ��âP��âY�� ��â`��â`����øÿ��øÿ���õ�õ���öª�öª���
- ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(ø���ÿÿ���(��h ���.±�/<²�í2±Ü<²�í2�±�/<²�í2²ü<²�í23!%3#(@þèðð üà(Ð��d�dLL�[��27>32+&/#"&/.=/&6?#"&'&546?>;'.?654676X&
- žjžà
- àžjž
- )"&
- žjžà
- àžjž
- )L
- àžjž
- )"&
- žjžà
- àžjž
- )"&
- žjžà
- ��������LL�#��32!2#!+"&5!"&=463!46ÂÈ^þ¢Èþ¢^Lþ¢Èþ¢^È^�����p��@L�E��32!2+!2++"&=!"&?>;5!"&?>;&'&6;22?69ú
- þ”
- x
- }
- x
- }”þí
- x
- }þí
- x
- vþ”
- ú¤¤L
- þ” d ®® d l
- ¤¤���d�Œ®�;��2#4.#"!!!!32>53#"'.'#7367#73>76èòp<µ#4@9+820{dþÔ–dþÔ 09B49@4#®bk§Îv$BÙdpÚd†>u®½hi-K0!.O2d22dJtB+"0J+«kuž0ªwd/5dW…%����{��L°�>�G��!2+!2++"&=!"&?>;5!"&?>;4632654&#¬^CjB00BjC²
- x
- Š
- •
- þõ
- x
- uþõ
- x
- u¶Ë@--@°$?2O*$$*P2@%d ¯
- ¯ d Û
- ÈþÔBVT@���È�L¼���!2#!"&=46ú üà¼ÈÈ����È��è°�%�A��+32!546;5467.=#"&=!54&'.467>=è2cQQc2üà2cQQc2ÈA7 7A�A7 7A°–d[•##•[––––[•##•[d–Èd<c2<2c<––<c2<2c<d���������������1��ÿò,ÂA���2632#!"&5467&546÷nµ,,.xªªxýOqUBØAwaxyrPEk™×������d°¯�����32!546;'&>76!'ö
- ˆÓûPÔ‡
- $
- op zy¶Ã³#»ý%**%ê·$ ”–üp�������d°L���#�7��!2"'&6&546 6'&4#!"&7622?62~
- ýÌýÌþø
- Œ
- þø\l
- û‚
- l¤¤L
- ýÉ7
- Úþøþø
- &
- þð
- ýÚ
- €þ”
- l¤¤���ÿðÿðºº� �
����2'7' à&™
cÖ_"ý™Öfþþ³nº
™&\Ö`þtýšÖfüjpO�������°°���32!546;!¼úüàúþ°ŠýÚ22&&�����Lœ���%6.676.67646p…'0SFOˆ$WOHBý¨XAOˆ$WOHBù£"üÁ7Q)mr ›ý¢*`)nq&*���� ÿø»§��)���2"'#'".4>"2>4&�ȶƒNN;)þíwŽd¶ƒNNƒr°”VV”°”VV§Nƒ¶d�yþî%:MNƒ¶È¶ƒ[V”°”VV”°”��d�X¯D���>.54>‰0{xuX6Cy„¨>>§…xC8ZvxyµDH-Sv@9y€²UU²€y9@vS-H���ÿÓ�^{”���62!2'%&7%&63—ƒ�¥þª‚þ©þª‚þ¥ aþŸùþoö÷�û�ÿÓ�^{”��"��62!2'%&7%&63#7'7#'—ƒ�¥þª‚þ©þª‚þ¥óðÅJÁÃJÀêN aþŸùþoö÷�ûdŽâ‹ŒåŒÓ������°°�&��2##!"&=467%>="&=46X|°>& f
- û‚
- f &>°°°|ú.hK
- æ
- ]
- ]
- æ
- Kh.ú|°���
����°L���#�'�+�/�3�7�G�K�O�S�W��!2#!"&54635)"3!2654&33535!3535!35!"3!2654&35!3535!35~
- û‚
- Ud£ýÚ
- &
- sdüd düd dáýÚ
- &
- üïd düd dL
- ûæ
- ddd
- þ¢
- ^
- ddÈddddÈddddd
- þ¢
- ^
- dddddÈdddd������LL���/�?��!2#!"&546)2#!"&546!2#!"&546)2#!"&5462�þpm�þpý½�þpm�þpLþp�þp�ý¨þp�þp��� ����LL���/�?�O�_�o�����32+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=462ÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈLÈÈÈÈÈÈþpÈÈÈÈÈÈþpÈÈÈÈÈÈ�����°L���/�?�O�_��32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ÈÈ¥¼ýDþ…ÈÈ¥¼ýDþ…ÈÈ¥¼ýDLÈÈÈÈþpÈÈÈÈþpÈÈÈÈ�����&�,è ��� 62"'&4?622Ñ;±üñþ€±«Ý;±üð€±«��n�nBB�#�� "' "/&47 &4?62 62ˆ²þõ²þôþô²þõ²;³þôþô²þõ²²þõ��ÿëÅ™��%�I���2"'#".4>"2>4&3232++"&=#"&=46;546™Ä³‚MN,mþÔwŽb´�MM�o³˜XX˜³™XXþ¼–
- K
- K
- –
- K
- K™M‚³b�yþÕl+MM�´Ä³‚MX™³˜XX˜³™#
- K
- –
- K
- K
- –
- K
- ���ÿëÅ™��%�5���2"'#".4>"2>4&!2#!"&=46™Ä³‚MN,mþÔwŽb´�MM�o³˜XX˜³™XXþX^
- þ¢
- ™M‚³b�yþÕl+MM�´Ä³‚MX™³˜XX˜³™‡
- –
- –
- ������™°��-��32+"&5465".5472>54&&dd§Ò[›ÖêÖ›[Ò§g|rÅèÅr|°þp�á¦>þÙ¸uÖ›[[›Öu¸'>¦7ÈxtÅrrÅtxÈ��d��°°���/�?��32+"&54632+"&54632+"&54632+"&=46–
- –
- þÞ–
- –
- þÞ–
- –
- þÞ–
- –
- °
- û‚
- ~
- þp
- ý
- î
- þÔ
- þ>
- Â
- È
- ú
- ú
- ������––�G�O��27'#"/&/&'7'&/&54?6?'6776?6"264X!)&1-†=+P˜˜P08†,2&+!)&1-†<,P
——
P/:…-1&+x²~~²~–˜P09†,1&+"(&1,†=,Q——Q09†-0&* !(&0-†=,P˜þ™~±~~±��d��°���!�%�)�-�1��!2!2!5463!546!5#!"&53333333ô,);
- û´
- ;),,;)ýD);dddddddd;)d
- KK
- d);dddþÔüà);;) dýD¼ýD¼ýD¼ýD¼����Ñ���62++"&5!+"&5#"&l`
- ¯
- ú
- þÔ
- ú
- ¯
- j`ý
- ýÁ
- wþ‰
- ?
- ��d��è°����3!#!"&5463#"&=X;),üàRú°þp);ývLþpú���™™���0���2".4>"2>4&3232+"&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|2
- ¯
- ú
- ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ
- þí
- 2
- ^
- ����ÿœ��°����)#!3333ýæ)ò)ýæ¯Ñ¢Ðþžà�þp°þÔ,þpþÔ,�����d��°°��/��3232"'&6;4632#!"&546;2!546&È¿
þ¹
&
þ¹
¿T2
- ûæ
- 2
- „°þ>þp�Âüà
- þ¢
- ^
- ¯¯
- ���™™���1���2".4>"2>4&3232"'&6;46ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|–
- ‰
-
ß
&
ß
- ‰™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ
- þíþí
- �����™™���1���2".4>"2>4&%++"&5#"&762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþçß
- ‰
- –
- ‰
-
ß
&™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅþíþí
- ��������°°��9��!2#!"&'&547>!";2;26?>;26'.áî
- ºû´¹—ýÔ
- W
- –
- &
- ú
- &
- –
- W°
- ýtþW
©Œ
- Èþ>
- ˜
- ˜
- Â���™™���'���2".4>"2>4&&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ‹ýý™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ]¾$¾����™°�(��76#!"&?&#"2>53".4>32³‡
- þ–…m�tÅrrÅèÅr–[›ÖêÖ›[[›ÖuÀ$‡þ–
- …LrÅèÅrrÅtuÖ›[[›ÖêÖ›[������™°��5��76#!"&?&#"#4>323#"'&5463!232>³‡þ—†n�tÅr–[›ÖuÀë–[›ÖuÀœ†h
- …n‚tÅr$‡þ—†KrÅtuÖ›[ý¿uÖ›[v†
- h…LrÅ���
- �d��°°���/�?�O�_�o����Ÿ��!2#!"&546!"3!2654&32+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=46}
- ûæ
- Àü®
- R
- ý2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- °
- û‚
- ~
- È
- ü®
- R
- d
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- ��������L°��#��54&#!"#"3!2654&#!546;2„uSþÔRvd);;)„);;)ý¨È ÈSuvRÈ;)ý¨);;)X);––��d��LL� �7��32#462#".'.#"#"'&5>763276}2
- dÀ!C@1?*'),GUKx;(.9)-EgPL
- ûÍ3
- 0þ[;P$
9¶7WW������°—�!�1�A���2+"&54. +"&54>32+"&546!32+"&546äèÞ£c
- 2
- �äþúä�
- 2
- c£* ` —c£ÞtþÔ
- ,ÑrrÑþÔ
- ,tÞ£ýÀþ4Ìþ4Ì�������ÓGÝ��9��%6'%&+"&546;2762"/"/&4?'&4?62A þþú
- úXx"xx"xx"ww".¬
- ý
- ¬
- ^
- „x"xx"ww"xx"�������ÓrÝ��/��%6'%&+"&546;2%3"/.7654'&6?6A þþú
- úÒ
- `Z HN.¬
- ý
- ¬
- ^
- d �¡š g~„j�������Äbì��1�K��3#"/.7654&'&6?6%6'%&+"&546;2%3"/.7654'&6?6LJD@
- *o;7 *ý‚ þþú
- úÒ
- `Z HNì ³ÙiËT "–²Z¬G !¾¬
- ý
- ¬
- ^
- d �¡š g~„j����
����°°� ����!�%�-�;�?�C�G�K�O��3#!#!#3!##5!!!!#53#533!3533##5#535#5!!#53#53#53!5!ôddþpdô¼ÈÈþÔÈdXû´,�,üàdd¼ddýDÈþÈdôÈdÈddÈ,ýD,ddd„ddþddôþÔ,„dddXþdÈ,,ÈdþÔ,þÔ,ÈdddþþôdþÔddddÈdÈþÔ,ÈdddþÔddd���� ����°°���������#��7#3#3#3#3#3!5!#53#53#53dddÈdd�ÈÈÈdd,ÈÈüàþÔ,ÈddÈdd,ÈÈÈèüèüèüèüèûPdd[[[[[�����
- ¦°�
��� "'463&"26ôªþ0ýV
- C;S;;S;°ýVþ0ªÛ
- Í;;T;;�������
- Ò°�
��!�� "'463!"/ &"26ôªþ0ýV
- ªþ08¨ýDþÓ;S;;S;°ýVþ0ªÛ
- ýVþ08ª¼Í;;T;;�����d��°°�&��!2&54&#!"3!2#!"&54?6,9K@
- ýD@
- ¼
- ü®
- ‹°Kü|@
- ¶
- @
- üJ
- Ï‹����ÈÿÿL°�
- ��!2 46ú þ>þ>°û‚¼þC��������°°��E�U��!"3!26?6'.#"#!"&/.+";26=463!2;2654&!"3!26/.6þDN9
- Â
- >SV–
- N
- ýÚ
- N
- –
- –
- î
- –
- þ±þ
- &
- X
- &°
- þÓl l-
- þp
œ
œ
- ýv
- –
- –
- Š
- ý¨
- ˜
- ˜
- �������d°L��!�)�1��3232#!"&546;>35"264$2"&4ôÈ8]4$–);;)ü);;)– '3]ÈdþϾ‡‡¾‡þïV<<V<L);;;)ý¨);;)X);E5+þÔddF‡¾‡‡¾<V<<V�����5��°¯� �#�� !526/!3!567>?!©�(%
- þ_5,Rþy:" *2þ“8�¬T¢¯ü2*BBW-Þ‘Y".BB%
îýZÉ�����d��ð°�'�2�;��#!5>54.'52%32654.+32654&+ñ50;*7Xml0þ);!×9uc>--þ�‹Ni*S>vØPR}^Ÿ�3:R.CuN7Y3(; G)IsC3[:+ 1aJ);4ü®ePZ����È��o°���!56764.'&'5mSB„ ,Jþº
°95(ü¹1(aaR@ 9����ÿµ��°�%�/��#4.+!52>5#"#!#3'3#72&È2þp"È&2èû›KK}}KK}„ ü®dd R ,Èüà§§ §��!ÿµ�°�%�/��#4.+!52>5#"#!5!'7!5L2&È2þp"È&2èC§üà§§ „ ývdd Š ,û‚}KK}}KK�����°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Xý¨èü üàLû´LddþÔddþÔddþÔdd�����°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=46ú¼ýD³Lû´Ý¼ýD³Lû´LddþÔddþÔddþÔdd�����°L���/�?��5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&ôXý¨þpèüÈ üàþÔLû´¶ddþéddþéddþédd������°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Lû´Lû´Lû´Lû´LddþÔddþÔddþÔdd�����°L���/�?�O�_�o���32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ddA üàþéddA üàþéddA üàþéddA üàLddddþÔddddþÔddddþÔdddd��ÿœ��°L���#�*�:�J��!#;2+"&=46!2#!"&=465#535!2#!"&=46!2#!"&=46�dd–ddôþþú§ÈÈÂ,þÔXý¨LddþÔddú}KdK¯ddþÔdd�������L���#�*�:�J��32+"&=46#3!2#!"&=463#'7!2#!"&=46!2#!"&=462ddgddü®ôþ/Èȧ§ûæ,þÔXý¨Lddû´LþÔddÈdK}}¯ddþÔdd�������Ȱè����!2#!"&546 Kî,,ý,,„þÔ,è,ýv,,Š,ýD,,�����°L�����!2#!"&5467'2"&4,Xû¨J÷*J%ìüÒpNNpNLüôdý¶ƒœ>þàôtNoOOo�����Û�6‘����2.'&54>"264ˆuÆsFE²66 !^Xm)<DsŸ··‚‚·‚‘xÊus�mé?>!fh˜H„uX£yH¸��¸�����™™�����2".4>"ãêÖ›[[›ÖêÖ›[[›KtÅrrÅ™[›ÖêÖ›[[›ÖêÖ›üoVrÅèÅr���u�ß��5��.54>6?6&'.'&76#&*IOWN>%3Vp}?T›|J$?LWPI¼)(!1 ) H�uwsu‡EG€^F&:c—YE‡vsxv�ýþ!K‚:%A'#"
- A)Y¶�������Ël��*�/��7>%!2!"3!26=7#!"&546 7èl
- lý�27»þ�);;)ô);È»£þp¥¹¹8þ–¡7cõs*
- sÈ
»;)þ);;)¶Èþ´¥¹¹¥�¥¹þ×þ–2ªc�����“L��6��!#"3!2657#!"&546&'5&>75>^i¤4Ã);;)ô);ȹ¥þp¥¹¹Sþ¬9dTX
- .9I@F*L’6;)þ);;)™g¥¹¹¥�¥¹þÓþÎ Ë
0!;bA4Ò
- ���������L��5��!2!"3!26=7#!"&546 62"/&4?622^^<C²þ£);;)ô);ȹ¥þp¥¹¹Ê‹eýíøeoL±;)þ);;)EÈÛ¥¹¹¥�¥¹þ3‹eýìøeo����
- �
- ¦¦�;�� 62+3546&=#32"'&6;5#'&47635#"&>
- ªÈ
- þø
- Ȫ
- þüþø
- ¯È
- þø
- ȯ
- –þø
- È
- þüþ÷
- È
- þø
- È
-
- È
- ��È��„L���326'+"&546údÐþ0dLþJÅüÅþJè�������°L�#��3266''+"&5462dÐÐþ0þ0dLþJÅþJÅüÅþJÅþJè������°3���''&4766°þ0þìÐüÅþJà*àþJÅ����È�36���&546ó.üÒ2þþè��È�d„è����32+"&546!32+"&546úÈÈ¥ÈÈèüà üà ���È�dLè���#!"&5463!2Lüà ¶üà �������3���46&5&546ôìþþ0d¶þ *þ ¶þ;è��ÿþ�³O�#��72#"&5&5&5464646ddþ1þ2ÒÒNüµþ: µþ9 è þ>¶ þ=¶��,��èL���32+"&5&54646Rddþ0ÐLü¶þ;èþ;¶���d�ȰH���� #!"&762!2#!"&=46®õ ûî õ*ý÷èü9ýäýHdd��ˆÿüuJ��� uþ `ÅýØ(„þŸþŸÆ(&����;ÿü(J��� ' 7(ýÙÆaþŸÆ#ýÙÆaaÆ���™™��3���2".4>#"#";;26=326=4&+54&ãêÖ›[[›ÖêÖ›[[›}d––d––™[›ÖêÖ›[[›ÖêÖ›º–d––d–������™™�����2".4>!"3!26=4&ãêÖ›[[›ÖêÖ›[[›Eþô™[›ÖêÖ›[[›ÖêÖ›þ~dd���™™��3���2".4>"'&"2?2?64/764/ãêÖ›[[›ÖêÖ›[[›å xx � xx � xx � xx �™[›ÖêÖ›[[›ÖêÖ› xx � xx � xx � xx ����™™��$���2".4>'&"2764/&"ãêÖ›[[›ÖêÖ›[[›T‹òw‹™[›ÖêÖ›[[›ÖêÖ›þ1U‹ñw‹������™™��;�K���2".4>";7>32";2>54.#";26=4&ãêÖ›[[›ÖêÖ›[[›?<B2!ƒ
(#"3D<:–
- –
- ™[›ÖêÖ›[[›ÖêÖ›‘/O2*(8\6/H* ýã
- –
- –
- ����™™���>���2".4>#";26=4&#";#"3!26=4&+4&ãêÖ›[[›ÖêÖ›[[›––
- –
- ú
- KK
- ^
- K™[›ÖêÖ›[[›ÖêÖ›V
- –
- –
- þÔ
- 2
- È
- 2
- 2
- �����°°�/�_��3232++"&=.'#"&=46;>7546+"&=32+546;2>7#"&=46;.
–
- g—Â
- —g
- –
- g—Â
- —g¹
- –
- Df¨
- ¨fD
- –
- Df¨
- ¨f°
- —g
- –
- g—Â
- —g
- –
- g—Â
- þͨ
- ¨fD
- –
- Df¨
- ¨fD
- –
- Df���™™���?���2".4>"2>4&"/"/&4?'&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrš@||@||@||@||™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅZ@||@||@||@||�����™™���0���2".4>"2>4&"/&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrƒjþÀÊjOÅ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ}jþ¿ËjOÅ�����™™���!���2".4>"&32>54ãêÖ›[[›ÖêÖ›[[›KtÅrAKiõý¸hstÅr™[›ÖêÖ›[[›ÖêÖ›;rÅtxiKAÐý¸>rÅts������S°ù���6!2#!'&4'
- &ýÚýöF«
- þÝÈþÝ
-
«
&�������S™ù��� &5!"&=463!46
- ýöýÚ&ñþU
&
þU
- #È#
- ����·��]™��� #!+"&5!"&762ª«
- þÝÈþÝ
-
«
&‰ýöýÚ&
- ����·�]°���32!2"'&63!46&È#
-
þU
&
þU
- #°ýÚýö
- &�����·™]��� &5>746
- ýö^°¥�$,[‡Ç~UþU
&
þU
- #$DuMi±�qF
- �����°°��+��!2/"/&4?'&6!"&546762R,^ùjù^þ!þÔ^ùjù^°þÔ^ùjù^ûP,^ùjù^����I�Igg��+��#!"&546762!2/"/&4?'&6öjù^þÔ^ùý,^ùjù^`jù^,^ùýñþÔ^ùjù^������™™���/���2".4>#";2676&#";26=4&ãêÖ›[[›ÖêÖ›[[›³Ð:#6#:1–
- –
- ™[›ÖêÖ›[[›ÖêÖ›ºþÒ.þ
- –
- –
- ��������°°�I�U�a�h�o��276?67632;2+"!#!54&+"&=46;2654?67>;26/.'&;26!"&5)#! Ä&Ä0
- =
- 2
- þpÈþp
- 2
- = �¦
- Û
- 3þ5±3
- çþ‰
- �X
- þ‰°
-
v
v
- !{,
- 2
- ¯,þÔ¯
- 2
- 0€y¢
- •
- ª�
- �
- ür
- wþ‰
- ��������¯¦�+�I��6.'&&&547>7>'.>7>&67>7>7>�-Bla‹bŽD8=3™*U :1'Ra\‡{À%&¢=>8\tYR-!Šq[Fak[)¦²þÝÈ•X1™"@&J<7_…?3J5%#/D &/q!!6ROg58<'([@1%@_U2��]�rÏ�O��.>7'&767>.'&'.'&>77>.'&>�'
- '8GB
- `ŠH
>JS>H7
'+" NA
- 5M[`/Pg!;('2"&"IbYÏC€e\D9$886#1%)*ƒ‘§—J7gG:
8G\au9hªoK$œ]54<<E"5cQ8
.@AU!U™hQ)����ÿÜ�jÔF��?�Q���2".4>&"&5476&2>76&'&6?6&'&'.¤�{nO9:On{�¢�{nO:9On{°ø°FZ
2Z_ƒˆƒ_Z2Zýÿ# %8-#,-"F-I\b\I*I\b\I--I\b\I*I\b\IÜ9>|°°|;7Es1$F^D10E^E$1u$/D0
"%,I���ÿÜ��Ô°��'�;�L��!#7.54>327377>76&'&%7.5476&6?'&'.P”[©vY,9On{�R=A ”&/l‰'Pj˜R.Mv&6ýQFZ
*HLh5)k�|# %8-,-"xatzbI\b\I-yþRµUÖ4Zrnc1ˆ?1FrEs1<QA9
š§n;7p$/D0
V,I���ÿž��«���(��'6#!"&%!546;2!32+"&/&6Z‚8‚%úò%
- Y
- –
- YþChÐ:#6#:d*!ûà GD„K
- KÓßüü����d�°°�(���2'%/&=47&=4674L|Xkþ™dÍÍdþ™k°X>þþ»1)
ùþù]@ €€ @]ù
)1ES>�������L°��'�+�/�3�7�;�?�C�G�K�O�S�W�[�_�c��3232!546;546;2!546#!"&5353353353353353533533533533535335335335335Rd2û´2dôüddddddddddü|dddddddddü|ddddddddd°2––222þpýîÈddddddddddÈddddddddddÈdddddddddd������w—��%�7��&=#!"&=46;3546'#"&=463!&=#'73546oùùŸý¨þÝÑXñý©�zÑ#ùùñµ�zŸ�æ*æ–ý¨dX–þ˜�zdþMæ*æ–µ�z–�������°L���!2#!#"&546dè);;)ý¬þÐd);;L;)ý¨);þÔ,;)X);����d��L°� ��?��32!546!32!546".5!2>&54=–ÈþÔÑÈþÔ(LfœÀœfL(,
'6B6'°úúúúþpþÔ)IjV\>((>\VjI),ú +'%! !%'*ú���ÿÿ�ÔLÂ��� 'LÆþŸþŸÅ'›ÇaþŸÇ'����îMÜ��� 7 MýÚýÙÆaaýÙ'ÇþŸa����ÿQ�d_è��)��!232"/&6;!%+!!"&5#"&?62”ê–æ*æ–þƒþæ–�×ý–æ*èýÙùù‘¸ùþpÈ&ù�����ž°�0��32!2#!!2+"&=!"&=#"&/#"&468^&€d,!ý‡02*þÔ*É6°¢%þ%+È*2222
- Á*��������°L����!53463!2!!°ûPÈ;),);ýD°ûPèdd);;)Èüà�����ÜL����3463!2!!ÈÈÈ;),*:ô,þÔûP, þpX);;)ÈdýD¼�E��k¯���+32"/&6;#"&?62{æ––æ*æ––æ* ùý§ùùYù����D¯k���&=!/&4?6!546¨ùùý¨ùùX`å)å —— å)å •• �������°°� ���!��.#!"!"3!26=4&53353‘¬$ý`$¬-ü);;)è);;þ«ddd�Ü-(ýd;)d);;)d);Èdddd���ÿœ�d°L��#�1���2"&54%##"+"&'=454>;%".=4>7i**dý]&/T7È£ü"Lü®Rü™ÈþìQú
úþÔú)2(����J��f°�,�5��3232#"./.46;7>7'&6327"&)^Sz?vdjŸO9t\U>/v?zS$24517F8°%Mþ¹)(
- ()GM~ û¾1==���œœ���7'''7'7'7'77 àNê´´êNà-››-àNê´´êNà-››²Nà-››-àNê´´êNà-››-àNê´´����d°°�!�-�=��32!2+"&/#"&54?>335!7532+"&546Š2(<H(<î,úF=-7‘`
1d–dˆÖúþ>2ývdd°Q,–}Q,d-þ¨!2$'�$ÄÆ(dÔÕþ‰dw}á¯þÔþô��������°L� �0�<��32#!+"&/&546;632+"&546!#35'!5Xú,î<(þ¸<(21
`‘7-=|ýédd_ˆd–d22ÂúL!þ¨-d,Qv–,Q(ÆÄ$�'$ddþôdþ‰ÕÔ¯á}w����dO��7�G��%6!2+#!"&5467!>;26&#!*.'&?'32+"&546dkn
T.TlnTjƒþª¦:d%ƒËþ8
- ’VýOddiæp
&yL�Nþ(¢
%
- Hþ YS(22·Säþô���ÿœ�d°O��6�F��#!"&'#"&463!'&6?6*#!32!7%32+"&546Ûn
¬þªƒjUmlT.U
nJ’
- þ%Ý‚&jþªPddOæýó
¢(SN�Ly&
p®·d(þY÷ìäþô����a��L��7�G���2#!"&/&?>454&/!7%.!2#!"&=46Þ�NS(¢
ýó%
- æp
&yÆ22·Sì÷Yþ(–ôþnTjƒþª¦kn
T.TÖËþ8
- ’Vþd%ƒýdd�ÿý�è��-�I��!26=4&#!""&5&/&7>3!2766=467%'^ôþN�Ly&
pæ
¢(ý‰ìS·22(SYLddüæjTnlT.T
nk¦þªÏþV’
- þ8˃%d���šš��%���2".4>%&!"3!7%64âìÖ›[[›ÖìÖ›[[›†þíþí
- š[›ÖìÖ›[[›ÖìÖ›þ9ß
- ‰
- –
- ‰
-
ß
&����šš��%���2".4>
6=!26=4&#!54&âìÖ›[[›ÖìÖ›[[›%þí
- þíš[›ÖìÖ›[[›ÖìÖ›èß
&
ß
- ‰
- –
- ‰
- �����šš��%���2".4>&";;265326âìÖ›[[›ÖìÖ›[[›Kß
&
ß
- ‰
- –
- ‰
- š[›ÖìÖ›[[›ÖìÖ›þ@þíþí
- ����šš��%���2".4>#"#"276&+4&âìÖ›[[›ÖìÖ›[[›—–
- ‰
-
ß
&
ß
- ‰š[›ÖìÖ›[[›ÖìÖ›»
- þíþí
- ����˜˜��–�¦���2".4>%&277>7.'.'"'&65.'6.'&767>'&>7>7&72267.'4>&'?6.'.'>72>äèÕ›\\›ÕèÕ›\\›d+:
- =?1 ""/?9
#hu!$
0E.(,3)(
- *!A7,8
!?*
- ˜\›ÕèÕ›\\›ÕèÕ› '"r"v G
- .&*
- r$> #1
-
%
*
- '"
$g2( %
- �������¯…���67'"/&47&6ô¤Žþý‘ûPM<†;ý¬+oX"O…\eŠè~Y‡+"ý¬n+WeÉ����`°¬���#�'�7�;��!2#!"&=46#3!2#!"&=46!!!2#!"&=46!!dè);;)ü);;ÈÈüè);;)ü);;þôüè);;)ü);;þÔ,¬;)d);;)d);ddÈ;)d);;)d);ddÈ;)d);;)d);dd����d��L°����!2#!"&46!–„ü|;Èþ¢„°**ýDþÔÈôô������d°°���%��32!2!5#!463!54635#!"&=ôÈ);,);þÈþ;),;)Èô;)ü);°;)d;)þpdd�);d);dddýDÈ);;)È�������°°��+�A�W��!2"/&546)2/"/&4?'&6#!"&54676276#!"&?'&4?622,^ÇjÇ^5,^ÇjÇ^þ/jÇ^þÔ^ÇË^þÔ^Çj°^ÇjÇ^,þÔ^ÇjÇ^ý&jÇ^,^ÇÎ^þÔ^Çj�������¨¨���#�;�C�K���2".4>"2>4&$2"&4$2#"'"&546?&542"&4$2"&4ÛòÝŸ__ŸÝòÝ ^^ Æà¿oo¿à¿ooþ-- - L- 73H3)z þ‡- - - - ¨_ŸÝòÝ ^^ ÝòÝŸWo¿à¿oo¿à¿ -!!- -!
- ‘$33$ 1~¤ - - - -�ÿØ�Z¹¼�[��%676&'&#"�3276'.#"&47�7>32#"&'&6767632'."Õ[v_"A0?! þˆ-
Y7J3$$
þ«)G"#A.,=
#(wn‹kV8@Fv"0DÿG([kPHNg8Bþ*Ö[eb›2!þ‰5(7>B3$$'þ®)M"#!7)/c#*xn‰fL@9N¾DÿH7!$†W]µBþ$&����d�X¯D��D��>.54>"".#"2>767>54&‰0{xuX6Cy„¨>>§…xC8Zvxy#!?2-*!')-?"CoA23:+1!
"3)@+)?jµDH-Sv@9y€²UU²€y9@vS-H-&65&&56&oM8J41<*.0(@ )*D*2Om��9ÿòw¾��.���2&/7'/&477"/&4?«»B�B8"._÷þ{Ôi�BBi
- �BBþåBºB�BB7._÷…¾B�B^*k"5._øþ{Ôj�BºBþFi �BºBþåBB�B»B77/_ø…�����È��è°������2#!"&54>!�"264ªšd:;)ý¨);<f>XþÿV==V=°.2üG);;)¹3-ªýD¼ý=V==V�����°°��� "/''!'&462†*$þéÔþÌþèË3Ò,#*¡þæ*#þõþÔÒþÍË4Ô$*����'� à�2�@�K��#.'#5&'.'3'.54>75>4.¼&ER<,Ÿ
3'@"<P7(²›d–W(‹WJ.BN0 2Uh:**& h)1"37àN,?iB$.,þÍ
-<d>‹ªMOW(kVMbO/9X6FpH*Mþ6&+ÐþÊ 4C4%����d�f”�J��2#4.#"3#>36327#".'>7>'#53&'.>761T™^™'<;%T)ñÅ-6"b Œ"S5268 jt&'V7 0$ݦ
- -$aP‹N(?",9J0* d2‚>2
- "“"‘
- 7�Gd/9+DAL!X����ÿÿ—°����32"/&6;3+##"&?62�–æ*æ–Èæ–È–æ*,úú„ùü|„ù���ÿÿè°����%��#5##!32"/&6;3353!57#5!èddd,ý¨–æ*æ–È‘dcÈÈþÔÈÈ,¼ddôü|úú„dÈÈýúd–úd�����ÿÿè°���!�%��32"/&6;33!57#5!#5##!35�–æ*æ–ÈXÈÈþÔÈÈ,ddd,Çd,úú„–úd–údûPddôdÈÈ����ÿÿL°������32"/&6;3##53#5#!35�–æ*æ–ÈXddÈddÈ,Çd,úú„þ�dûPd�dÈÈ�����ÿÿL°������32"/&6;3#5#!35##53�–æ*æ–ȼdÈ,ÇdddÈ,úú„þd�dÈÈû´�d�����ÿÿ°°�������32"/&6;3#53!5!!5!!5!�–æ*æ–ÈôÈÈdþÔ,dþp�dþô,úú„ÈÈþÈþÈþÈ��ÿÿ°°�������32"/&6;3!5!!5!!5!#53�–æ*æ–È þôdþp�dþÔ,dÈÈ,úú„ÈÈþÈþÈþÈ�����LL����!2#!"&546!"3!2654&^�¢¼»£þp¥¹¹gþ);;)ô);;L»£þp¥¹¹¥�¥¹È;)þ);;)ô);��������LL���+��!2#!"&546!"3!2654&&546^�¥¹¹¥þp£»¼dþ);;)ô);;þoýýL¹¥þp¥¹¹¥�£»È;)þ);;)ô);‚¾$¾���������LL���+��!2#!"&546!"3!2654&!2"/&6^�£»¹¥þp¥¹¹gþ);;)ô);;þ�¾$¾L¼¢þp¥¹¹¥�£»È;)þ);;)ô);Èýý�������LL���+��!2#!"&546!"3!2654&#!"&?62^�¥¹¹¥þp£»¹gþ);;)ô);;þû¾þp¾$L¹¥þp£»¼¢�¥¹È;)þ);;)ô);Ïýý��������L��5��!2#!"&=463!2654&#!"&=46&=#"&=46;546&�¥¹¹¥þpÂ);;)þ>¿Dþ¼úúL¹¥þp¥¹d;)ô);déþä&þä
- –È–
- ���Ù�מ�#��%2"+'&7>?!"'&76�6763 ˜,þ÷þó P''þÒ
- K
» ž
- þS#þÊþÅ ånnV/Ó�������þL��5��!2#!"3!2#!"&546&=#"&=46;546^�þ>);;)Âþp¥¹¹ñDþ¼úúLd;)þ);d¹¥�¥¹éþä&þä
- –È–
- �����°°��1��!2/"/&47'&6#"3!26=7#!"&5463!î�mþÈ)�8mþïœ);;)ô);È»£þp¥¹¹¥,°þpmþÈ�)8mþÔ;)þ);;)”ÈþÖ¥¹¹¥�¥¹����¢¢���#���2".4>"2>4&2"&4áîÙ�]]�ÙîÙ�]]�ÃæÂqqÂæÂqqþ{ rr r¢]�ÙîÙ�]]�ÙîÙ�GqÂæÂqqÂæÂsr rr ������L°���#��3232"'&6;46!2!54635ÂÈõ
- þ�'
þ…
úþ…èû´gd°þ¢þVª^ü|úúd22�������L¬���#�� ++"&=#"&7>!2!54635Gz
- ô"Èú'ýùèû´gdžþM úú!¯üúúd22�����LK���"�� 62"'&4?62!2!54635Œq‹ýóþÜ‹Ôèû´gdÓq‹ýó#‹ýÒúúd22�����L›� ��#�'��762'&476#"&?'7!2!54635‡Ž*MÔMÒý«ÐšÔþ=èû´gdÿŽMÔL*šÒý©Ð›Ôý:úúd22�������L°���#�'��/'7'&6"/&4?!2!54635^WЛԛÒÃL*ŽMþúèû´gd°ý«ÐšÔšÒýPMŽ*MþXúúd22��ÿì°¯����% ! °þþÆþq¬ý3«gþq§üùæ¹�������dL°����+!#"&546;!3#53L–ýD–úôdÈddèü®�þpèþÔ,ÈÈ�����Eݰ���/��'&"!#"&546;!3#53"/&4?6262LþÕ_ •þÈ–úôdÈdd°jþ\ÊjO)è•þÕ_ “þpèþÔ,ÈÈýÎjþ[ËjO)����
°���>��'.!#"&546;!3#53"/"/&4?'&4?62762Lg†%þöþ·–úôdÈddöFƒƒF)ƒƒ)FƒƒF)ƒƒ)èþóg†þöþpèþÔ,ÈÈýŒF)ƒƒ)FƒƒF)ƒƒ)Fƒƒ�����—°���/��!"!#"&546;!3#533232"/&6;546Lþ¢þ–úôdÈdd–d–æ*æ–èþÔ–þpèþÔ,ÈÈý¨úææú��������—°���/��'&"!#"&546;!3#53++"&=#"&?62L¥*þùþn–úôdÈddëæ–d–æ*èþp¥þ÷þpèþÔ,ÈÈý…åúúå����ȰL� ����!2!546#!"&5!52LûP“û´d�L––þÔýÚ&þÔÈÈ����}—����-�1�;��&=!5!546#"&=46;#5376!!/&4#5;2+§øøþp�ý/22Èddþ‚÷�þp÷�ddd33�æ*æ–È–þ…dÈÈýËæ–È–æ*yÈd�����d��°°��Q��%6+"&5.546%2+"&5.54>323<>3234>^%È"%þá
- È"
-
d d 1tû®�5gD‘
þ>?1)þA¿..@Â
þ¢^
þ¢^
��d��°L�3��"!5265!3!52>54&/5!"!4°"2þpKþKþp"2�KôKL8
- üˆ88
%Šþv%
88
- x88
%þvŠ%
8�������LL��� �$�(�4��!2#5'!7!!2#!"&546!55%!5#!!'!73£wiþÙÈþpdwþ%,);;)þÔ);;),¼þp�ü,¼þ‰dþ‰d�Èiè–bbÈdÈ;)þ);;)ô);dÈÈþ÷…£…ÆÈÈføddÈ���ŸŸ�&��767>".'.7¢.‹wfü�w3À£
.1LOefx;JwF2ï¢Â1vŽüevˆ/¢ 5Cc;J™|sU@�������°L�#�A���2/.=& &=>2#!"&=46754>ü¸¦ud?, Ê�þÂ�Ê
1;ftÊpR&mû´m&L!(("
- È""’’""È
'$+ þä
- 2þÑ2ÔÔ2/2
!������°°�
��'��!'3353353!2+!7#"&46!2!546LÈý¨ÈÈÈÈÈÈü®¼‰üJ‰³LûP¼ÈÈôÈÈÈÈüà*dd*þÔ22����d��°L� ����#"!4&#"!4&!46;2¼d);,;gd);,;ýþÔ;)d);L;)üè);þÔ;)ýD¼);üà�);;)����ÿœ��°L����%�)��!2#!"&546!#3!535#!#33ȼ|°°|ýD|°°„þÈÈþÔÈÈ,�dÈÈddL°|þ|°°|ô|°ÈýD¼ÈdþÔdd,dþÔdôdþÔ,���ÿœ��°L����%�)��!2#!"&546!#5##3353#33ȼ|°°|ýD|°°„þdddddd�dÈÈddL°|þ|°°|ô|°ÈýD¼ý¨ÈÈôÈÈdþÔdôdþÔ,�ÿœ��°L����#��!2#!"&546!#3!!#3!!ȼ|°°|ýD|°°„þÈÈþÔ,�ÈÈþÔ,L°|þ|°°|ô|°ÈýD¼ÈþÔdôdþÔdô���ÿœ��°L������!2#!"&546!-
ȼ|°°|ýD|°°„þþÔ,�þÔL°|þ|°°|ô|°ÈýD¼þ––––,���ÿœ��°L���� �)��!2#!"&546!!!#";32654&#ȼ|°°|ýD|°°„dýD¼d‚&96)‚þ‚)69&L°|þ|°°|ô|°ÈýD¼ý¨ôdVAAT,þÔTAAV���ÿœ��°L����%�)��!2#!"&546!#3!535#!##53#53ȼ|°°|ýD|°°„þÈÈþÔÈÈ,�ddÈÈddL°|þ|°°|ô|°ÈýD¼ÈdþÔdd,þ�dþd�ÿœ��°L�����#�'��!2#!"&546!3!3##5335#53ȼ|°°|ýD|°°„ýDÈþÔdXddÈý¨d,ddL°|þ|°°|ô|°ÈýD¼Èþpôþ�dÈÈÈþÔd�ÿœ��°L����"�&��!2#!"&546!#575#5!##53#53ȼ|°°|ýD|°°„þÇdÇÈ,�ddÈÇddL°|þ|°°|ô|°ÈýD¼þpÈ2È–dþ�dþd���� � §§���%���2".4>"2>4&!!!'57!àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqqlþÔ,þÔdd,§^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐÈddÈd����� � §§���'�+���2".4>"2>4&#'##!35àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqql2ddd–d,Èȧ^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐd2d2dd�ddd��ÿòÿ�ÂA� �6��2632+54&#!"#"&5467&54>3232"/&6;46÷nµ,,.xªªx€þÔÞPpVAbªz–
- ‰
-
ß
&
ß
- ‰AwañúúsOEkdªbý³
- þíôô
- ����ÿòÿœÃA��3��2632&"#"&5467&54>++"&5#"&76762ön¶,+.yªxZþ†
%
þƒ OqVAb©æß
- ‰
- –
- ‰
-
ÇAwaxc¤hþ“sOEkd©cý’äþí
- Ì����d��Lm���%5!33 33!#"!54&#¼�þòªþòªþÔþÔªþòªþò�2�dd,,Mþ³þÔþÔd22�����y��7›�/��2#"'2!54635#"&547.546324&546X^“Y{;2 iJ7-þÔ-7Ji/9iJ£›qYƒZ=gJiû22ûiJX5Jit£����'�‰œ��*�B�J�b�{��"&'&7>2"3276767>/&'&"327>7>/&'&&"267"327>76&/&"327>76&/&òoOOoSÙÜÙSoOOoSÙÜÙþ=y±"
$GF`
Pu
"Q9 ùcŒccŒcVQ: Pu
"�GF`
y±"
$òoþÕþÕoSWWSo++oSWW"±y `FG#
‘uP
:Q#úccŒcc:Q#uP
$`FG#
"±y ����d��è°�����"��!#5!!463!#53'353!"&5+¼,´þ¬þ„
- ?,Èd¢ÔÔ¢d´þu
- „
- Ã þ„ÈÈó
- þÔÈüàÔÔÈþ
- ‹ÈÃ
- �����d��è°� ����!��! 463!#5##5#7!"&=)+5¼,þ¢ýÚ
- ?,È>¢d¢Ôªþ�
- |
- › ýø^ýÚG
- þÔÈü|ÈÈÔþd
- 77
- P��������°ô�����#3!#732!!34>3!!Š¢ddþÔ¢ÔýÈ!,ý¨Èd!sððüà,ô Èd,ÔÔ+$dþ¢Â$+þpþpô�������LL��2�9��3232#!"&=46;54652#!"'74633!265#535Šd2þÔ2s);;)ý¨öþº;)X>,>Xý´ÔÈÈL2dd2ú–;)üà);öFD);–>XXýæÔ¢d¢��d��¼L��6�=��3232#!"&=46;54652#3#!"&54633!265#535Âd2þÔ2s);ÈÈ!ý¨);;)X>,>XœÔÈÈL2dd2ú–;)þþÔ$+;) );–>XXýæÔ¢d¢���ÿ¢��Ô����� #!"&762#";2676&35’} ,û, }@DÐ:#6#:àÈû°&77&P'þLþÒ.þdd���� ����LL���/�?�O�_�o�����32+"&=4632+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=46©ú
- ú
- ú
- ú
- šú
- ú
- üêú
- ú
- šú
- ú
- šú
- ú
- üêú
- ú
- šú
- ú
- šú
- ú
- L
- –
- –
- þÔ
- –
- –
- –
- –
- þÔ
- –
- –
- –
- –
- –
- –
- þÔ
- –
- –
- –
- –
- –
- –
- �������°��)�3��3#!2!&/&63!5#5353!2+!7#"&46!2!546¼dd^>1B)(üü()B1>^ddÈþ>¼‰üJŠ
³LûP°ÈdO7„S33S„7OdÈdü|*dd*þÔ22������°���+�5���2#4!!2!'&63!&54!2+!%5#"&46!2!5460P9Â<:H)"¯ýZ²"
- )H¯¼–üJ–³LûP;))�%&!‘‘!&þ•*ÈÈÈÈ*ý¨22�����°����$�.���2"&432!65463!2+!7#"&46!2!546
–jj–j·."+'þ¼'+#þͼ
ŠüJ‰³LûP�j–jj–þë9:LkkL:9þr*dd*þÔ22�����°���,�6��2"&5477'632!65463!2+!7#"&46!2!546X/[3oœo"�o£"."+'þ¼'+#þͼ
ŠüJ‰³LûPk‹6NooN>Q�o£þ
- 9:LkkL:9þr*dd*þÔ22�������°��"�,��!!.54>7!2+!7#"&46!2!546X,þÔ%??Mýî<=Bm�Jþ¢¼
ŠüJ‰³LûP°¡‹9fQ?HS½TT¡vKü~*dd*þÔ22��È��è��)���2!546754!2#3#3#3#!"&546/R;.6þp6.d�6\¬ÈÈÈÈÈuSþpSuu;)N\6226\N)þG6.dddddSuuS�Su���dÿÿLL��/�3��!2#!"&546!2#!"/!"&4?!"&=46!'–„ü|¶
- þåà
%
XýôW
&
àþß
- ªdDdLþôýD
- 2
- à
%
XX
%
à
- 2
- ddd��������°L��#�-�7��!2#4&+"#4&+"#546!2!46+"&=!+"&=È Sud;)ú);d;)ú);duè);ûP;ñdèdLuSÈ);;));;)ÈSuþ;)þÔ,);þ2222����©¬�
���� !&4762 !2!546ઃþýû 'Yþ¬V/þ«¢ ü|�ýUYƒY(þnþª0Uü22��������!°��/��.#!"3!26=326!546;546;33232!½'þp'½q*}¨ý20È/2‡úþ––ýŒ22,þÔ2������°°�
���"��!#!5463!#5!#!"&5463!#5„,
- þ‰þÔ
- w,Èý¨,
- ýv
- w,È ýÁ
- O,T
- þÔÈþýÁ
- ¶
- þÔÈ�ÿœ�dG�F�V��32676'&7>++"&?+"'+"&?&/.=46;67'&6;6#";26=4&äÃKŽjIC
- )V=>8'"d1*Ã)"dT,Ÿ|-oËtEú
- ú
- GAkŠI
- ! "%,=?W7|&êF@�Je5&2WO_e_
- 2
- 2
- �ÿœÿæ~� �$�4�<�R�b��%6%32!2&'&#!"&=46#";2654&'&"2647>?&/&6%?6'.'.�§. ‹ü+jCHf7ý" *:þÔ>XX¹P*† €@--@-þ˜ -?0
!3P/|)‚( )f!%
=„÷&*
xÈ"6Ô2&„CX>È>X¬83DÉ-@--@þÛ‚
- # ³=I+E( /—/}X&+ 5!H �����d��9°�Q�`�o��322#+"&=#+"&=#"&=46;#"&=46;546;23546!2>574.#!2>574.#q–
- Oh ..40:*"6-@#
- –
- d
- –
- ¯
- KK
- ¯
- –
- d×))þùk))°
- m!mJ.M-(2N-;]<*K
- KK
- K
- –
- X
- –
- K
- KK
- þÔÈ
- "þpÈ
- "����°®��)�,��!2#!"&'.546"!7.#ÔVz$�RýÄR‚(z Œ}VG+œ0œ )IU!�îzVþ`3·BBWwvXZÅ3 Vz™&--%óó,(1#þÂ��È��„����32#!"&546+"&=Û–g¬T)þ>)T¬H6–6¬gþ)TT)ôg¬üá66á���È��„����33#!"&546+"&=Û`³–T)þ>)T¬H6–6–³þB)TT)ôg¬üá66á��������� %'5754&>?' %5%ý‚þ†Nd––d/“‚\þ¢þ¢^^ÿþåª<à–Ç”•È–ú
- (Aýb¦¦“¥¥���dô° �����2"&4$2"&4$2"&4¼|XX|Xè|XX|Xè|XX|X X|XX|XX|XX|XX|XX|�������¼L������2"&42"&42"&4è|XX|XX|XX|XX|XX|XLX|XX|þÈX|XX|þÈX|XX|����d�dLL���/��!2#!"&=46!2#!"&=46!2#!"&=46}¶
- üJ
- ¶
- üJ
- ¶
- üJ
- L
- –
- –
- þp
- –
- –
- þp
- –
- –
- �������°°���/�3��!2#!"&546!"3!2654&!2#!"&546!5^ô¢¼»£þ¥¹¹Ëý¨);;)X);;ý±ôþG�°»£þ¥¹¹¥ô¥¹È;)ý¨);;)X);dþÔ,dÈÈ�����d�d°L�;��!2+32+32+32#!"&46;5#"&46;5#"&46;5#"&46–è222222ü222222L*È*È*È**È*È*È*���,�è£��
����*��.62"&%#462"&%#46"&=32ŠW??WW??þù|°|°¼°|°ýÀ|°|°¼°|°°*(£C²²BB²²þÀ°|°||°|°þÔ°|°||°|°þÓ�Ž��ÿµ�È”��B��76+2+"47&"+".543#"&'&676/!'.6éE*
'?)’¸
- T¸Ž0I'*L
- #3¶{¶,#
- nþÙ
6F82 þà*<SC#
- (#(ÁÁ(#��������°°�%�C��#4.+!52>5#"#!#4.+3#525#"#5!°2&È2þp"È&2èýD
- d
È2d
- ô„ ü®dd R ,ý
- þW
22©
- –��������L®�� �0��5"'./#!5"&?!##!"&=463!2èþßEþÔ 1;E%=
!'þì†y±üè,2 "
- ëý# 22+.°¦"A2‡Vþªýãdd�����°°��G�J��!2#!"&546#"3!26=4&#"'&?!#"3!26=4&'"'&'#Lû´FF
þÕ& 7
- ?
- 99þàÅg°û´LRý
22£™22$ìþ������°°���#�'��!5!!2#!"&546)2#!"&546!°ûP°û‚�þpm�þpG,LdÈü|„þp�dþÔ,�����°°���#�'��!2#!"&546!2#!"&546!!5!2�þpm�þpG,ÈûP°°ü|„þþp�dþÔ,ý¨d�������d°è�'�+��!235463!23##!"&=##!"&546!2�d�ddþpdþpŸ,èþ¢––d––þ¢ þÔþÔ,������°°����'��3#3!2#!"&546!!2#!"&546ddd–�þpG,þ¢„ü|°dþp�dþÔ,þþp������d��L°�'�+��32+!2#!"&5463!5#"&546;53!X––Âü|^––dÈ,Lþpdþp�d�dÈþÔ,�������°°����'��!#3!2#!"&546!!2#!"&546°ddýv�þpG,ü®„ü|°dþp�dþÔ,þþp���,�0o€��� #"&54632aþî5þèþ*����A�2„~��� 6'&4Oî**þ{î)ü)î*�����2A~„���!2"'&6dè)þ*þ„*þî*�����2,~o��� #!"&762{î)ü)î*aþ**î�������°(��
- ��5-5!5!¼ýL�þc¨üà å¶þ½ÝÁÁÝûØÈ�������d°°��1��#3!35#5!34>;!5".5323!°ÈÈþÔÈÈ,ûP2&d2�"d&2üà„dd,ddþ ýÚdd & ,������Lè�%�1��#4.+!52>5#"#!#3!35#5! 2&d2þp"d&2 ,ÈÈþÔÈÈ,¼ ýÚdd & ,üàdd,dd���È�frJ���32 +"'&476½
- þ0Ð
-
- þ)×
- Jþ0þ0 ×× ��>�fèJ���32+"&7 &6S
- ×þ)
-
- Ðþ0
- J þ)þ) ÐÐ���f�ÈJr����"'&=46 4 þ)þ) ÐÐw
-
- þ)×
-
- þ0Ð����f>Jè��� ' &=4762j× þ0þ0 ×áþ)
-
- Ðþ0
-
- ×����Ùÿù=°��:��#463267>"&#""'./.>'&6è°|°þVd&O"(P3G*+*3M,
:IG79_7&%*>7F1“
°|°|°ÈÂ5KmCKG\JBktl$#?hI7 À�����È�„°����!2+&5#"&546!5úX–ÿ–«,°þpþ² Š�ddd����È�L°����!2%!#4675úî'=ýDXýDd
d°Q,ü[u¶}ü4ý]dd����MoÃ__<õ�°����Ðvs—����Ðvs—ÿQÿœÜ�������������ÿ…��ÿQþÔÜ����������������£¸�(�������°��°�d°��°��°�pŠ����Š����±��E���Ø���Ø���¢�����H����E��°�d°�{°�Ȱ�Èô��°ÿò°��°��°ÿð°��°�°� °�d°ÿÓ°ÿÓ°��°��°��°��°��°�&°�n°�°�°�°�d°�°�d°�°�d°�°ÿœ°�d°�°�°��°�°�°�°�d°��°�d°��°��°��°��°��°��°��°��°�d°�Ȱ��°��°�5°�d°�Ȱÿµ°�!°��°��°��°��°��°ÿœ°��°��°��°�Û°�°�u°��°��°��°�
- °�Ȱ��°��°�Ȱ�Ȱ�Ȱ��°ÿþ°,°�d°�ˆ°;°�°�°�°�°�°�°��°�°�°�°�°��°�·°�·°��°��°�I°�°��°��°�]°ÿܰÿܰÿŸ°�d°��°��°��°�d°ÿÿ°��°ÿQ°�°��°��°E°�°��°ÿœ°�J°�°��°��°��°ÿœ°�a°ÿý°�°�°�°�°�°��Ä��°�d������ÿØ�d�9�È��'�d������������������Ù������������������������������d�d��������dÿœÿœÿœÿœÿœÿœÿœÿœ� � ÿòÿò�d�y�'�d�d�����dÿ¢�������������È�d�������ÿœÿœ�d��È�È���d��d���d,ÿµ���������������d��,A�2�2������È>�f�f�Ù�È�È���*�*�*�*�²�è�èNNNNNNNNNNNNNN¤"~†¬äFnŒÄ2b¢Ü\ºrô bÊb¾ 6 „ ¶ Þ
- (
- L
- ”
- â0ŠÊX
*
^
°h´(¦æT�ª*v¶
- 8|ÀtÐ*Ô<¨Ì6`°þR¦.j–°àþ(h”ÄÚî6h¸ö^´2”âDl”¼æ.vÀbÒ F ¾!2!v!¸"@"–"¸##"#8#z#Â#à$$0$^$–$â%4%`%¼&&~&æ'P'¼'ø(4(p(¬) )Ì*&*J*„+
- +z,,h,º,ì--ˆ-ô.(.f.¢.Ø//F/~/²/ø0>0„0Ò11`1®1è2$2^2š2Þ3"3>3h3¶44`4¨4Ò5,5ž5è6>6|6Ü77N7’7Ô88B8†8È9
- 9J9ˆ9Ì::l:š:Þ; ;Ü<<P<¢<ø=2=ì>:>Œ>Ô?(?n?ª?ú@H@€@ÆAA~BB¨BîCCBCvC CÊDD`D®DöEZE¶FFtF´FöG6GvG¶GöHH2HNHjH†HÌII8I^I„IªJJ.JR����§�������������@�.��������Æ����������� ���j��� ��(�|�� ���¤�� ��L�²�� ��8�þ�� ��x6�� ��6®�� ��ä�� � �ú�� ��$�� ��$4�� ��$X�� �È�|�� �É�0’�� Ù�Âwww.glyphicons.com�C�o�p�y�r�i�g�h�t� �©� �2�0�1�4� �b�y� �J�a�n� �K�o�v�a�r�i�k�.� �A�l�l� �r�i�g�h�t�s� �r�e�s�e�r�v�e�d�.�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s�R�e�g�u�l�a�r�1�.�0�0�9�;�U�K�W�N�;�G�L�Y�P�H�I�C�O�N�S�H�a�l�f�l�i�n�g�s�-�R�e�g�u�l�a�r�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s� �R�e�g�u�l�a�r�V�e�r�s�i�o�n� �1�.�0�0�9�;�P�S� �0�0�1�.�0�0�9�;�h�o�t�c�o�n�v� �1�.�0�.�7�0�;�m�a�k�e�o�t�f�.�l�i�b�2�.�5�.�5�8�3�2�9�G�L�Y�P�H�I�C�O�N�S�H�a�l�f�l�i�n�g�s�-�R�e�g�u�l�a�r�J�a�n� �K�o�v�a�r�i�k�J�a�n� �K�o�v�a�r�i�k�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�W�e�b�f�o�n�t� �1�.�0�W�e�d� �O�c�t� �2�9� �0�6�:�3�6�:�0�7� �2�0�1�4�F�o�n�t� �S�q�u�i�r�r�e�l���������ÿµ�2������������������������
��–
-
�ï !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ�
-
glyph1glyph2uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni20BDuni231Buni25FCuni2601uni26FAuni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200uniE201uniE202uniE203uniE204uniE205uniE206uniE209uniE210uniE211uniE212uniE213uniE214uniE215uniE216uniE218uniE219uniE221uniE223uniE224uniE225uniE226uniE227uniE230uniE231uniE232uniE233uniE234uniE235uniE236uniE237uniE238uniE239uniE240uniE241uniE242uniE243uniE244uniE245uniE246uniE247uniE248uniE249uniE250uniE251uniE252uniE253uniE254uniE255uniE256uniE257uniE258uniE259uniE260uniF8FFu1F511u1F6AA����TPÃ��wOF2�����Fl�����±\��F �M��������������������?FFTM `�Œr
- ‚©$�åe6$†t„0� ‡"•Q?webfeŒ5ì˜�€ó@ Â?þ¾
- Úöˆ ¬töÿŸ” †ŒÁ“ÇØÜ,3+2q
ËF®YOì&>±é±bÒm¤5�ZŽæH$±ªYŠœ½{ìH jd†Õ‰ü²%÷¹Ù§y"§÷ö×+�@¹Œ]½«eŸû{úÒûv� Nc‹)»nù“É?~?è�¤hò�ÿž_ç&iÆÊÈÑ�Á¤‹?º>üå^K ûv´-cÛ�1íô€‰2K áy·õ,'nä«à�(ð3EwiàB‚ &©ÿéÎT´lhØ0MÒØÚÒ†dåYØrñﲬ³ntiÞ]Ýyur•´¼®û™îVXsj¡¢žågMnªÓ™H�W•©ÃÔ r2ô>iT`V7¸ÍR(±¨ÉÏàÿ+ o6ó'cÅÈB°�æë4ç·Öι݇ƒ‹ã¿š®T ]a[Qd<3wq8,Ž…îrTI¡8áŽ0>E¸?ù*E¨ç—¦•#Ïú7'�ìÝý†S ocûÊ·í_‹7&#*Ñ+)½³ Ð+4a°A6¶cŒçy±Ù£†f(bFéæäÿé´$;{ YAÃ1vP-tGøÿŒáÀ±Í"û°•ÛCÂf- W‚÷®šÔ™ÎuKÖ°Kã#íä¬Ö*K†<Ûü (ÑßëÔ÷×ÿZþ`Ù«åµ[—%êYTЬ{%¯ÉŠ$ˆ s{oïíœòˆƒÕ»ïvt"pàœ4`Èêß©ŠÏ¤}o`ã³Ýú'neÜ>
- äG5s�zó_Nó
- ’PKÓ¦vmUÞɾ{z½ÜòîóÿŸøøŒ‡"3`l
’–W#Ô�½^@+�,c¹Éko©�AOpnuµ§Ôzó–zJ)õÜÎ¥÷˜Û1Ç}ááÿO=Þ¶€x¾RÆÄ`ÁJ‰`§qƒ¥‚Us/¿+økÒvÇ1xlÝßçjl–Elì\nDŒÈÃÆ¶¯V†±æÿÐjg›{Zdå‰z7�5ÿß!xmÂ5oÂ[½¿uïû&·¯1Ú‚HBkAâìqrêÎR�Ä
£·°�(\ghôÈ7‰ìÒŠy�=†HµZóUPhéÐ$8RgÓÄ€zÂgÍÉN:‹à�1u¬$Ü…¯¤¡ž>Rý]åú—¦¬"Ÿôf7¼—õK¯^'˜ªë½3“+E/¼Ä^‰YU5]¨NB.ÞÊ‹¥Ò8ßÅ+ÎÍ�8�ù,|‰{M|ŒAŠåua|Ðaˆ’ìŽÕÞË…Õ�%�
- lKG¢Pí,NuæÜÔkþcï8mX@ÚÓdÿ̘?ñüÚó¢çYÓ&Ïþ{êö”ø³ÇÏ?ÛPÜ(®GŠ]¶¿ÏÆä¯äOä�ä·ä×ä—är-¹’\LFÉ9—,&§“yä8r¬û´û3÷ÜŸ¸?p¿ï>ê~Ûýºûsèäÿ‹žÐ¢ÓDǤzó1ú¡?\U5q=ÙtÑzÔ’†&Z�nj¢%émM´"}¼‰ÖtkÞDºwh¢-=ÿm¢½Bíéõ76ñô®ƒ&:Ò»Éqt"Ö1:“¬ëЕ¬©u;ô"K_¡/JdÖc0–l²õ0²Å'^B¶ù8VC¶Õzg°²½¬[ ;Êúdì
- ÙYÖbȃu‡¼©u;œ@ž*}y‰|.©¬'C>\g=ò9àVëÅ�¯·[o†|gð õ^�ž¶>Šüd¼
- 9ÏÇûäîØÅø”
- *E|A¥�ã*M[ã[*mOÜßQéz?PénÝ?R)Y�ÁoT&[ÏU*‹•5ÀSÙMBþì¡¥ð[³
- „ßoYDhÕ{ìÑ,}1<f�&6h¤†'��Ê¥U#V¨Þ¼¡¥EûD"TÁ¥Þ©Ð¢AD9ƒÿeB¹:©Ä%OœÁ ÒÐñ‚‡ØFuŠn 7?%RG4"„¸f©gÇÁFêº� a=‚‘-³ÕQ—á½y+B½,ÄøÐ2ÃËÖ…5¢•‡ð™„Œxn¡Îªf*!¡³æëlâ|GXQø ÞƒUp”ä
- ÅEu Â@ž�¦å-ð€Do.6YZö‚-&a>f?›�«“N�Nœ¢ ]ÔO/^;\ÚÂJÊ
ÏBÇEsJrª� ÄšõÆ'ò…g/ããÑB%Ÿ¡o Cõêºn•7‹Ü:|õyƒKt²&÷$§Øs¯|¹õwPˆùÄ\i]¾$Z@+Ͷ¶Õ€90x]»r¸%¾ÈÕ+öRU¬Em‡+ܰª£;w u¬À9/I¼Ô7È7Õ¦¹Qþlu\¦yÐW‹N)ë8‰Ü°vYî*u´m”¡±¿éâ©âºm( fÊE½òÿG8²¢j#I¬½RŽÌùz#q¸ß·ß „)Y ×$‹áЛ†c_%¿m-{!0-`;áå…¬ñhyVõäÁ]Hv! Ïta½\KïÅ¥[Ì1{"çj 6@ì–3T0%¥¿éΘ"ÇÔ™ÆZI†Gä›S“÷�‚.³ÄΣp�ÆÓ¬SÆ1eéûÙ“ÄØ›�ùYÁÿv»8d±\±B¡l¡SûþR)ÒÓ†çù¯–®€{IŠÓ†ôÒ%�”¯>û0ÐŽÚ¦³\ð'”cg½2%4 QŽD¡
- 0Í’3B²"ÉMŽÕŽ&€ÛŠhIÇÂÚ§ÒRg·ME¤¡©¡¶š
I½Î(©ÞÕ5U–D]}ò™bí8$—‡ì8¨>óáX ²h•"lµÎ€âj�.%ˆÛ€HHÇ-Iš¦Ý¸#1’C4õÞYÞ7„íî®íYÝ–¡Vo>PÊ]¡6¿·˜ö™O4ÿ7f
½~�AJdYFÕ€Ê.–ÞoõÃþy) Æ8lƶ22ŽeŠœ¦Ò1H¡[t‰°@!È…2\€@¸5ÄÙ“Ê%Z×îüÛkÞ’aõ�®Ü@ú.`n¨3ÊOFŒ¢R(ó…¥¶÷ÿ½ZkLkF íHWjY
I¤ê5×ç*ñ6ÚÎeµSbk.¤¼5F,ì.•N0ßÔ™’¹€|”†V¦€||~Nô‡( 4·�ìÚ],ìJp|~ùxeÓÉA¨Ô¡¯5ˆˆ/»Ú»S¤ýäô”Ðvò×Üy?›ù²'_v|rê„ËXÜøîHéQʰµÄ“B@=ÝX¬ßú¬B9Ë4³˜«ÃT©ØB‰B©c Á«H‘P£Î+‚ò‰�_““ÕYHÙ#¬$ªËÊ` ìFø£ñB;ãµÂ+Û”…BPR°4̼ t:tõ"ZEºJ^!XÂÇ“à¬q4_dTW(5äÜ€§åÿä¸ÚI±”UŇÒAÍzþ@U6ÿn.WGXýÀÁèHìRKÀÛ&'swM±jŠÊŽ˜‹±<Ÿ”±˜3¦)€–�`#F@F Ô¢àþØv�oÍb$xï+²à¼uû&´}‰|ÊX&[Ùª�8F‹-¹E&/>Š/ÑGÅ.aêz^ŠÞ/ƒÔþ})œ²’ó'“x©‘$O=<ÇÂz™¤oä§áA9MØ�&ò~î¡™¹3rµ3gŸœ¦'¿8Ò£\°-¶MDzÈè˜økºÍ5†ù±´A
- ÝÂýªG9©ä|1-Ø! Ç87û[œô¤,mRîu|¦57®
- =Xþ‘¤,˜aJ§Ù›¸^t´N›4ÓØ\fЄ]AzH^7·ªF•èþ•™„&k"LU>}ì>çrBåX(Û‚ªë‚Tš%¿«Jª¿„dhKÄ”ó¶P“²KÁTFaA‡3HH†C[r;a›À¶d·™‡•54È̉—lL„kjG{¡ì8Ÿh~ä�
fR@Ðìü9wàB¨¤àÐ0ëzSõô°âÿ'— a7‚@Ý@N›±ŠÝƹl‘bj3hNî²Xö‹F/Éíe¢s£Ù'úŠDsQ«ñ<þk^Óíò×¼²ýˆZASO¨idºSJãxN4D½³ÀKÓ!´¹Ôù !Ù«v‰¬hA`ÛE–·X�•�¼Ê-
¢P
íÄ:Ÿ‚ÛѤCê:ÂÂWÍzS½sÄdO:¶_¿«ÔË`Š:tÁaηБ¥†²Íسú¢�®
¼IYð4Ç# �ø*ÒÍ+<êq�n°oÔ�¸u
- UÌcww�óx$dµ³ðÆ¿�}Ï�ûÖÁ94Ìýšíü9p¬*T:ú%GQæ…^aŸ‹‡äÝË'¨çeƒôbö¨Šl-ÕÜ*XÝLç%*ź¸.…ÚŠÈ\Š@pR$Tå*KÖͽ¸hp‡ÀˆÈèÁ‚ßã¦múÁ‘â-/“oSÚ3ŽßÂE�àÏÎto¸ž}çжV‡oõeJ`<™$öÙtíØ½ßü ª]g*ßZ›„µ6q°Àùl’ø~÷E¯«
- †Sú¸/Š’ùi£ÄTÆtÍk‚Ç®à²WÝþÜ=?j¹�G¢ÒÌÔUUAJÆõý›`†ÒbÔË‘—ƒGˆõQÍAÏ«©�ñÃ–ÎÆÚìcƒûê½WËï©èWSmÝÀg³ºÚFËñª‘&©^õúؘԡˆ6;C1:=ÛˆP‰äºÕ`ÊÚœ�VVÿ“ÔE�Æ5"´hO«Xà~«ÞØN3_5Ó�]ºz-þä’CWÓÝtÔ¥�‚Óˆ´ÐËeÜ]°\¶”©¿V¯–‹ÿcÔ#m[ÆkuÞ—_ʱ"©Éös�H³ô<}xï±…m0båxHÓqb‘a3tfçMTÛÑÏ*]I»
- Þ}×(ú¾œ,M”„�–=Š Ý@ŒJAÛÆÐd‰� ¬Ë?§6PV±ö[
dVãvôæ4jžÒß›‘lH\â÷ÔŒÅè{˜ØòMôå½È˜\º��åYþÜ�€�`9MÃ`Db‡<Á;a#zò†‘<Šx"ó,¨d‚gCi¿`‘c’›:ÁÈâI´â>jw·Ì}JÈÉz§�^:V.ý:×þÚ‹{¿Í¼(ȲB÷æËɦ’ÉóxŽ<Db#"S£¡{ô’PùHu½N�/ë{r6;wU¶æÐòsÖPО“<¤çXÀàYâsÔÄ÷ÞMxu°‡\šb�‘Ús¸$Ž˜xŽÊ(¢‰/^|^*0j~mà¬;#·%J„ÞM4�Çp˜QM׬ð::b\C2gf°°]½zÒP8T™ Uª“QbÖètºƒC½TŸ>
- p 8+6g_2–lΡ6§Hò ÚÎ�džH�:÷
d›<æCÍé6³¯Ø¤ê/«¿6ãE:ÂK‹”"Ë`kJ©<›ÏÆ¢ä=ùvž7„¥âN5·µ`°ò›¶Jt‹Ù\j¹6Í…%Ëž7ô*¥'¥•U•Ù4±:âX+
ä\b�ü’E
- äìôÞaf®ŠxŒ“}Á‰1+p™‹B¥Ë0î6òâ”åýž3rõA$Nš~¶ô#³dª}ÇפŸP7h÷H7b£FªžÂ§…‚¬8ð
³P>øBtGNÐŽ¢ðmä‚xô@�j …‘¸|{Às9à»=þwRÙ/«oDJs5z>“;Š'xÝñEÐq^ré^=G?½…9Aê¡æ–ÇAä_—£íK%µDÉ®:uikjkîIeÉæ½¬GúÕ�#*¡†)µjm‘á|½t£¹}`Jæ©Z؈éÖ÷H=4î�{gß�¢¾)¡qXˆMA,šHøŒ7û1‰ëV"¥Ùo,çY#hýü÷ݨSò_ê;‹Ía_Ô—Z^cn4¢� ‚H¸E«®?‰«°}Ñ
- È�¡»Üî¼Ù¤=}BžWvÞªUeðåhšƒÚ�GŠ“F�…‰‘æ;�@2S¥Øœ€@Ëf þÂËünÍâ2Ð#�Žæ¹ñfÝY:]¿JyåH]•-·˜G׌wgv'¡â|ˆÄ0eñ
- Ã_7ˆðÒ�«n+fßÙ¸âàY<«ç(Í
- ª?öì’©‘yòù¡%wm¬+jƒ&&!è¢c“^¡u'�bü&ñhŸm6¤šÎû¹*2?´AÇI«¶Æ²5FW¾Ø™[âÆœ¨BõUzïIÎE”“!’m:‹ÒûœxhÔe—ÝÇ®n¼z|]%��mÙrÁU¸F�Ú¯�”ù®1Ɖ};!n F¾& gòÚñÿP‰†Ý¯¯;&×ö©œøï$$¸éF«).t›BíQ¨3¦Ž½(žC=ú·Óä¦XÀÎØesÔ;Ýiû«¶ÙŠ@¼Ñ~üNíÉΡEë ÔSR‹¡ˆh�\éè£úÁBeñoº†½œ ´¹ÎbTÑ„nÎ’ju¹¾À g@ä÷'qQ딎nx.u6bVU&Ô›]¹;Ûïª!C_„ž�5Æ*Þz¹Éºûm€RQu‘ªq‚’঱PüÚZ0ƒ¶}mñ¼¡ÌÊõn½¦^nÕOrÉT¦âÁ‘µÎ:ŸUã'×hÀæ§0nZ¡p^Ré|DFª_b\ò@–Öm�‚èDEë8��Æ{oèGM‰á œq¸ÝÏ}ÜîSd ®C,ûiÀÜšEêŠé/°ÞË[d8]Ž×,MCIšÎÐó_u—,]V™�cñ"—ä¤p°g@ì`"y)‹,;B³^ežlÚ¡ª2'€.(�ÍÐĘây>à-|ÎhÜÓÄwšúþê;©jå¥è’íÕ�ÑÒiÔ½±ä¯ê_o|!@ö)ɢݪÄ=ÙÌŒSPz�—éˆ*!z})¼|ƧT}½j‘†E£tC¬Zå¡nŒ�½Ã½œ*ÕžõÉ4ۆ׽[¹©±¾9»Ð®¨Žèˆ‘’Ý“õŒz`Wmeôo‚‹|j8jï5á�9¼öµ@.úšE¿VÌ/ÌZW@|—�f_ç\"${ᜑv¡àòƒóœÀÈ/¸ò¶;a×:Se¦i3TäGË*ëÎýƒ]¸Æ¡/ÌhÀ2C32$¿Óô¿ü1}¿ŒD¤ÍNXÉøþtì?FÏ�í~n,Pj9.î–>×£ü¨Í{
- 9ýÉEN-v|3h†ò‘CÅиE”•‡ XTàâË;P–$Ã=�JÖ-ÝÕgÝ•ýùigz~q—(Aé<:h1±9³3áNì̽õQ‰‹ãÇ}CLØ�Wùß§Â׎Ü~ƒá
Úb™¥"†�‡Í|Ç4u}îð×Ùc™y€à‹È6°¡2ÿ[ ¥ØÖ\d¸,µÒŽÕ³b�kù¤ÌDåä¾%0TÜx®{=;öÔ·‹†(„i‡�ØLS·øß1½˜øý©Ñ3ÿNÏh/¤6?æ'E^ö~ÿÆÔP®{sZì™ZÓK”ÄžB{’DÌtø&‰½Ôz’Ó÷)µUoaù5Q¦3�‘È—ˆr~¿Ž‘¾
- ¦ôÙùF] $º<èútm(š}ûÃÏMB@‡ž[œGxìÎFÓh8�›#}ˆô,£#À˜uýLaz(ÞQh±4%Óxm`Uà•Õ¹.E¨ãv1a’ž4_'/[¨d±{Fx¨IÊ59žŒƒDõ<êì&�8VˆEóFgÉÈÙ芘#õI‘äŸ�2S²Íîÿ_ã©]QqAšnˆÑ_ðQç>bÞ˜4g¡¨±-®0&E#c¦Üi8¿ vR/Õ4ÿržŠëšP7•£KsOWµN3Õ�vE\bq†ûQß5�Z¹Ú½Vy5]�½Ööàh/ i)Åû�¦Ž-/´°ã¡kµN¬Ñ޾ÈÄ#eì)"Píñü {ýKSQ�x‰²¸�¦>aã&µí¶Ž<a,릌HEHÏòó‰
]”%,eDž³U~W»lý�Ú›«;c¾á˜“÷`þ�? ¡¾p‘M
²lëê.‚P²W7õ¡Ù£È./ôWœ#;Wõd*–:z;E2†¨Ÿîöãúj¡ø9yÉÜAÇS�S8èuÀŒ¶à¬;fY8»m KѯèìÔ„Ô¶‰Í¡>,„
_èg¥´ñ-mác<×n]Ч-®5‘2c¨¹¡®ñz
¬7d Pœzóåµàòð²V„ö“û¥OPvf¼RþR¤ÓÆà°“9†Z
-ŸÁÞd†÷®šˆ¿C›šñóÇ`,öatÁ=‡k?v¢í4#P
è¤BÌ¡šØ¥¸/[õs.<a0eÆ{�´&Ž¢vþò¡a~eÐó8‹è)fä±Ûny’êfäBPLùuñ³Iy²H=Sø2öÑ”Ò"[ÃÈ(Ù¼O@íz*I¸º@Åö0—äª#˜ãÜà,Ð�ôÅI$Q¡Ïy
côÑžF
ëa�ßžv"²ï|RÇܘ 'WœF x?þ+aNƒMö®�KÎ`ÆDÞ/è·nf:X¸I8:H ±IRm]›Kôº6i ü@UÏH*NíÐoF¬àý;–±©›á‡�"W�q£¾d\“‰‘Ð�*C=#ã2Ï6x”7ì<TÏÕ
- 7yˆÔrU>-bH)ɺzï '}¶×¶Ýîwœ!rÁXÎZе ´.:’Vn×;î-î>Š:á
- 6àrÿ½‡UÁcsÕ4k¬VW¬{’ú‰ð#˜5ß‘0ÁBÝãìÇ`Ü�ÿ0ušÑ".QÊÆ¬›dB´˜0£”õ˜CžÐrõ]íïà#íºQ9lqœàN^ôÖ³�¯éôh~ NU\´ ¼16š
- ~éè“á”S‘n‡Tòl¢‘\þTHÒ²Ú›-ÙÉ~ªG~)$…oQ7-ë¯Cï°ÌÈì}q%/a™¦³vO°ª|[q4–‚Š’³~Bc-$NÜ7<V…HE€i-™œèRÈF“GNMà{Ð"3•�û49‡[„j< �ḬWÓÊãhÕø˜¿l‘nÛà üÈØQÒ¨Ú‰Gcq¨ï@w¯/e qÿ£ÌægήÈ<ˆ£ÍÆ: êáaé’·¢‘u¯êÍñ”•_P‹`Ýùb{Eëá¦I(ÏÙOWGÝæ«fEyÀÜéABa_žß;O^ŽDQ£â'èµsóåçîÐìó`Dî#Ñši¯:Ñ´Û+ßY{©{Òpå&¶Å\ßRažšÀÁ—gþÏž0ÿÁgúïTùLÎi<'Ÿ7ö¦?ÀÒçX1¹ÀÏCïÖ
- a¥¿éîn0o¹r1Ñ™/U¥‰�õÎo�/?é•♯aùÓ_¬pê�HÖ±
Gõì´ ¦Â8ŸÝ£?3F‰0ð˜€Ù`%Ã÷Ï‘ÄÓ<�
- Gš]Ô½œ8blÍ�%-,Â)}%žJ”:¹YÒjÐTÍ;Ыȶ5Å’>ž6½Ÿ�wÒ{œV餃.&£ö(†o¹©*õn<§Øn9¡ÁJ–
- "a‡©Ð”ÍÝ+¡†aÊ/»ýººð;7zDØZη{×t�M Mp—£ iØšk¼NPwˆØ‘ͺðH`T
ö$23–†fÓöÀÐÚ0šzÆÈ;¡¦žç"ð]Œòª‚*ŽY²¤é,äQ¡W�Øàô¸lS鵯ÅOŽrW$5]K¡VÙ»Bâ…Üš…I¸ŠkÚ|ß=²&Á[ÔèêÞÑÞÅ58EÓR¤0Þ‹Gk«sSîñÁnãònnuãúñExK�Ðrô¢¬Œ}‡~mñÙ`ŽG4u{ÐÑñ=]6f¤�÷âר
- BoÖ&<
™Ã±c;2 ®P$Ãǃ{mW_cžõª'B6Њ?$½^z[�C—Y¹Ý™é¥jÐNó~þ¦Û®0¾»›út¢¯ú°Ûâ„6/)-‰1:p$Dꥅȗ
- ®
- ,'³†üyàõ±øÁv˜Ä …nœ‹F³T×Ñ�™['a¦MbÎJ]»%�&î¬lc6&ÂèIpFå�Ä
¨ÜoðŒiƒªÄÉþã5± ø'r¨äËår‘(q¼ïè�ú®ëî¾z6Á°öžîÉ(5óÐáEôàÉ¢ÕŸl\…Lñ�kº7«°1ÅY4^)bٗ¦8ù¼yøÆ�ªäÛ
- NžØ=ƒ›9zT–^[T$‡dkœ
QâiK%áˆ6޵�üqµéçõÌîfO|àÚàcÐ8$•ji^vrþ.QQR"âYárÄŠãâõ¸
¨Ãkø’¥ÞrŸº¼Kˆ¢µ<QI‰"·@´ïêR9
öÀ/½«\&7Y}m‰gÒŠ7»œz6¸-Mùu=‚Àé,õþN3O\º6ŒÃaDAŽ»Þ®ðLd^rëÉ/.®>û æè
- N·eíÏRiû4¦¾Õ!3Rù¢º�"�4¦ˆÈñúšn™bámÉ-y[X¦¦ÿÏñ."Æô!”øÜQK¯åE\N�ëµ4gÕ ×�ø§¿¦ƒï±aN¦p‚
>k)9ÁÁ0ˆB�ZêÌBs
- ö¥yŠrŽšer«)v¯¢®Dóëtèrv�\ûvù[ü>órµJmœ�–
- aœò«µÌ¼›~uÝêêÕ�º>µrMZœ°˜cíB<øã`)\y×t|Û�ïÿr'<†ô˜à>ù×Öþã[æÃŽ—ïèh7ëúþZÅŒ8caI�!¹
´p⢟ÍÌ®�,¶GÃí»k 5@ÈÙô÷ÿ`ôÉiw
ˆÒnО8pŸv¿ çÉé*��²Â'O
- ÝÔüв ÝA[È.¡¤r�hóT
pR?+;Ëÿó\*H‹sLqÞæëUš¹f–â:ql-ć¤ñ*6!…hç+ˬ�{h·‰ö- jg±kÉMMÉ×P#ã¶ä:¼}‘±¸{/ÝëîVËßŶC]옙ê·&[³W$Ú«^ß#àû¸¶4fWa\
‹Á5ìð躺M[6ž½)T§3—•›~üÚÎÉÔÀ
- ã:. Z”¦¼¨`sÞi(ÍRô©Q…¼²Ì|/ú`ù
- ilÏ^°L# §÷òf¤-ñ×;-C;_ÜÞù*ù{@EMCooÂ_¤œÆÃõ7¾TöãrqzÜFµ%ׯ|™šU<Z¤ÜoÁ[TA=Ž„Ð'DPJ]´;,U9¯µÊQ›±ÓpŠžkñ4~€êáÁâ_�Cª^™qE¢Å®�œb
�SGsÚøßíY…�2N–A®Òuí®%ððSD„‚ ×hj
- ÿy;9$ß´IA¨ÕhäEO�Ì„á²Ë}
- ¨g‰³¬…—/+ ùÕƒ“ï5�JYÊ @äGúø��ü¾‚ê®f2�¢´—Y Äç/¸Âß¼™e„ß·¹±|vÞ/¸"ÞÿÕp倨~刋ñTãô8OKór*ÒžÝ*
†ƒÀ4hià@Q›™3g"Ñj²Ÿ:ô$û•;:”ý¤fàÍü–÷Œ,d½®®zÍÈÈšÙÆÔŒêº³°«u%ç Ë£}Oõ&³¾‚i2Uè,@Íkêj%u?Ûã4§NœKmöÞùÐd?5ÉÝ“;Ê0™Yï�Úüe}sZô€‡ª>EÆ«Us^Ýœv{ 뤦fQ<Ä�¡‰VPüïÃÊTfͦî?¥�õmØpÙP*�È&¦÷ÐQ‡G‰ù{cœJïñEPe2)ŽxP½0AÑßÍûMɪZH¶j•"×»"ÙA¬ÐC+zq‰mVzá–žóU%ØCµ�:@1æãðW¹Šî[y)ÎJ@÷o±b%÷j”A>)NÒÇ€Ôiç¼$’AóˆÀìt`>Ì?f0g�ÿH36pè6áÌD|ûM›äáö4N�¡°
- œ’ 4J½JÚƒ¯
- µj¤ž˜Æ‡´ó\
íp 3ÓøŽ£8�À¦ªÑã–Я6p®ùV?:¬$‚sDùÀNúµÆ¹‘2ï’n’,¶„HÝO\‚[¸øÕ¸›öKÙ-)�«W~¹iém™?ÿ®ƒTÐ:°ÌðÞºUÖeYŒÓãŠ-#dJe)¯±ÚÏZªÕ5”?ø$»æ¡\d©W<·¹¹,Ɇ†š;¯Ø·¸Ã5ÍÍòS¸Õ¸¯¼—T«T–ñšÎÌ„f(�PY°v=Q
~DX*¼ßÝ8øè¾©s- Â˨®Î€55
X¢R¥l QCÏá¤Îá“øÑÀl|òý5Î{ûÓ¦T\t꼕+éï£e»nÅÛ¸‹’ÂPsÓèlû3™�ùUO©[üÛîÇZ»ÉS3åÀ�îŸ�*èì,˜ª†ß:ÛZþ¾ÆÔL‰›¬†ÕS��ô'̵æã*õòŒ*@¨ø�ı~xgno2±¹áˆâ-
- …Œ ³W³Š«½V�;äpZå9�?~„«$«6Ÿ<”µQr‚bQ8&óse•ÉEb¯ÚQ,·þ^|B²µï碘ïVd¬V-¶(Ü]ã .ïèËŽ8/qhV¡nR®ó®QÈD‰*ùU(*1hç1Ã`Ø�QL{…�Uj`àÒ"šo3�Ü»æ™V¨l…µ: ÑíêÂØÀ
jaFaàžE¶ÌžZˆ‹g1±·zü°Ì2Ö Õ:ÍAuÙZIf6–ƒ2Õtw+Љ‰f�§D�‹ïÉ誩CL-}g»µZ³0>Ò„óxJ¢ýÿÅ>\î�ÁëQ‰¸AÚ_C¶i‚hßÒbl]
‡6ÞÕÞÜ4*šA˯ɰüqX‰¤7„»YòX.€-¾ŠÚÕ¸•aɇÃVâh¬–iKg•ÔÏqN³RĆN(r'Á]¼à%Ù˜„�…ô�ˆ@3ÔÍ€ÎÂ�j§Z¬÷J†.;üãnmÝú¯ÕÎ,SûûØ0x¯³ÃõøØÍ»£OF33Ò§¶…«<$'Û»¸G—E+´Ú}¥¥Îóúó§…'1ðf3›ÆýÒyÐ5Ý/&¤Zœ\RBô7dmíô]æ¼8§§Â\Íý„3ß‚„Ȫ˜@÷ìo¿ûTé¿3eu^·W@Šªü”–ަe7l–!Bã,Às‚äæ1ÜÍß$šäò¯ÛZ§ã&Ù’ç?¯âdCéá �(YЦSm>‚J"&ptÞ܈ªP㇄BF¬ø´�Ú±àÙø4ŒGá5œ t^Ć$¯Þòj-aã �g^ÁÊ�C¤–…ƒAsÖT=k¡TS,|€ràåš9I·½BϘЬ†ö'ÂìvG�A¶Î@�ÍtÀÌhQÕNj†&€åT=Îxt;2]¯P¡|T- LÞƒ’Éç¿ñe1ãݽWÃZÅš*MrH5?„ñ‚=à�ýÑo°¬"ëÆ9ÑK5Îø=«'kÉ-*•„èA¦E| þ Þ qÒ”‘_?\£7%öŽ|M6°fª+““+’S*}çW�_Ü]3ª¨ú¶fmÜ®ØÒ˳ÒÜm w!–—î÷å.ÛR#‰é¬ª;Æíú¦±q qó71ŠÖä$•ݙկ_ÀóiKà&ìJ©Î¬M®Š¬öÞÇemåVÄ5PÏ0>¾¾ Q�çµ5ª†W•©HIh×åù&ù4Ò�IlÓE7}âsÈéÄm[cȾ좄|�d^ ¢ì÷%Uvé1¦D“²>“.èT¬Ò7*é=tƒZ¸_§ãŸ¾1Ð¥:=0pZûš6Ò‹ŠN„t�(åuíÆ�; ÇBÒ]³‘$€k¡ÚŒ€Â.ó{ªFÄ*/UZ’ÆNüç ¦|oqŠÊK—G;^Ö侞9N§ûeÿíxK‹’¡¨\‡whþøñ~¡òòZpHÔb‘‹Í䉸»ˆÛ[k¶8âÉÍÌk÷â.bX.Q¾Xp¸xYa^µÐ"˜Ñ#럙ãB³wnb¤¿óå�uÓð ém5žF²½~>ÇÐ8€ÁbýúŽäN:Ýp4µ[gv^
- B½ÓFÐUzû)?œ¼60�ÐFÉÉ8˜‚�Â/2 ŒC8¨Œ®>�N8Gî�Í%ló%èÝ5ºFH˜{4„6h§Žï¸4Ž%Æ#
7¸è›ñŽÍúËxóoºÜN tª\•'ßȨ
¨ úæE£�Žæ½0#ƒïj¸NãVïÓ¹dà?WlcW��×ð‹Äí
- ž½Öµµuû-“»}2„2¨¶¥EN�¿}#‡äµµ2H^a3ðõ»¥r»Áqs§¤°ˆ„-�S3&Èïô„f´í‡£ÌëÎfwl.š=Wø8å„,õàÒcHá®jžcTê±W®‘× s�9ò0žî”ZàDÎM“ú¾C2’ZM’�Ýû�djµŒtŸ"8À:gí{.Ʊ°Ð1Fb6ƒ1Ç8"yÔ¦>˜õ¿’WÀ9£ë ÓVšŠŠö¯`×j¿ý®š�¿Tò””‘‘€<I£½MÔ±W'%f&¸\yäZëdkÍ´èùRyÑjw˜æ}ùˆÐ€Ïß[8ÂÔ�†»£ÇbBí ©'d'müoû'<�ø|EÔÊÍ5êõ:³¹Ú‹o¼š©É>²µr,nƒ©iÀÁ
<Tª¸S¹¹Ÿ>¥d³… ÿôéqN§ªÝ.g+ ïSÂë¼
Qúù·�¾ë
�áKaB¾ŒÛà?_í‹ÛQ�E ‡“µr¸†ÿj¤î‚h>ô•E¦�Ó›;�C�×7…‹·^q¯
- Æ`U¯eú#-Ÿ˜·;oJ˜Ä‹ãÒæŽÔ�>)Çý‚;Jgí£Ï×9R;Ogí¢ÅýiI7ú}—â8K¡’œÛ�q¦j�¹ÑeØ“£+Ù—'nñÏ·k3‹Á»üeFÏ�ûžì…0±šò¯ßV#©íÆp¥MAzb^PŽ÷VÏu¤Û~Þ1uº—Ò“•wnÈ ^›.II—¡Š_ÆÌÚvdW®Èö�óÎ[Q,ÍÞè+L¾b‚í¾É¥å„ÆÄ‡q¼þ
9«V}ï ”Î�VÑw4qUä3&jÛıHYb¼ ü¹ˆ¿tt�Tœõˆ7Ï�ò’«ÙarBwP9?)Ûu•é‹T/Ùa£•ŽA19–±kªM
- \ÓäPÝßs›<ØTaž�Ðã@‚<?Mâ(ê¼.¡,'%?,Ç%�a~eÎëŽÀ�ŽUá–0µÍ/zQÕö(Ѹý“÷¤a™¬ªp:.6«jÂÿdF@\V®4¦É{ÓRiìþˆÍ8é¯Éªnuý®Fï˜M_†§=¦½õZ8á¤HãîŠl‡sy5k%õÌ|(ði9"Ù6äº}Ô‹~WK„ÛŸ‘hY©kŠÊö¤—\àû×l“RmŽ»´&Ò
ºæ¦ñØò0¾ïÁbû]gÊ”µ¾"ÂçÞ€D^ý²æ¾ÞŒ¨jÿ±J*)žš6¨µ‹-YbÙhÖà÷òé
- Zý¯éß=Þ‘¦A,ŽÊ(Ž�K#Ð
–²OfÈJ:î;¾I†¾Ç!6Yi&ûdÙàÖ%m®86#ªö™Q�µÒÔÌW_‘öA›v}?+èGášÊú cc*ÿmûô’g`Ò>…õq±Ø+û£=Ù[5ÄÍ”·¶Ö×?²9£WÀÉ+^ýo¯^Eàã8s�)å�fç—2aôæQŸx¤·i‡é& NE>"^NaäaŸ;fŠÙÌ9]NE& t^°ÀCLz'âe…8ZRñs&6Þ²7_�üãcyJž‘1
Äþ@TZ°?S�D2û
- ‡|ÔPõÔËOÓŒé\dªRïÞðû7zHÕøƒî±9iÈ�‹Q#µ¿¶‚zr³óc.ò4ö†GýR�4ÎÈqx¦ð¾<2~X’hµ÷náãੳ¨Å2ˆauBNCÑ�+›¢k—Xó0Ñ
aj5n>Þ‰¨õ²e3övÞ§Óôé<¥>�°_²Ÿ� ÛuH: �XR�ÿ%~9á!4öüoÑѼ¦è�3…ºâ”8?¶‚ Î1d#ïÔÑü–šA&‹„„{A!i6‹ŒíÜ/Xa�Ÿ£á㇤=W‰;|ïðä)� Ðg¾~£
?*¾æ‚½Ã }¿ãÚ§ˆKtÌ>5|E޵ÐîÑÜÕ.§ýôAûšQñ6üú
²€¾(6
- 6Ñ”Æ7�–Ú÷<9ùù_ð•CÁf1þëÐŽéi8¾®†å»,
V»4$ÀŸutÉøœø£ÆiÁ,.`v6r â£òŽP
¯½gFB�ÉŽÇ
- tòÃçÚ
C3½;˜,¼o“æãœx|
- /KóMp©1S_¾‘X.f÷V�ª†#¼U>È’Èõˆ#Böñ]µ
A�‘IVoÀÌІϵÀ‘¿üGTV1nr+£ÎOXÂS•%‹›Â³¶™f§OZ[Û_ý9œû‘Pß°÷ {Gln‘%ß#ÚÛhÀdw¿H ù=† ¸y©e/íªW¼³´¶>Ò,Óö¬°IP,*MV•ð„~ºK&ãe¢Ä‹»ûMì½£=ò)‹qF¿ S¶ß´"ÉGÑëTšF™�*¹LX,hŠ[—´º“§wŽw´íeñWQEÙxÚëº?áè“{^Ú†EŽxïh»�iý»¢×‚�„J”³ÃÀH�¥|ó^ÙÍ“Š…Ée*^‰Ð¯.ãuÚxE™èëËb#î;›’ôÔ�<]z]\íƒ×�¨wÚN»ho¼chq¸E˜£=ºçâ4Q1¸7ýÝçWü½Ì“lÕ6�á§¿HE_Ì£ ùqyÿ‰áYRŽ¤Û«<x=ÔcSßXy!=0û8Ç—óxÖ˜�ôþ?±{}¢ÿÀîßF_„üáÇ ™zø¯‰kt©É±ðˆ7³ÊÚ‚|tû§+a®m¸<xe$‚ée–�ãÉ�ª×<[¹T÷¦ÿ�X[þášžø£Ùö�¿s»VÃÌ‹«Þ§UžÉ*³áŒh—S©K=FeËsw uYéoÍßÙ¯nQ«³=NE:[Ò(t]å
k×|ç@‘Ù¿uZ\9{h�±�v€Úܕӆ.Ú¡úsaƒ‰$u+Ÿq¹w:#ãæ?åeúT‰3=ЬлÐ!µpìPL`Í:…“ÝÐR;ØgÊ®�Fha�Î�;¯Ì†5Ie +–ÛØõ»�×bt06AW40TÍhJcc<&ÀmJccà
- ¸�ó¡OCn«W?üùNÂiþî¾o](XЄûŸ{÷Lzì˜ôÙ;¿ðØñg¹ï|Ç�ç>ä9~l4sæVyù™`Š×Uß›,ùŸþñ×Å#_Êu´ù+Deêêí™àéMÙü¢~h³qªë²‡’·#YúÊæñzü$;Û5ͯ9$µË z²>ÿ
- ¾*jõOŸ�øŒñÛ$œÐ$O/¯ÀÃxRí½ƒÂtýf-}*žoïɦøÙÌ|3†M;xÞ¨¯U”•µl/.ñ~XÇŽ¯Yá¼4™x3&æë×x®";¤$�KIö’5ÛdÚ½Êáüú‹~w[ÊÔM9OØã%4ÒáQ¨}éS^žìt–�è@ÑËæw[›Y;-Ýöÿ�Àºs;¢b¾ÍwH-*ï––Ãim½¶IÊ-¶1e/•~ø¨TNN®.òp²ßð)H$ûë«Wïß~�Îð�µÉƦí¼O
- ( é9è†,Ù
]gM6rê+„#»%ƒà/süw¯Aœ$õŒqÆ4ËO>
- d9}÷�+ðÑ$Œsôš³ý?0£™a,>�y‹¹Úˆs<ðþ=†,ð‹c_*\âƒDí¼Ü}È2Mí°ÍÌT8/í4ægæ'Ú¦ž�â8'û}"‹Câ*„\9½#Y�>z$ŽæöÔ7c[s“|"$}» ymÌïÕÀ«zQx 5·%å oùå“$j†kÐÎp)ñx½Äû-:º†Ð˜|?�˜oãøf§‡gFrÀžß2ŠS‘ÇZ÷Œq}qˆŠµ …o€,wyÅO¡gÊ�CF1Öl˜çŸ'íL5T3õò3ûÑðyª¦M‰9Ú2"s”˜ò5uD•‹6ÀÔ-Jì‰U†bsºÏ
- «O)ƒÌw¸R
-2æ/5fÜ<ªBQÌ4kŒ˜ê��G¹ )%ß¼ã<dÆàĪĞí¼3È2`ŽaØÃ]©ªS{£K%ô\]¦3&�Šp„“®®Ú¸Úˆ”CÕ¸¢ýœ©ë†¶“,÷À
Úù^éTÐÙÛ7¿h¼5™uûlDÀ£xÚ·¶—ñL'D¶ð„rÃ6úvÕ·fc\þ£ý§µgAê‘Â�³ †²@�?¶½žÂØÁ‘ œ•GFæÁVA·l,¶µÄ:§¾ •i#~NUûæ“DV~7¾�k·K`!ˆP–ìMX³üRÍÆ$#îTiih¨ž®omÕ˜Å<.8UmÇ<’Î3ïÓéESä4Ü«�úŸV9²ò'½™bvÒ{¿¡ø?îVVÞý£3�×;”U'Ö¬‘Àµ1RÙVé{BÇôÆîiŸëº4CRhÜéŠr6~˜Ó–�J”¥PàÍŽÕ÷M‡7GŒÐ�-,NLo¼ô<Ÿ²¶Ñ£zç÷••2H&|$³²’¼<{
¦Úœ“Kä_œæÖÿmmSŒ)>r’Ï›f@=šâBF™‹ïCB�±©‰‰ƒ‡&'‡F}@©&ÓÈÿ„y×ubâÐÁÉÉC?'«êåñçSæ49+—Óä±Cø®³íIîð¤ÙŒ+×ç˜ëf/R«Uê
ÌîC°Fu:C*£}†T:º¶}{ÂÜݽⲷÔuªÎ×ø•¬e[!®–>ú?‹ÄåýÚ¸¸"ÇM
- 8gzƒô0\HkƒÔZ³:Ähå~™@ª+ô#«N�êÖfj¾çyµîå‹ioÀ!„B÷ þñô·“±R'©5>Ú`Úò[!ÂÄTˆ`mCš�I…Ñ�Ã}¸n
- �>Wßô!M}UËavõ¶4�€3)!§kcÈ‚²ómþ?’Ž Ýådïw•ãv«!×”;Xϡۨ}½8ívt•ëÐ"Ó¼#kÂvXŠJ™±[“l�¶[ZÝ™MÀ§ñÃXC3lê–[
ÃTa¼Vj‹¡…ÚÊ»¥åŒÑ¬"Å“Ñòt:‚(žêà¦ÈÁ<¾cZóve—ýQ›ÇîT…Ÿ qHá‘i{ Ò銀Q埓'Á“Ö»“i öPØöï¿èüȯáímKÊAçIŠõ¤��BFƒ
- £=‰‰µâÖTá…½¶à(âœ&TSŸ?/ïØ�A:Ö·¬»ÐžV§(ø÷@wïFa^ã¦]…Œµäo]*Óñ99¬R¿iáñ_Ôò˜À™þÎË2vM“€Ø`P§“ôf¦´{QYÏ«íH#V7vÅ7ÌÒ° q>@àó«~uɘ׆Ax°Ã/ƒ«xÙ°Bþà3£Ä Ùô‰�tƒÊÁy†b0ŒžnG`ÁòEÚDìÙ�äA’Ô:ÆPØwIÓ7ÏìnWÓ÷2ED<hD�&Z˜ˆÃ Î 7Í3á&úÍë)LDË4;Ü7èæÑ´?$îËk@Ù"ö¿"L&~§ùö1ʺf«14ŠÊ±|îÚÙ7Os�Í}úÆL1;éÝ?Â{1$�ƒ¯w)™€1}Ðà0è~7„Ú#E5Šª`Òq&o
ÇowÞÍËÓ_“…é´ŠªÔ8Q1Û�Gó»»óëùÓÉŠùêù08å×h¸äW¿e ˜+º²\êåÔ‰†R‹ÔÊ“ÃU?w®àeÙôïOÙ�ÝSx�AUÖÌž3˜| =WAµÍÝÅR�
- Pñ°tO%Q"1Y×”!so%%^�zÿ_hn,ý{?ÔÜø"L¬5±_D6©îì+êïÊËSbÆ<�à§ÌgfJËô¥0äbì_ç¡ÑxÔ-í£;‰H«âãââW‘:G˜MðiÄEeÌIuª®vJ]~mÈÙߨQHLKkì»ÊhbžA>}.(h•Ü"‚óãU]¢9Iíh_îV¯@‡›GZ0C
- Üpb
ó:ã™L3�¡tN*ªN½2¿Ó!¼3Œ�
Ca³—yn.•ÊÝÉ‹Wâ`̳Ü}±QBÌC�ªÃi Á¡8*Ãï{57‰¹ìO#aT¢ËB½Ÿ‚½Uíoþi§0ç
ó_ËðÑù^
- ChrU}~rÈL 1òzÿ>..ö=%GÁš›GŒ£ëüo ™�‡ŒEéu‘P³Psؘ޸èó8ðüþP¨Ÿu&;æÊ*Œëù|i&¤ÿPbÛÈ›°²˜hÒ;´[—€|y*cƒVšh†Ò¼Ò(ÿ”~Î_A•qU2·½ÿôGIQÇ3`®^Êvþ=î@¬ÜK'¤µÐ‡èËZ#4sJ=º¤:sY©è sÚ¥bÂyj¯ë·S_E܃"Žª‹Š@ž~‚Ÿç¹>86ºñ#Îy±Úäå[ïècòSï„¥ÙŬ–�”òò#SJ”GZû®yvvÝßSùÑ�æ‰�p¸waTšžÏõÅ/,
- 9'Jkv%%.†~oò[ÌóŸ è¡§üœÂR±Bj¢ŸSèÈ€*$'øè…�©pçS¥u�à+ç9\¬í_f+åòüù8õu\,¶Ê�ÓtæåðpžÑ�ÐkØ®J0hó(]N„QÈvó³W¬�ÇÌ7ó•8«ƒ6:ÜÖÝ£Ïâ·ñWc“¯Y_i>ú¬ŒÝ"‘ßR¡çõ’â�(Óe]Þ6ø¹ªRA%U—6&´F]”½7@̳k3X
h�?ŒÁKïà®Þ�Q¤2™Bk¾[<o¥-[
�s~Ÿî0¯�]Tœ°Ã2ÁÍä¯hÊñÝJÆqîK¹v§«Ÿ(32Jºþí//W…¼,ã¬ÃÎÛzï�d$2ÑcA´kP”¹— §”Kÿ+€îEc¥ÛÂÜà[Qžùàóôùûiú—EdVÃõxR8šäBÐ5ÚÌÄa=:¢�KQ˜¶�çÓ\ °@ÆV»^;KrÌ —M{ü÷ñÆ{#þóC�w}{^,í§$0Rcÿ\o¾«Q½Ñ¼Á×¥PüÊ$é†YÊvpà®>?.ÿ€Ã.K¡ÈKAbŽÌ6ýÞÄ5¿·kò’eŽ+]²F<HËe"ª;{wN‰yx/Æ×å&f檄/XZ[Ÿ¤7»š¶c%ßÅ€5½d•Y_Ÿy"Ыߞ£2\37×
- –k\Äë�²|FO Š’´68Ѝñð…‘œœÃïü½„�ÿnKðzR"�ƒý‡ –Ÿ?/7Ð32š:аá>ްeöWH©Uò«û0OÝ×§¾5…´øÿ
¤úîäe3H‡®coÇ>l]0¶2±ˆcý¹‡ÝHÊ9š{Z
{sOõ–!¥A,þ7†?Å·3�w俎A
- àFjÚÿ¸8¸Bí&8U$G…¡Â�µÙßé$µY5˜‚†FâL…5nÇì²Øò1–”>qóº2££.«6“e—é
- î
ì¼Úõ—œ+˜–@/¬¢ð™µkíb{à÷(�Å7Ði=¥É{lÍ�¬Ý‚âÎæ¿¦ï 8«…1g�(»üè%ÎÓh/ëEf¶M¹Ò�ÝtŸ�5½ŸÌ¼vg½oÚ ê~à©›WKi父U«ßأݖw¬RS‚EìFíßT¬²%ª
`=í‹ø|*=1‚ò*Žù»ý·S§Xö¬€·Ø^êòÓw)l–ÃÖfQ�HãúŒ(YSþô„SËŒK�·æ1ÞØâíW]µf™Ÿ·°7ך³^&ýpô@T'.ìÀ%3�³•„Ã
š�¯´ßÞò»ù5ÏzaTf6Ñë©A5ÜL•óXÌ¡æ·Á|ñL¸-Ÿå–ηêÄT×g{A)ªî®FÑ•."hü“ùj¢ A;.ðâ~Âþ …oÞ%°èýG#Ñ}&]Þ×¾cÜ`C»hH9xnN†·Y Îlð²cÞ¤\+v\EŸ¥«Æ§1¦D9K·Xá)2b.¿ó“NôÚýW¢§ŽÜQש$¥/£”|6tð™Ã32Ô›£´7¡¡¦�–2¸ÑÛиyuü0e×ñ€)’NØuh'dœ¶Ãî„õ�~xY‰É��‘´>ÄÚ#bˆ"k3Ó𼃮Ì: 9¿º¢vˆú$ПCÝ:Ê)H¹Ë> Õ¦šzÇÛ;e“d\jmfŸäOÏa%ò9š‘ˆcK›xÓÐÛ¥Å!k©%H�ÞDn“ü{YÜ"“{n_Ö}
- ß)9ƒ=
_/û‡ZÎ(éù>lú¶÷YžŸÖV÷‹gQ#§ß:QÄ•ÈbwƒÇ÷Õ$¾zw±ðÙ®‹#¿»ãU˜?|ÅðïGÔ΄hÁzü{ùoº$wñ×Ïœ�´º)|Vh‰Ú?»Œ
ZV�7¾%ŸüGûo/£×†‡ôéEÏ"¹KÓ²… ìµl¥p76Î�-z
!Ál€4n>”¼$\á×zV?szûqejìQçëé]m‹›æ^æ=^µ
ä§í¥! ²ºl…ôHB4sLi9}Þ2¢^×ýKÐ5ÅOBú)èíO
çv^~ªêµýïÝ€x¦“rm\KÚ&G^Ð5�CçÐL¼}&Fºò”ÀËâ¨B]K†¡n3††|ÍsGjyðkþO¯µÚbåsܽæaW?R6ð¡·²¾J�ÂÇfhãÚ2 ÄÊlBS§\=¢jÕÕV—Ê*”ôY¦“^¢¢Á™„˺^E)Õè*”\½Ÿ
- ‚rÔr(a¢@ø„6nÔŒ£?¥}ÚdL°©¦�šg¢IvqØNcÐÇa�‘Æ®kŒÍ÷mLŒöcÁA!¤±hd¸£±Vëðµ¹Îòwc=¢¦æ†–áæ–Õs_Ò:ŠÿÒ—•¢sLËí£g>‘œ—1Ü*4-%ð&Ëõ0Ubƒ)Eܬ�†*b¸ÔÖ51—Äï„ç ä+è+;˜Ž<…«†’`!q°fÍÎMù*Æ,[/GK+{×®�,>CâL�Œó�R%%cŒ³ÂÆÃ~‘’'EG�†A‰®GºÂ=‡hÂäŸ”Ž°8:IDìN)ÅWÌ»áAF)ucw'qhÍXè²L@a„¾~Œ6ÌPc2Lã"¥A…2bìÈU ™À&Œ€‹ÿ¯9öA#ÓQLO¬:�E€9k§©’‘ÆfÞKF•b93tºL$c‰Ë¬pÿLzÿ ¿5ÔdÚp¢þðùÛ°>$`œ.÷ï«~Xó=¶�¡ã?„ N�Ͱ/ŠÄ©L®PªÔNo0šÌ«ÍîpºÜ¯Ï ‚b8AR4Ãr¼ J²¢j¿}øŸÐ
Ó²×óƒ0Š“4Ë‹²ª›¶ë‡qš—uÛ�óºŸ÷ûAFP'HŠfXŽDIVTM7LËv\ÏÂ(NÒ,/ʪnÚ®Æi^Öm?Îë~Þï÷‡Ã ’¢–ãQ’UÓ
Ó²×óƒ0Š“4Ë‹²ª›¶ë‡qš—uÛ�óºŸ÷÷ÿ�b$œ«tV&g®Ï–íÁr>¿<Ùyóå?�’“˜�ûfþ{�ç´·�£�‰µ›ž%îµïÇÌ~ßZûþaÅzW¾¿¼÷ÜõÝ2Ÿµsv�ïÀÌò�™ÙeW«�‰µ‘à����@DDDD$""""bffffÖ}�X ÓO„0ÆcDDDDD¬µÖZ›6Wò08BÖçI¥������������ƒ.H¬�W������
- ¢ßˆÇÐ9 �‰u„*¥”R*J^}€Ä:M”´$I’$IÒF‚‹™™™™yÑŸžûÞóÀ_WÍÆý<G<þ��wOFF�����[€�����±\�����������������������FFTM��X������m*—ÜGDEF��t������ D�OS/2��”���E���`g¹k‰cmap��Ü��À��rÚã�cvt ��œ�������(øgasp�� ������ÿÿ�glyf��¨��M��”¤}]Âohead��QÀ���4���6M/Øhhea��Qô������$
- Dhmtx��R��O��tÒÇ `loca��S`��'��0oû•Îmaxp��Uˆ��� ��� j�Øname��U¨��ž��¢³, ›post��WH��-��
- Ѻ£å5webf��[x������ÃTP�������Ì=¢Ï����Ðv�u����Ðvs—xÚc`d``àb `b`d`d’,`�H�J�xÚc`féfœÀÀÊÀÂÌÃt���!
- B3.a0bÚ䥀 ‰êîÇàÀ ðÿ?ó�ÿ@u"Õ@aF$%
- Œ�1–���xÚí”?hSAÇ—¤iSÄÆþ‰�mß½44±Ð,qÊPKƒ qÒÒXE]²(2 ‡.¥Ô©ƒ]´‚ "EœD·
- ¥¹ßi]DÔ¡ZJõù½\µº8ùà“Ïï½wïî›w¿„ˆšˆÈ�V"±F¦pUÔ¯û×â.Χ(ƒg’KÃ4On«;âN¸‹îR{¼g`'!ÛÉP²MùUHEÕ J«¬Ê«‚*ª²ªªYq”9Ícœå<¹ÌUžá9Ô!ÑQÓI�ÖY�×…-Ïó°¢KCõ•è+ Õ¤ÂÊU)•Q9¬4©Jª¢¦Yp˜]Nq†Ç9Ç.q…§yVV
- ën¬×)�Ñ9»’÷Ê[õÎ{“ª¥öºv¿V¬å×›Ö¾¬öFWb++{Ý>·×�¸a|ã€ü*·ägùQ¾•òм,Kò‚<'ÏÊÓò¤<!�É£rÔYw֜βóÜyæ<q9�{-]öíþ“c�ùð]oœ®¿I‹Ùï!0l6Ì7‚…Í�áØ{j�G,ÔOX¨^´P¼d¡Q»…öÅ{,ÔM4°c¡(QBXè�¼m!ŒK†,Ô·Y¨�Ha¬2Ù}«Ì˜˜�0B«AÔ)Ø�F}΀,êQ8ò¨�Ã�‚'A5î©(£>W@õExÌ¢¾DÄÈÃ&ÃUØd¸#›ËÈÀ&Ã
xõMx˜<·aäa“çŒ,l2<€‘�M†Ç02°Éð6óÎ ^†‘…çP¿$Ò�6{¸‡,´#›ÆžÐ{ MÎwpÌBïá8H¢þ�#³6™7adÖ&'~‰95r
- 3wÁ"Ð[žEt’ØÜW‡:ýÓ:$"ô™>2Íÿcÿò5*ß.ýlŸôÿäN þ/öÿøþhþ‹±Á]GtýéTè�ßß��Ñ�(ø���ÿÿ�xÚŽ |Õµ0>w�Öm#Y¶e[’%YÞ-YR'rö„ÄYÈj¶°D% �,@ØBØKZjHÙÚ¤@b¥¥¤-…RôÊë+¥nûhK›~¯åË룼–¦¥$Öä;çÎhµèëÿýþ^fîܹsï¹çnçœ{ι˴0¹Œkb8Fd:Ÿ%L×”Ã"Ïü1þ¬AøÕ”ÃAæY£Œ>,ÈØ”Ã㎀#œp„ZÈ4õØŸþÄ5�maßd“e²ü ?ÈœyÇ=�¤�øI:C‰Ç “DÜãõ(nI¤�xˆL‘.1¢!„P'™JD‰t‘Hj€@L4’ì…P†ô“h' )ÈbÒ)vHŽX,fù1Ñc\'²âcGÍÖÀ±„u˜�>ëŒñ1Ù~Âtüà?ññ„éø!x¡øÁT_qâ?qB‡ÛÐF‚‘¤#ŒL%½©DÀÑ›"¯ä?YøýŠºÇ¯ÀƒºÈj??8>NÑSkem„²¦AY³µ²Db¡4
ÙJ)¤•;•@¹j“ÅP$
- ˜ï'qh®8`›ë;aŒê�XÍÃ6C�ùFâ*„dËYýcá±Ú"ÔŒ‚ù„Ïù£Ûø'?hÆL¬Vã—ŒÖ,½>c‘eË3eV¹Òh† =Cû‘Àš†éÇ~äõxC½�\((qb@¸4ð‰x†K&h×�Î
¥©4\2ºÇ±6N1|-Ô;Ïëj›ï–É
YuÔ@†ájêî›Ñ«xú¦õ†ži¸äЧþmKóëÛÙ�DøEöw¦q3ÿÌ·.»¼cAw@¶4t.Žgãñìükg´Ér°{~ÛÓWl~¬{ÿÖlW2»êöð}Ã27Ð6a2Ì\€6o”z@³$´ñ¡ÞëHÄSÉÞHˆ «g®›Ñí±bõtÏX7ó0KštÔÞc1Á,«Õ7—BòoLëè˜Æ�Ô6Ä·6[,–æÖ%ñiáZ
¿‡,’l>T†pòK³œSGg¬\>
ñ�#»øAö#3Œ«ØEµŽy‚kÂî6v®ìÚçè…Áºç†;u3Ó!ZIÎ8ì˜M�†k?³8¶C˜£Wq{`ìC*‰Ðh>H��Ü1¿_söÙkâŠìh)œ›ž®ojªOO'»
- !~dXñgÏûB(ô…ó†ýÊ0<
kOYxÊe§¬©±Æ§Ä5k¦—=dã²ðÓϧ> íü+ütÆCç-o
- Ǫ†„/äÃõ_koïܶÿ¶¼sñÕ+f°ÿÎOßz±tpÛu7-™}…dõíþ9Å sàˆ©e Œ³\9.H4’!0�¥S\ ʱk2™ï"?ip7œ\2z§ÙÔÔlÞ°Ñt=¹î…Wùç\!ûKyOXimUÂì¾nov›ìÛÇ6²:½èå
2ÆóLZkAýAÍ^âqCæ™Þ” &PæˆïaFÆê¥Iª0Üã>þ&ïù…Q�#F£Qý»Ñlæ>
A³Î‡q*˜O‚áýãÏÿ‹ÑȦ�æ_@27¦ÌlÄ,¨‚�sþø‰Ñè¾fȾ6âp7üÜ©?�úÿMþ›Œ‰±1vˆA˜Ü2‰¦]$j"‚‹;‘vÛlk~va0¿ûgì¥j£úÜzþ›¶ÝRD:ÿg©×濱cë6’ÅÅywú%ôgâ(þƒØ#'´ÎuBµò#ì=ù_@?ƒ>ÆFØýVbŒ0žaá!¬aL4tXv¼¡ü:ÅFööh÷²9‹ïj^µxÞŒü¾¡ézÐÏ}´WnŽ}7}¶×»j“¯ÆÎšÎïi½H©�¿º¶ÆÁÞi¥ýÅtêïüKüSŒŸ‰aÍXEôºEºbbBQ1ØÉöf”t‘x†ôFȮܷ-"dqA÷ׯ\ê·~F`³»è6²iä�•+ÀÿÔ¢Û^ȲÂ}שï׆k&»ÝĹ¾»íÈà<-
\èœ;Äâg1>¨w†0Ü0ßvòÉ^x ìÝÝ7lÛ<”šyÝÎ}™ÌS·o›9éÜ-Û®ã¾6kžÐ±lË´¾ën¹ùðЇo¾åº¾i[–uó—§~¬æoà`jàÁ•Š{i×\C4,"iW8’J�oñVò„bp¨ûwˆ²Cýªºß!‹;Ô'7×D.v¹ÔÇÖ�Ô
n‹õoZ-n²ë¤ÕÁ°eùÏP‚òŠio4Š~LYä/zmþw_�ÿò�¾ØìgþϽŸþý§RÞÏ"tÞ Ó&NoN€¥)4ÆÉM³CÛG2«‰\j²Ê8�d-É@>#ÛOt^¶Àì5¼+x͘e.^á]ƒ×¼à²ÎÛG 8›^æ ômŒ÷(ÓÆt1 ÷s™Ìbf³J›°ßÒ —%‘Œ‘ â<‰�¬4ŽÞHâø”ÝÅ@ešê÷8CÈÔòŠ,»5<Â(—åk²c5Y®I¿þ¶ìÍØ—âùAøú]|Åךål6+›Õ=øHVãcb´KÕ‹B´6ßi4•#´‹_Û©|&ó>NvQŠk#®pW•=ä¿uº7”ÛHɰR$
ç÷�î
³[5ì‹™™
ÌÍÌg¡ µé%ð1Ïä9}¼°ÐûÉÇþúÏ&@$&¸¨ÿ¹÷Œ¡l¬”ð=Ó1RIñ�ò}9æØ#ÎÏ‚«zû??1z&®ôı_aÚùc|PŒI[íÝ:uÐ; ¯þäÇl¿Ñ->k4ŽýæGõ£ñYÑm|Zô�wà
}û“ÑHnÑR=-B¾ë™õü~åm¼�§‰.Ù�± .ÀÃõ¦Mz^,—»ë0�%£ñ°Ê8®‰Eý«G¬Ä**|ÿsg|oÔò±ŠÀ¹zOýÿ¿Ö¬0s–¾zâÚé.¬�ãWN�¶^± ‹„yHk<J’Ýß{nÇÂE¤Ýh¼
- TG·~æ’ço]¸ðV²á¹‡††zn÷Ð�zdØ,/À)j�l.ùÝw<w ¬¶?5*F qH|ö<f7´[ÿ6Tõ‰dªê“ü„õ©¢×?ìC8êSì'€øN
- #½0”fñ2^~7¥¯:
- œm�ŸíM I�ˆ`Mö:ÓŠH¦ÀÏF²Ø9ñBä§Þ:ïáŸýágŸ÷ÖSk·ozíØk›¶ó#åSæoŸÌ¨oc3¤€„›¿A¢™'Ó¹m×¾¶iÓk×nËÁZ�-ÒyúZP
ËÇ=Uc™'…ŠÊê¯?&È�èK¡—Eu£lÎ;éª÷><�v3t{8-Ù|Ã'
- ø«eêøa~ÖìÅH94²Èx¼¢×AÅ-³@üy
bT4@0ìb#]DŒDÓÑ“½lj€DSio:AgÐàöÄS½ìP z:„;¦¶-á|yH"r
·¤{ÒB{\ˆ´5RLi‡6öAƒáAÖæã–tM¾]èè�ÛßtÓá›øaøRò±KºûàËC¤!Ø1ô´CÞígCÞ샂ð +ù¸³1EG·!ÒÚ€ÝXzû––®î¾éÙ›nz–µvÜ@±x™�ôíô›Ê-#i^ Ïxñ*�$)®ÎÀWü’ã¤=ÖO\fùäó€[WŒ´“öþX~V¬?«ÿîþÐ`Lei¬::v4Öß$?‹=Rþó˜•a#ÿc¤÷]8YåÝFJâ™b&'{%LCìEÀÏ¢‰Í·Cf�]Ç^$Šù/ÍùïÒfߪÞM;ÀÚ;«óÉœ… ¥°Ê�„6ù°CX�ÕV¸¥À§ð#êÆX~FðƒÚ<ç :þvC¿¯cºµyBpLvŠ£¬�Ó1ðÐF”v#ß9†
- /êö8VFë©01Óà_Kôí?Êæx�>£}úÔ#€G7ÔÑ‚\WŒp!.@ü¸îü»±bùwÉ¡+{Üoª�Õ#»Ô�PÃQÒ®nÄ«66
- cZ��çD‰¡¥â’Â(. °Ÿº�uï;n‹M}ÑÁ‹Åý?»œ‚ªžävÊtžÉxíêF»�ì²{É+È–�²ù`¢
- ×=Ÿ×" rPÏ€l˜DîV̶ß�¤¿±™•»?ã�íZ@ë¢Hÿä°…]�º[˜¥3Àö5€Ì%O¨¼ê)Þ\^„�Ñå Z;ú˜>�F÷ºtf›-IºzÓ®€ç�Œyúu�1Üu™o<å:Éoa:uqß�‚Õwòykk ⋜‹}0?jv²«X+ÀèæÝ}V»›ïäG$sþÚŸº
- ?2ò6ùª¯†ý´YÊI5c‘$óCfýb!¯X¤*|FÏÔÖ^º$Üpº7ïpäí55§ÅÝß¶6[¿mµàjg�¹¨°®¢l>�*öñ KO&
- ±‰8÷Ü�¢:ǰ…o¿êÖkõ¢‡Kåm~™o¾Sä-*4¥E¼}P/ûÚÍ% k:¡e×"å1AéJˆ–èÂâCAX𴹋Š8= �LƒÅ¢>°Ü±a¦åÿ—v{ä|K.3ÆÛ×:\B¬xǤüwðºå˜bÉeb€Ï<n/ñN��ç…jN¶j�OTQMâÿòû‘ßÕ§ îå±gð�[
- ×¼1®ÏJò[H*èd÷ÿéØJê(�R¡Y}äþ¹ÈÒ˜¤c¹hC;øay«hŒ�&ŒCq;7/SG—nÉÒõy'^óûÜ9w×”[¶yËÒF`4;ëÆupX_#��6Qy'�xCØêq/öQâ€P&ÑNè§t�ºî4pÞèÁéÔ�qD÷2/عÀÌi=õµÑXû܆D£A�<Ûú½-�®>>Ö1Û¿v‰HÅ?äf¹›58Ôó†þ%Í6›$ɲÜ'p¢L^H¯âXÎbpI’VqnÖæ¿�ÞéAé8¥åK”g'i‚!Uz†áSEšªI×ßûõÞ5Ù÷ýN=ñ»ûhpÍÞVÜ?¡›(ìEÅ ÿàš½¿¾V¥³rûÍ?Þ´éÇ7ž®ýõÞüËV£Ú‹‰É¿âµ.´ãOø¹Ü;°÷•¤ Ñp¤�4ž�NéRZm.–OÔø> Mu¾�L'¬Éj5©ªâÓ`;´Mt‹AQܶM„›ïôyëVí™ë<`‘’
$m)Þyš¤Ú³ÑX„™ÛDaî:ÌáÝ�ªšq»1�JöFq³15¤ä-Þl¸è\ƒ…3‰~X¡æ-2pFÿDðe‰éÖ/ñf!¯è2®½iç:à“=Ãhýà{ü%Ü{t…^€�¶*ÄPˆˆ…ðBͽ]îÎYÓD3ÀØjd
úÓÖÔ*æw|âê¼GLϽ}ùË‘k7¸�ÇÏ=0×ä6„o¢z*ž¶âzo‚ð1~Jçw0ý0SÏÔe“Pw%¤”�#@BJB À
%Ùø+„’ ü'¸½œÀ;¤%!&©§)ðHÈq î7fÉqöH.§Žæ²ìÐÉç�!ØEÚÇŽf³ì‘,ü9Õšƒ$9” æH{~iž€Û ŸZ³ð)O|‚�!"‡üD.K‰ÒQa2Õ
- %©£š2WŒ¥É‚\ëŽ{é*™õB{7â,˜9.ø'ew U^¨ƒW¯�&Þ$»r9¼µçrcGõBôçwl¬¦òÿä’lö<üÑú¾™Ê·îSQÂã‚…ˆ�hì! i¿Ñ¨vãîÎJ
:³Y?üñ#ù•¸_Óm4²ûq[ð‡ýýËûû}×,¼EóõA{VåПºˆ‰œ®ÎP|žDöåg©?9M©ÅÇId?{¤)®ûÊ/ÂðÐ /\[ ˆ«JùÒ�ƒ¹�ë[àœf4G>ËÁÌÁQ€K ó^ Œm×â¹ †¦›O—Çù -7wê]ËÌê„ô<ÝU3jÆ�,ÄÉäˆ:“¿Y“µqÅ~ 0³™/¥m‘¬Åµ@CŠ—CÜF€q<·é’y¤xËhúŒõÄ\ôЦ0=—RgYìd‘(õ¼(_ð2’¸ŒØÉÊa³‡_Ä{p·M…T*¡‹0žU”T¶˜Ù!³if$ÔŸÔ(Wâ¤q¥RC:P a3=b²Ñ rK1'-»{ Íö•HèʽHý1Êá'`Ùkϯex¢$’¼.¹hŽ{܆`¤Fé¤z›EÃ0®øc5xfMÑĆä�¾}ç�ß¾Sýï•S¦¬œÂÂKÅ]Nëf'ÛpPιS§`BmmHÒv9Ä4ሄ^ìm �D $¡˜Š�,€'Ü„ „pìWÉîgØdV/L¶;–ª×MZLñõó“êµ¢H>{€,ßë�·ºÂΘ±ªã×÷Ÿì¬·Î˜QSo
ÛlÜûùsÉ¿hýùÿ?A¿ˆ2qªÓÐ`ÀÝ5 ƒ€œZ€�&*ê“X1L5:Ù6¢ë´öÏ‚+ÙÝßêO]ue·j�õƒÅ¨%?ïÛ¼&ÓØÑaW?{ï¢ËË2[þ}ÉÒW?ÎÞJÄbòÒΙ›¥kÏ-\�»Þb7‰sIì¬kf&ΛÜfê¹x~¬¿·nì™O-9÷VÚçÎ
”~cˆW"È—y)b\)„2MrW±Ëfˆ;MíóUë7¥ƒ'[¯ÍÀ�ô¹’-c/ö´.¾Ø¾”›æ¨uÙMèþlŸ&øš.Óõ9ÔÛ) GêÑÚ!Ã!W* ¸60CŠÑ„#”Üq£ÅçŠÔørqŸOÝÈKÁZOÎWqù,Æ8Ì�/Xpã�ðÏíTšÉÈ‘±g<>¤)˜‰[J8£o`
- ;úÔS\ÓSЧ¾Æö“Àá“%š†h~ðÌpÌ|J˾F~Kì=E0Nî¸QƒXßÇ©ÞÇ*çþÑç8;D7öQñÑ1ªµQCÃ%
*E‚yëy}ƒ¡ �UG?>üI`æ>Æê÷'Ê6<ž+ƒí�ÓÄÿ3IVògÕÏ®�yOŽû•ªQ$WBv®ÛH vî…¢è[ýÏ� 2ÿ+ý£�Ê'ÿø6N¸ß†<úÿúžÛÇîÉ•¶¦—
‡2”ÿSñ娚9ÿ³X†1 \•┣ûýÌdf>ÃBŽ~¶²ÊÕÍ-ˆ”t>¦W�]Ùìp©PrœîZ[±²'žÊåÈ+¤�ÆŒâµl†9]ï8qã‚ì‚C§é!Œ¶'ë@AA¯OuÿШäª
- !?M\…JMÍÍfÇž)«ß•Ë=õÔÉw?A•N>Ï–ƒžË¼}újQ<Ç�pÇ ^Îñò(»€}¿±½½1ï„+¿“2ÇàqF²÷4R¾„´iHÄ�—îITër8ÒÐß^§™Úù!gmóä>¸Îÿ�´Î'á÷ÆÞÚ¸hÑÆEü`sÌŠo¹ãÎÚl¾ñ…Û!õ(9~í¢
‹oÐàþ%#ð)þ~ƃúj$Þ@€Õ”ˆLp½GåOa{é®Íß¿fÎìé”)°zèªØ”Y×<þõ¯ïØñõüýÛ~°ùšÏ^õŸcàÒËš·sóÐÞëæ½ºã·Þú�²ýÂÝ´N•RUâЛÕRÔT”Y%8ÛÀ¤òKÌs3Ãq¿d]^©QTb' œÄzx¯)îH´“�FÒ©P„mUÎZ¼jQ&œX¹ñÆ�åoŸß<0¸jÉYG¼±ŽÔzê]ЇþÙ$8cÖÚ&ÖhäyŸÝ¼õšÍwΞ{Ëê9^˜¼æÁsfß¹åšm[våÕÀ‚“ÃÓ£!É(ZíAs�ÈÛ§ÇÎyÁBмÀü•Œú8RiÔ£Bg6ˆ{ËUm¦’tyW!bšpÇ®d
nÅ/yÌ‚áʼ@vÅÓ/©»�Ô%Çcý¹—öªŸxñEn’:üå4YÃýõ²¼,yZ-ækr¶—úcH&öÇ^È©ÏCº'È®'^T®Ç÷“5ºœîóÐÇê˜r)(Š(IèÒJ™U׌&#€ÝŒ!
+YM.ÿJï«EX^|‚ÂÂÞL–«w@´�Ú¾ìò¡ZsgßYÓæ´ºˆ…ü\ª�ÑîµxêÔŸ ²Á¿xÓ„µyºý—LïõCyo™…’<ñQÊO$)÷W�6¥m%݆®r݆Õdõ”™‡Õ½Õð’�{¡üO‰bþ�pÿ»AE܀ʌÞgÐÎÎý²ˆ¾¤§iòï‰�œ~ºA¤¼¢™òßO"mo*î!ƒÓ[TÀœŠ�òm¬dHÑT1Ó$…
- ÉPÔ�4^ÌûsfcA3·ß,ˆêXAòPŽêbâksî�Yà†‹ šyHˆhýPäÍËâ+b‚W�=}¥Óû;¿¾‚µ¨"Z&x<SySVYíÖ&=ªþ4Ÿ¼&‘è1Jä5u~�è,Ó¿¤zïeù–g^QB\/¡PÊ„%�+p‚re|Pn¥ ¤T’†cZ>?¢çï–eòžV"_[‘çQ©/…5Y�ãá|бàqI£ö/\§Ó9ö–Óçããªdi°ÀEBh$ª�åvÒõ ±€…ÓwOL¤ …êÐúfp�a
¦,?HógHùf2¬ˆµRbî…²L
- v >ÞUÀSo™–°^1/,šˆÄ“¢vc«°Yò GmôÀŨ�Ô~¸Am�êzªË?Ç/¦’ÿ4ÔÎ0‰�‡yj̸pák²î�¶2«öH
- «ÆeE€RßbéÅÏ/"M
7ò5u²lÂ[ŸdrC‘&YÍ�Ü&I�
- `!>pû˜;¦õåJ-�b�àÂ--.à´VäMÚÅ4>©¼Fj¿–/î5ÀºÎσ¶¯£²ƒ¢Þt5}Â>Cþ*›<'ß÷˜dµæ?,cÂø¾üïd�Gfëåü¼2Ò�0w�ã6óó˜òL¬h"ÜfõKä¢×òÿζp;ÕÇÕǿ϶PÕd¨cÿ©1¾EO‹šÑi¾%ÿö÷ÉŘ(DCäâïW¬·‰ªõVé2š„I)ˆ�TöiÃM›êµøF�TÛz¡0ëÁªµù›U¯õ Sµþ7V¯ÿ
mBW6;›nYZU¢zSÏTg>(“h……îF"âÞ½Të½·‹¤ñR]çßûLÛ¶™|¦ûLx‡[Õs,'NU|®€¯¹Eà<ñ4)«R–‹Š pß*ЏvU#¤gÄÃ*ñg˜ò·jÉ™*=�~܃¨ìA‰SÜýÄ“ÎÍîAJ‚Hwä3@Nur®bw™°�ȀʌxÀ}[ƒ`ð7º½’‹ø¤Z§ËÊ›tPlh Õ³¦L.)NU‚}¿¥¡kqÜ'ØÝvÅéõˆFQr×·úŒ{ˤóS]óZëLùÿ(×@ã*úSfÂ^‚–+uöPe_k#Žñ•.É8éÎÉ‚%��Õ ¯,�…ª@•›£TK£¤Ñ…º§Ÿ
- t`‘ß‘ˆXÔAD;¦‚b†¤�|pßAºâ7ð}qÒ¿é2
- @Yû`Ý~¥îÁµ¶ŠˆiÔ¬K½û0jŸ÷ÒYÕ(
žøÛR„úÃÓ~^ˆ¨Ò§8ƒ>…è=ãF"šËœA[å‹ÓDqûvQœCîŠXõ|Zõ‹sO÷…þ<NǦûcêPI|žèÛÖ‰¢ú2Ö�ë Äů�Ð1…úQ|îëŒFH\[
îÏT�k˜Þ½$âÕÔ3’½ñXÓÙ—ÿ5ÿ�Ë®A…ŒqÅ_»írvÁô7óßÈ@ø�vð2Ë€Ïýi%«Êm‘ØŠ²f»—�P¶ú^{þovvyÚfVÔw4eåw³
""Zd¿[ËÏT¤CÊ"Ù›!CÌÆ›ÿåØ#^îÏê
- ÔïZ¹’�fRÌ4¿¯Ãx»�p¢VërSK\·ÙýBÃß]Q„
- ÕóóB~#”V*ØpÈx
¾ˆ^¼(ÜÒëo/`D«ïסÍ.Ðô±õEæŠOWTvõÈ·6íçÝùúM^~EyÖló¬Í/öÑ«çÀÇŠ¹lŽQ˜6M«©ŸŠq”":}H»eaãÞÀ-EYˆ"þz"ôÈ�VKF5€’‘Ê8ª/7
- tÑê�Dè€n#D*'—ÀÂÜ^I×û³˜³øµüZ}pITmdL%÷7½@¥CÞ:Fþ¢By%òž�Æêõå’ãׯKS<K»ReëÅÄ«ÝsoºkøÉ|È�r‡à^Ósºuí›~·ú–Ûïw“N·_µVêPÅ6;‹YÁ\Ì\ÆlÐm¦ñÏëI£ì"�†ˆÃRð
- 2�·Îts¨0÷ã^~’áõµ›î
- ÑÝ;ÄgELc„7¹Áãùž"û�–È÷<^‡âí¶Ù$Þg$²yª¾ˆ©s¨ÙL×´©Éä$Ö �D�> \ä/Íf.ÁÙÕä³F;ÌæÿkáPñ•ìb‡d³z7Ô�eͶ-6‹b²y¶ØÌbÀaWjnh7YôLáFû!½4ƒÀwßâssF�Cºn�h–Ì_0óû…’>á±M½Z²« °ò‡€ïnC휌¬ÄÃ*#5/OöUÑN\(3oÄ@…[7`‹Mg8xÏßg¬e;f\yñ½—|fÖ¤©Þ‘¨Û]ëi5®¨q5q&Ö>¹'ºôâóï¼áå°ÑßÙ353éükÏYꑜß=WŸ7çâ+΋yxþIÎe<¬¾“ûÂP�Ãh±X aëêv׸‚Ó"ÆùŠcJcú›oHÌO†Cu]³L5‘®«�†ÔÒÅk““¦ðÑ–†ó¦õ„§]xóŠ¸æŠ˜~ÿ#ª;!‘ÞÛ)B58¨/P¬í
õõHšÑF#0‰°B(ôÊpì}ÑFstÒÜM|�¹ÆlçˆÉ)]tϼ&ƒÝ–™¿,ã™—nt,¶h[ÐäY4ݬ$žwQ×’µ,Ëž@‹Ñà�Ækåš`D”ƒg]rÿ£™·|êüY}ÍVq’wRC*ÔŽ9[o»ÿ©ç§×Î�ÜdðX6Žš&Í=ÿâÍ}—íß°À/*Í�\�Ë”)³ƒÉ5gOò˜l�Ó¦¯¬Ø}ÙÙ1:>OýŠYÇ�òs(•p6Ÿ‚[‚�B/tçˆ�*Ì -n:±½
<Цð�øè)Èú¬á+�Þ°~q_}ýäÅëoxt>L®¯ïƒV–
FßÈßG¼@dÎ9ׯ[<ñs/¼í®Û.<7î±ðÖsó§B²Éždï�B'·wX‚üœŽ³Î¿äü³Zéµ£üáW²ÁÕ—Ù>2²½?í2ȳ¯±÷8›ç¬žÕÓ={õìfg�csC³ÜåœÕmãå –ÛÏrâ¾õe ¾#Œ›‰E>ˆòü45µqo:áJ£Öì¼X«°^ioº“P,x‹µfµ:/y ñ¼¯n9§�VóÑ¥S§7=éºòîè’u-í\¸%•KåϦUv¶Î¼,»â³€„íÅêZ=Öv›ûâk¯¿¤NÑ*+_§.ýÚŠŸõÖž»iýšÚƒ=w
@¥æl¢m˜röô>Û�OÇÊo,VÔ²’×ëÉ�z&:'ÿ4ðÎ5¨Ó…!êÕ9èpI 0@I[ÍPU""©sÙîInv‡R>ñA¸Ž˜É9tæ$ç¨3/«š³|k£8y´iî¬�šE
û“ßøÝc8óÂE×!Qè\Û‚}%Aš�f4ì s*®A8�¦‚A³ØÎ€Ü>D®�=5uw¶Öõúj³ênG
�z?2”Qª/I=î˜ÛfýHýè÷4Ånºå“]™æ¾€ˆYmðªG"³É2äPEÝH™Íf¹vZnž<š—PiA_Òq/³ŽPÉDÕ¿ð ã¨$$Ž~%NyhrÜOdM\‘-þŒmŸ(ˆä@\³º�#½„ÔêÆ¼“ÒNïçJŸOÔåã>a+ÿ µuJ¨*(%�¢FP„JÄW””¥Š¦½ø–ßð‘,$)�ç÷)åÿ˜ú³’ÿê}×ÿ˜
- B\–àÏ_»ïúÇþ¾w¥Vé] 0†ÑT¥OCÊQ}è¾ë5±ÐÂâ{Ho*ä™;;õ葞ÉrǨâêõMÔcå5ÜãÑ4S
- : ´ýMŒ‹îæ›7�(kY:멪¸•zÒ`ˆgp
›J†stˉý±v'²¡¦eðÒG^~äÒÁ–içD›»1šš‘Š6ºdA Ø@'N ðŠæ±³Ö<?ÓÒ’9庳b¤ý„É©´EÃ�:�Ýh²{ëáh«â0ž vÛ§˜Q~�{©"šH”ðƒßGQÔkl”<ü:Ê›^g£/ïó¹_i²«´‰ðó¿ÐÅPœ’›�¾®>N.Öô?Îf²Â…Ü1˜ób•ŽzJý¡±D ì¥V
- o@7R@6Š<Àþ%IF©Ø0êmj=
�[Ž}N‰âÒüÛŠ¤57¹ÿpò©yŒÄv4@<mÐá¿Á9TÅòp?�ÚR7ú�ú¥Š0Ò›š´ÚQÏG¸[j„¬ÐÈßÙÍziß÷·b“´ú�~ƒð/)wC?â±ï רa¥-/ŠC®n“™û.Ä•ÛHj63¨€’иŠpø‘“KrhëÏÏÂîX–êIçÆŽjß
- ¿‚oè1ÁÅ9
- ŸfÔ\Ž~Ú:-¦ÔÑ“K �4©±7BYÍö‰Ì†Žy%›DC~e“èmÀÞ@Ñ]Ñúÿ%Àrþ©ÖÙs4T® ™Åâ®ÐóÖG-âUg�õ>ÏíûH‚OpVÖBì�Â]ô{9&ÿ^6¹|Ðm’õå_PLLI7Ç’¦iÊ®õé"'T }Æãï? 4»ó¹›…|‡¦[FÇútu/Ù_y;Z”¼?Û£H†K®0W�z¤èc#¤ÙÙÐ)€Ž~.rÁŠÄ¥+ÊB‰°Š±&J°“ƒG 0ùË[ýÐäÙü‘.Ρìr·ŸO³kŽÝ;VC•‰ oX¨ úÍöKÛ�Sß³ër¶t‚åí²í„:z‚X\±úxm‹ÛJhÿ™x¸ðÐN÷ÇhÛ5¯¥Kè`…;ydp.Ec›4²XžD<-´llµÛip.»^ØâpÕ×:�
Ùu�/î»öü™.«ÅY[ïrl�¯_æ4¸šã½ÉkzÎ$~Dq…]7/T_<è�µˆ¼¥Þã4K§$ðÆ–˜ÿ ™»ð&w“«öä·
†ž©S¡¸7ÿÿµ|K‹^ü�Šø›Žâ¯7íMsMGýáùçÿ°èhÇÃw”…¹Ã㢴0]?²´˜fjaÍ5aŽi�–Цè6C¼2ôno•¤“Õf ì=ñ–)õd^Ëÿûövï qNcãÔŽ´ûþ‹l=uÙáì]?;¡fâù-EÕ~äìöáÏnÏvøÕ}5�¸Ï×%»šë¾÷ýú–ìèOÕ»³dë�¿=„Z%v¹Žè Ó³Ð
n¯K— u ÐÌ“*J¦„ê�#1äh„u1HrìÐ o»ý}ÿ”õõSZâu=¶‹îw§;¦nÏ—UØï‚Äãä•ü` FÝçïȶŸ½En?»¥þûß«k&»¢ÍÙl9 Yõúí�d«†gAâÃ8NSGáê³ÊDŸ09M‘AK{Þ€K3ÝŠ„ª�[_]’%W4zÖÛˆu9é\~åúåën3ÔÉê~ñÉzir–„ñé
Ååô¨“X3kâ`PsÄêøÜÊüâ’nÇåïÚ=mùºÁ]‹ÔƒJËks„ÍóTÓ9d™ÒõeYN`}ž¯/û]U#Æób˜;R̨“ÐÀt,¢ÚlŸh*ö¢×#JB+
- (´¡iGx\}~IÖ³F·Ýv@T÷Ëu†ÛÖ¸êJ¨Ú
- ±÷ÌÿœÃ
- �@-Lœ™¨áwäzÃY§îg—”úÓâw‰`wx-ù¿Øö´(dÙ¢]ƒ×ÉÛFÏ3_÷øX�cY’mQÔƒç�ßWæb¤-©ÐF¡�êKõ5Õd-0bƒâ¨ç�ƒÂ—Ö¨“T+æ‘_ïZ„xÜcËÿÐj*`ûûåˆ}�|xâ~¸LÇF�*ÚS*oêŸMتêAÍó–²ýîTž1pÇ7µ1?‹Rt>éó»¶R'"ú�‹ÀäÆÁEÂyÓ)oƒP�7ž”æ‚Å%«ËÀ$rÃvõ¬
QŸ¿û½eE”ÇãØç”+�½»nùzlÝåVlÝFrktÉÖ'µ¦'?R®„'ZƒCEÕI§Ky» gaÎö0þ‹ü¡^áê} pE;…õKq{ÒáT/ù?ïi"%íÆÞ1ÎÞ’ÿbñ-ÞÔ¾qÆ›Ì˵ƒÛ+ ¢Š8Æ]ÀÊrI¸Üú”Ú£V•{¬dȪ͜¹\è•AÍôÓQÐvOÄSÕõ]0.ÛêúN¨ìX9s¹Õv¡b?OE~ÚFPU}ož[YîKårÀéÖðñA¹ÃÌ“U%‡�§7D€w
ýêöˆqÔbá/í‘hÈ
íáAÙ±‘hPbQØ“JB8ÕIºä?áI%=ÅX‘tÜO¥;¹(P‘hºLìd£Ñ
S •'hÿݱŸ>|þùÿT»‘¬ÜV?Ù,O•Ýç"\�`ª7‰ÕãíÁ.‹2ÐçÝ>Îæ¹Dá²Í
�fÎÖm•g;œ�-íö„ÌCŒ'œ¥Öéu¹,»¡¥Î z—A`-ÇÙ¼¼Á$Öxvc“Ãk2·¦[x–p\cÚbüí“l΀ÝihµsµœÙivðaÛÃêM,gĨlñŠÁMžà–zÓܳ›7JvÞÔÙÀË‘V‡RWÏ‹N³•ÝäoÎ4‰(Ú-„µXB^ÒCl&Vnô±nŸ¿¾Án D4[k6ž³†›ìN�×&µº}f§“3Y¼QwÐ@$“U$(Ǫo¶:-üZG¼…#&‹Å†/…}–?ÄßN}Æ¥¼‚7íA!M´àühöøW>£æï?iX²pÊýùr›¼A–Ù¡àbþöó?uϱ›Î¹³-hñäØíëå6;»êSÿBõ#/‚µé@Ñ¿J Æéþ
- !%Q)”ÀDq:{JI^Þ‘Ë¡õPY7UGçÊ(ÂÀ¼Ÿö¡h³?Hmÿ¬ÈÑŠævREˆíHŽôçÔ=ÜN`P)QœŸ¥Žæ€G9®ÓFM‡ÖSáMG§õ@2¤E‰$Q
- µ$Çs±~ä’TkNµ"×9®Õ†8ûcêF¤ñ^ê"?+GÙ
- ^÷*¦¼gUlFVx�ªÚU™poC¨°ž.XCƵ�Š×µÍ‰×qï‚Kê[¯k[¯ãöK—(l�À;ö
ºÓ¡ínè�%^ñ�RÔj,$)§ ø·Êì1‹‚n.¿�ßG÷:CÐïfŽÓ(ßñ,˜íÐ;š„Ä´©ôR—¿Fëž_~ðÎã^øø;¼ó¥Õ«¿D¾ô;6|/jGGSSG„›G’ӎļD¬ñzbRï¤/X?½ñûŠÃíñUÚÇp14u˜$`¾ß[ßœH47õ7Iò~¥‰~Iÿrêß™sùù#èŸ6ŒÛ+‘h„ºe€Wò6@wK“̸h6, ‡1Cµ"à�‡·æ©Ú=mÎèñ�e°AòÓóŒâ–=¾àôî�@“z—ÜÐÐá² ¦sÒóls³]ô;kklµêÓr¬^"sƒ¡é�’Ü>Õ&Õ„¬-[×ß{ÅJiÒ´9[‚ݵ³È©¹-ç]±dÞ¢µ²cÒµAnµÛ¹ƒägç}ê’‡¼»6hTï–ëüÉ–´?3s�ÚÝ^kúŒLêcYˆ1ëZ²´n[÷¥ƒbÝ´¾E߆ŒçÕ¤Íw¬ºàk3Ôf™•åˆ>†þÿfMäÕD‚è…Õ ¸aåñDðé�~}&ö¬Á@¼£5�ugn¨›OÈ¢<¹'`&bÓ¬¼±-6à÷®;ƒÁX÷"‘d*²a¡wÒüÞY”¦´vÖÔt·L³ð¦Xë¬Ö¸kñU�ß©øü·aîèÔ=HR_Ã@¦£Ä+j“2—öT*‰Â£è%ìÓ/͸oƤ ¿±Óyá‡ê
£—»î›1ƒÔ9/7› þ~Æ7áýŒ´_“ÛùoÃÓêÖ+‚þ$DüÒ¯sÞIH�:çr£ ƒð ¤yiF:Ýå¸ðïäv�÷ËýÀ(Œ¿d®O":¦ omØÿÅìdM”8åÒ;¤žZ9uêÊ©üHCg\›K/*‰ŽýÔ™�g*¾-óIèÑö—±¢ˆ_ÁE¢œ‹RqîR'û[¥fõ?GÕU�½Ao‘vb A$ÿeõ]¹Õ/‡Ô¿ª£o©?|ƒÔ�ÞQâm–4™G¢Œƒ7ñG™83�Ú3+
¼74‡z*)¡$Ý‹JÀØpDµî“Núj5pÐq¾·“e�Df/�ÒÎ>ÎÛü‰è´à”%é–Ãg‡Wµø¸{…Uóë:g,ênН¸l²¿µU‘\ŸÏt™'Ö¬ñ%ÒüÑE‚«}àòÍ�íu¢úC›èꘒÍܻߺp±}UË+^b'‹�’¯«o(5gã¼VÃBÕIœ¼äOEüm>·ÑÀ½©þ€5yšzgö†}úÁ¥ÜüA”©P-øP/ú€�Þ«�ì„ò Õ6Ì)¡x5/t;1šp“1”L º9õAܳ|÷êÝÑ)ýµáåîX]m��ûókFEéH/ñ4}:¸,oLMªoò®»6]YãMó5¢Ëê0u[›ßyÒ«ˆfVêh¾˜?¸äÞE-A§_iï«�ßÝj²ñ
Ô.
- 6|Þå5’`#ÏÕZ-÷svÁfq˜ÓŸ�›íês·Íš>¢ãÚwêÿ î7C—å{ A“ú…ŠÒÖ]B¾ëÕîz,i÷H'dù„äávÚ?’`E‡•�
- üx,‡öm±¸z‡`ÍF[ïê2aõv‰hp™%(ÔÌ’öü¾Ê‚ÉýÙ5Ô¦;GÚÑŽh”í¥²³¹\Þy";|"«Ù�Ê–©�rx‚zËsèP‰HCT×v¨P$…éõly}‡iyhvMŽCù…r)Ý#Ãx®›¿-Ü.(ót%fu»ôÊ€(Û…eÁ•UU–oâ²
- ¥p´ÔqeÑˡ啗¥sòy¸iº X–æk¥`É>£X¯@2Pø¯.
¨2ÍŒ>«n„|‘Ê,/4—£Ôþ}Âò ®ð?Aí¸&ÍJŸ†Åær§+�ðÃÉ��ñCV“]{ŽèìZÍ0�- úùA=–ä
- Fø®$ë+”Óöñ%U¸Z�y¢ÂÞ—Ž°Ù²RÕ
·Bƒº)¿÷¥ŠâwT8úÁ(áaÙûRÁΣ*-Àª—ÆÙs€r5v
êÿ!^tZ:/ÇK,'±ÂêF
9€»=ãÚæGˆ<�§¸CíÑu“"$º-¾î²F÷óS2ç(óÉF
- 0Q©Ü+X�š�ðwÈ,»]=b÷h[qžB‹QI’
þ§ú;)"ÁÅŒšÓ9ÜÒ2ãšô6Ãr?çÓ}lŠVÇ=b¸[˜µ£j¯¢4€Az”ó™Œ÷KÚkQ?TÿÂ[%“É$°K¢Qõ-¯Ñl_@l/ &;ÿ˜Éì°¨ËDrª?P_d£E1ý~ýz—â^Iº~b°÷§ÔrÜè¼e¡uмf¹P•/ÍÕº#ÜEÿ+šS\ìG‡-ØR4¨�« ‘S®óÖS®óVä¿‘;�ÎÈ*`ßG¸é*5'Çäûd™Lº
- ˜¯ÿ~¤ÚÆê à…5¯”FšÒÆhb`
- ½ê�œú³Â4€ý[b$~¿Gç£NÏAX$òÛ÷ß~ô‚}[»‘Wß}åê«_Á‹z×6múÒ&~Oñ%Þæj/árÍ&|_Sˆ�ÆÒyã<ç�-â*LÏ›ø«Û,©·JQ›z»Í¤œð«·£ÙÂÉçÑ|’V|�GVW~öË<mbl»¶©œ�ÇËÆò�B¹&Íö©Ìjš šy¹ì\r=´æñ 'ç®9á¶Häf)šÿ¨¬ÜÇÔ…rÓ w�É!;;vs©ÔB™7Ó€ž¿'òkëå*«úirµ¨ˆ÷Šbþ/¨Kû+Ô”WÄÑR™ìO �ÌÿÅh$!`‹1õ[¥r¾§¦ûŽ(›a\T™R²šòü¸"Pž?]Yã;?ÕÂÑ…ëyKRXâWòOCzó‹£êÔÜ©ÏH�jPnýâ[°¨å¿Š‚;é͇Gó“ËqÎÛZ.ÀA¥ý.*�@/¡)WQHQÕâ«ÙU…L†2^…²$,T=QÞêå�(J~ÉBI¢UP‡J�°ê=êWC@Ûï°‰8&¢~Dõ«ßW¯æäìÓk‰[½š<ÅÕ�}ô.÷"S<#Aë«>Íz ·ýê¨
- àH ¯œ†ó³¨EÉ ¤º²Yîn‘¢çH4ûr7P?99Îæß¡|O-µ·5³Š ²%ã4µ dzêO/4ùL_Pså’TÔ>¿LQ›ÄD(ú˜ÚôùJ8òÿFµÏ+)jCb
- ›MuØ2Xc8$ñt°}œ&<?¸ö9lWÿ¦~½Ò¿Í‘åÛn“å90AÁ=&W=sÇÔ¿À—œ_V‚ýéÓ}¢?køU(�m†øutEÔê*¸
- ÚK%ò
õtñÜÕZñp¶J³Ã ŽB›W�·¾P üA lµž(ZÍL�·zF íýZ²}¤®/‡è¿40”l™V ¬²‹i%L·ÿ^V`‚jpŸPäßËžÝ×5QV—ØVêk¹ÐÅzX8¹ÄÏ^s³�Å£W4U*u´ }ŽLÊã8æFþ ÿ ç~ê3·¿B›"Ió/.·èO
- =7B¹JAÓèô’§�î©¿KÒßQ-¿|—¦’ÕVw|()8¨éC™»¸ŸªÏ%Ê´¥�To×lásù7*ØÂërevðÙ¢üáì’6m«´“Ç– £â�ÖC™T¾ÉpT'Ç‘pL!èjRC4·š¸}aºöSm‰°ú[��%¨4a.ÅÑì²¹},—LŠìõBý¯ð=×:Ý�'©b¹�ë“
dmã¬û}V›š©è‰Y,êtúö;¼ÜÙ9ž¼ÂŠ›ßï� ³:\ôI5ˆ–fDAû©¢™uìIœÉôFºH2 @:2 ß!°Ô�ÌŸjõ-ÐýÉ@ÙµÀGŽûðƒ“ˆ`vKcw¡™I“lar�º%l›¤EsÛ
- ÑêrDe·ƒT¨žib𙦷@³…„d4�¦›•ÇB’DH†¸Tœ. ]‚ÝK¶*þËÕ·sè\m«Fá:�:£”4v»ÏX
†€<¸;‹Ú»r—£þÕð%—ä²Ä6ðaꇷï½ýû¹Ü¥GÍÂàÏÎØùÇùÇѧ¬ í|°â¥g…уÁ‚�†h§�vìqtJ÷JÇÖKÇîÛêH¸^v‰Ž½œ³gpñ§.ÝÖ?뜸ËB¸ÿÞã0¸^q÷8¶|fìS[¼t—ÔåØCx£Ò”œ¹¦þîí׬˜f¯Ð¹
- é^ùFB‡
- žPi©ÐWFpRßU
- ©:̓ D‹Œ}ãÉÍÙ�v“Éïþ�ÛŸúÊ}4ÀÙzú/½ö—F<„�«P莣\‘ÈU¬'c?ÐÒ4›sJ
ä‚Êçjj>§@€«Qr¼-ÚÜÖ¤þÎU_o6ÇÕËq7õP1êŽË¤+ÎÛ¾rc6ªI
- ë\ ê(*v´2¼�4Uc(Aü Ì£9ú3öŒæ]Çz÷Øü»;0'¡=äÛÑ*,e5Õ6ª»VÔa,ÌqhÌ*ôë²P@wȬ°G²¸/ÓOÖj÷|ÌFImÇ #Pzë;J¨wÊŽ}ž < ‘úŸÀzTŽ�út‡ˆ~£`ÂȱGP%;?®5(Þ(u¨”#”ÇÈvÕŠIÈñí#9,?G�ù¡¬b4K]ýQgÔŸ]ÒE[àphʯ§‡ÛG›¡à+` ÜÄĘp ?Å@á>!Ú}"
- ÍÒ½¸Êr=ÔCÀD5ï 62¾¦ZYêèå��?à׳ÖiðËA�¨‹
- T(øEU•Ju³;"}©ØÕº#–ê‹Lˆc¨äÊéÓ—£VäòéÓWþOû›&ÙCIÔ™úÛÇu8*烞QæçaðQ^*z(¨L|JÓ�‡½^Žf©p1¿ûõ„0À4~œ�Cˆ³Ux¨Î*ršV²*�N9Ï€„׳¯Pðú„Å«sñÜp¶ˆœ_LŒ‰ŠŠòÍá3ÙZ"}ˆ&ÓrôO¿|lõêÇ~©ÝÈk¿C¾/Wj><ËüSÅxÔÀåMêbS“¯–—�úg(]½J(Z#Ÿ†x©\$OC6¿8-àf:{êƒS�ҳ蚨oý4:œÓËÜ)Ž¥ËWb¼"uÅiu·hŽŽ~½dãÊéì%û¯¯ÕB�±ûóAM
- sÍâÙWH.gvÿ%ùç4ý–ãvø+¸œ§ð=¿
- ðÕSêG‡Ï‹jWHWÀæçu>…–[ÿB{[çuûɶsÕ;la›z›iñÕÝWßÔ\z½ÆåCðäƒÛÖ|¥ž\f·«Ÿ×�te¿º&ÿ¹ß•+Býk�«è/t�¿
- ÏCM�„ /@SÃ>Tm
- ±G`vú`?þ�ª£ôþÙGÆ(Ù,zb"Õçðe¶¸üAÞ×AÞiàÿ»´š7ÐÓéQ�Á¨R<Æ"i X ¶:¸IÜ‹(a‡V¾öœúã¦Ëç§;4Réù—ó]}—Ïœì^þá«Ï1ÜvîÔµ�þÚù—7œÔÊ=Ùpù|§[Jοœeíµ{)eÜüÝü#Œƒief0ó™KðJâq²"*öF#¬(©¸GjJF�hŒ¸‡Xè#ш·âµ�£ñÝ�kš¾—5EÔR¤PÍ΋ㆠ^p C©eoÿêíe…€:•ç¯{6ÈÛ¬Íï5ÔÍ�s‘ÅÆ™8‹XÏK6×ðV[�ç=çÙ}V+�ÿhͧ×ÀßJŒ›lÑâŒZZ›5ÈßW‘‰±”;®þTýé†e«V-Û@ÚH†êIðÙë¬ÎD<Í™[Ç)Ö�ÍÀßÏÖl^bÃXeòÙNN±„¬"K]£@Œƒ×bŠ©šË?.æH÷H
- gzXaÆðÐÙ’Aîˆ}MO¦eýXÂüH§N�r ÐóÚŸW¨;ñhtñ»gttOöyu3=–Âü*פîÌåØ¿ C ÂFGsh9JîͽZ°-”k‚’]L-Õ~hÎii¡.ê49ÍQr5¦ñ½I,VÝ“ÿ…^jf”»_}Ô,“í¬Q6?Ì5åÿNVçÁÏÕ
- ÞžË�ªYÙœN›å%ezËÜqƨï>ÁZè
“NtñŠÓ1š �aÕ%þž=è yÏhÞ™««
H¸Á—ËJ�Zöš?ý h½vrœkÊÁ@åmÍY`®^insðêF\”*ö|Lœz!/?·)(“0Éâ
- MS4(šÈ—hðØ{²º™’æñ-î'×hŽæ‰ëoê7ûcCÒžÊ?‹6²âñ’²'|ubˆÕ£@´þ�Ì!³býÙ¡¡ü»Ðf{tzø…1UÒA?=Œ@œáá t%˜ä•‰ÀÌå�iuš“[
NòÈiáD±ˆGÝT@Š:Ïp<ü(õcÓXéÉÆUm�2Úϱ7z›ÚOòíM^öFÏ´YUfwGsüÁ“#‘t:Â/‰ªƒ•¶Îå~±OsÞ]µÇF×ÿÏçÝ‘¯ž(úü(^È‹Á±?Lû�$ÀSʽ…WzT>mì'_§‚údŒ®ÐÔç:¥Ä�5®Lh;¯H7ÜWgzêgÄZÆÆZb3ê{2d5�Jj¦Ä9Þc+ãù‘\vqzç²DbÙÎôb ©Æ¶�g ù"l@צ�pæQB½b�ýÛS Qí>€“+d �p²¾î%}¯L!“�™ƒ‡òçšcdwHo˜¸Ææ×p€x(Tì¾pÄèxî¿ßp#ê�:dvQ
qŸdAðQFdÜL³¦K¤mÒPRËí
¤pU?òlÃëÖ
¯ûzg°-ª‰¶…ÔjPÙî©b·ùG×aRõ¿ú&^qÅàä>uÓ8¤•p&ÃӮф
¤`íMGSŸ®¡®óÙܵao°ñã¡ÜWÜ›Z´aâÌٟݰ·V5ŸÊR¿s2NX ÛqGB ¾O “ÊKÒgéôðÀÀBWþý)Sg\õÙùêžÓ¡läË÷ö]zöÀ<ß²o-_þå-ø±›ÆA£ŸKMqÓ!´Ã¦Sigyñüý¿ÄÛ°]Kû;SêÆT'�ã©ókPqÉæeêÆe›7cZT{~*‡7‹bê\H…?ðjÙµl3•�P
œïоwïT2²ðjŠY;Ö�)ºl
DËueytOTøï�Újö¡üñU¶Hí¨úœXögɬ,õ�W´ÉÏ¢^ŽÚÂu¶¡![]Øv”Fèç”|
- ã®QGá¬h`(¨# ƒR¼'5X©D§ÌQ ÊqMË6gûc'býúu³:'—ôÿ™®H(„?¸yÕµ¥ú¶Ë6£~.òe¨¬[n ¸ªŠÿ*€±U«yZsÃt 9ï‹›¸R!GÙý��·©�ù“MM$ÚxŽz€¬$]êÓ{ÐÃL<ü}ù�ç4ÞÆàJZÕõê~ÒMVŒÕ•hy× >@u�»Êí
šå…î�+³¿Æèôõ]áß2FqO8jü–Ñ¥°WCÿ»Qqíˤërw®‹.Êì�ä„«¾Þ¥\õš_´úü§ãôöyš¶\O¿nÔ)IÍKGR§êHÅ�q”¸ÜIÚÑÅ.
- d+u@Ï´õÓ ê¾k–ÙŤ}9¥êT«v6ö*x¤g¶e7?—™Ã¬Ô}õS§éÕ-ð íAUÛü‚íOMlJ
ÕpÛíժݧüîÕŸYw–Õéhœi6û\fAöZc,·rjFœTå‚ÐMj8kOë«51‹þT»¼ýqW½_ÙnéØ`•7®%³K«èÜéWÜs–d0š‚á:»Ñ`´¶OX•ÞùÒs$ã4¼?:ÿSI1¢�¢W-¾Pr}ê²£Š§9õ.Ôû& Pš™^f
- ³8(ºW¡I¢ÃÛ`¬¢`@5a}ˆzµêiþV ¾p„²PÔ½+:–£d\jÃ"=üa€j£Šðä)W§Ô$qö{ÇÚÖÍœ×p)—Vüõ®|£7hj�¬ŽÍöâ—³õ»¥Éâ$·Lëè˜Ö¡Ê9›\öúŽÚ�n[ ±¤k{lG‹‰Ä.m„m~ÇT—ÀºE‹�Ûù¡Ñb�ȶm¹`
- »—wònyæP&—:P¯LJØí–YŽúéÀŒÕ_îp™NW¨‰ž›zVÛìS׃]7ÖÕEÚd“%i¸ç™¬|ñ¾úèÙÌEÔWMÁ“™7râ
ÀÞHB¨´Ë6þ`UG¹ZˆæÎ�
ø9 N2l2ÝÛÉ…HY˜½(šÅ—ÒÔÙiwœ½Ý“[ýÞ`ªcZ¨–R;Yz=TrÒvH�þ9ëc.¡Ö²êGäŠÒº6»*pÕüÎ…�'»[â‹:ú/˜ÒªXØ¥œ´CYÑ…Mñ˜ÖtÌÐ-'º]£n,{@üðcø˜Ob¸þæþÂIÑN‡.”xÁN�¹F9ëÊë›�NÿKóß[º£ÞXÓr=ÛôéWÎmó�°Ý�°Æ¦ØY+�¾Ê?sýJõ¢Ä×gÌXµuËPý¹¯%È—V^¿Ûéè[ù‹ ··ô„ÔWˆ ¯;éúWæ
³xv±iÈ/‡×XS3±åȼ”2¬¤÷Ô©Z¾<Fޝ=0Vó[%•R~ËŒÏx—ÓäyÑsÃÕy?§Î˜(O†q_”V-ÎøaQñ*Q1 ‹t$ŒjÔD„pRR~‡zÇ¢ìðp–"ð]Ÿgw�óÕ=¸%GV³§ÔßïŸrtøõ¾�>ÁÛf×2�Ôå/yòÉÏ?ñí»ä8ð®M@ÓQÔÎ*Ë„ÂýÈö¡¡íCäXù�k¢÷²?MzT�y?±àÕZËÃYu׳)ÿãé]Í•ßô1–-ã—þa�ÿ7jô‚~”ÍÄá
- .dãÄá
- »
–Ä'Ó·½¸š§º“VÔøz£tXKþÙ2k̹d?¢§z‚§úz¥´ÙKŒ.º>,¡¸BZ¦¿`q„—'ºk–Hèqy¢û°æ¤5¯¾j>aÇÅÅ\CÙÕ#ÊçH;#pÇø½Ð7lº4¿}”ÖIR¸7Œ„°ÞŠ0§ûœð$âì=«VÁ¿úÑö‘í#ì¸ä_.Ñvª…sð{g><cÆáÃê˹_«£ÅÐO¨ÚÝgxôçñ5&Ç?ÀÝÊÌ ';zº„ÇaÎæaØ:zÓ‘ èQìFꉢ‘®^éÂMFÑ�°³ÿ9Ûç&£A¨•�„·ÕEbŸû†Ù½\±|ã3ÝgE}"+Ê>ƒÁh!îÚA·b¹/p7¼Ðî™=Üz—Á©¾mi”%—ÍŸš3)^Ošj¼<_ãU�¶NY63dsIr£™´8E—jñ¬ßý®Uð´„*Ï
33Ï|v¾ãè;ÔÛOÆéB@ñ�ù,—ü,ŸÑ\cwd}6k.žuØkÌF9þ±'Ìä�2Ð6D]e±‘xÜG¾J³K.×½}†ñS«†$ƒ@t"š;2�É©�ê¹*¤Ž”ŒÛ4§Ü1_ƒäxõ7³ÕQ§bj´Xˆ£§ß9›„§ÚQõ½;®#Ï�{9†Ôe¼I
- š-ìå¥�br B<ÞÖ9òdpzœÜIVªûóÿQ:l„+ëséiÕ#=ÑìT¬ð¬�+R˜Ñ(ªâMÞDC$â
- ¹Êaç̱ êONgÄj1ž9˜¶›ÍÄÜgqXkè„}F«Åèðùd¢¤×ÖÒc¶ŠG“,µæå&—Ó.Øâ˜.^É·wwc�ƒ>ÀE´_]3ûžUˆ±|ãt{JÕfªçª‚u_ù.º\�ÿºþ*êö²W•=ÌÅ}ÔlNçÕ�o+^®ïßVÌ£îé‘ vØP£>~†‚s¢¦T¶jWz~_¶¤o‡gSÐ}-üDñTd‚Ý-TÀAaÈêYfµ²˜Ç3,PATcm²Ú
Õ¼4gã¸}‚½•màE$BŽ„w¢�Ū8Ü>«¬9�–ä‘ì¸JWâ�©°O¥õ/9ÿPªJCÉXA{,™@c,tEJ¯ËTÈj½¾9ì�•8QÊñ•Óõ&¨ äHŸ þPÁl~K%Æžù1€¾Ñ»¹
ü-èeÈDzxN�›»Xuz�’Ý.9½ä}‰MÂc�&œ:¯ê”Z5¿ãÓ™8·ø%ÕµÕ½øm³˜¼ïomõCBö:ÐäÖá‡l´ï˜8™ÎßÄí¤~óËܦ¢E²¿j•T§ßÁí¤YH˜Yá»vønƒV^IN]]ÂŽåCXkg#ÅscÀSûˆB’$‰Ã�=’$�ªkø}cG¹&ö÷/¨ßzç»ß}çä¿çÊÆµ_îÑv6<�7¸½ý´IVGG™�úg*lôŸ\RXS²T‹‹®)ÙšEî¤Ê%Y uôóÁ~Q~>X¤¸ˆÏÐ…±Ö`9ÓW‚“k*‡@_ÕŠpM¸]0¦*ƒ�%ãaÀ“3XíŒ�K¹Mü|ô{†£FÔ”»ƒú‘
- ì·¾d7[Õnò¦Õlÿ’ͬÆD‘üÜÌÏ÷@¤Úmõ˜ÈÏñ8‹Ÿ›°e ¯cżô#�gH›ÐÄdd@~.ŠjÌlÃlÉ›�äeRcxîEÌä�(( Íí™K�ž™Ïm¼êïGëX”A7¾×Sõ·µ@[lÚ×.%ÈëæÕ£nMDsˆ]n€_Qî·• Ú5Ài?zûÔGüTèG3²¦T�@e èi´�×,ˆƒ°r¸�
- O2<°Ðè•éÒl+³À°/,Á–%‰¹m²à ¼ÓÛšXØn›|–Eš›¶÷]˜Žˆ¢l�ÙôœžÆÏ[m<’|#¹z×+„5ˆ¢ 7&\5Sô-˜{þüAEß×^Ù¸ì¬t“KäÂËÎßçMñ©^rq]‚îFmÞC%2þ„vJÒð)W-Î}OM"`Õ9l²+ì=…%"«çë£óTò˜'8ÂzH3QÒ�ßûÑ©ùYìP~V¶‘زèNiì¼ÍÜ7ŽÕðÄÛ›¿ ëÎþ?w1ê×�xÚc`d```dòÍ?ÌÏoó•AžeP„áBYñtý?ðÿÖ;¬"@.H�cèxÚc`d``ùß
- &ÿ]a½Ã�A‹Š�_xÚ}S½JAžÕS<‘`ŒÚÙ‹«‹€Úù�Âb)6âˆ�>@DÈÄ"èX\o“ !‡Žßìι{Çé,_¾Ùoçgg“˜gÚ ˜¹#J†VYp>uC4Ó&*Ù<=$Œìð¾g9ÓW@.0Ÿ¢qêò‡ú- õñüêñÛ;Æ:pt"H�Uåeèܾ5äÕçüVg(÷[Aãx9ÏÝ!ÖÞ´÷EMŸ�êß—ï4þN†&Óž×ðwj³tþ™³ÔžeσèLpŒ>†w‘ï†õ>GàÙpfz`Í|´Þâü^ªaÙżø>äŒÇð¶)Ço©o¥²‚MÜg+RŠm¹RqÑí,÷«‹RJ¹à1—ÔÕX‰TªäN7t‹{I–E—\îFÿë8ãU
ºÉÌmbÍù:f—N±&’ýj9ÌY�xÚc``ЂÂM/^0úá�K˜Ø˜”˜ê˜Ú˜Ö0=avcÎcîa>ÂÂÁbĒIJˆåkë.¶"¶/ì
- ìIì§8ä8’8öqšq¶pnã¼Ç¥ÁåÃ5…ë·w÷)ž^-Þ8Þ
||||[ø5ø—ñ?˜ °JPK°Lp›—�…P�Ða)áá"Z"WDmDWˆžc3KÛ öO<H|™“„žD–Ä4‰
$þIjHfHN‘<"yKò�”™T†Ô©oÒqÒ[dŒd¦È<’•‘u‘Í‘�"»Gö™œž\™Üù$ùK
- n
- û�Ëw(9(MSڡ̧¬¤l¡\¥|Hù�
- “Š�JœÊ4•Gª&ª ª{ÔDÔêÔž©¨ïQÿ¡a¢Q ±Fs�æ-5-/m.í*��]:otet;t¿èiè¥é-Ò»¡Ï§ï¦_§¿Iÿ‡��A‹Á%C!ÃÃu†/ŒTŒâŒfÝ3V2¶3Î0Þf"a’`²Âä’©Žé<Ófvf5fwÌ¥ÌýÌ'™_±°p²h³8aÉeéeÙayÆJÆ*Çj–Õ=ëÖwl$llÙü°5²}cge×cwÅ^Ã>Ï~•ý/‡‡cŽLŽuNN+œÞ9K8;9—9/p>å"à’à²Îå›k”ë676··-nßÜÍÜËÜ·¹óó0òðóÈòhó8ã)äiáçÙâ¹Ê‹ÉKÏ+�Ÿsª9�����§�������������@�.����xÚ’½NAÇÿw ‘h‘„Âê
- /‡"‚TÆDñ#J$Š–ròqr|è!'‰Oá3ØØXøFÁÞ§°0þwY� …1Þfg;73;3»�Âx†ñE0C€q=ç®Ëæq£XÇ4î°‹GÅA$ñ©x×ZBñ8Úƒâ DµwÅ!ò‡âIÌéaÅSä¸âùXñ¢úw¯°ôÛ.¿0«?ù¾o–ÝN³âØ�ºgÚ�ÖÑ@\ÂA´`àžsbˆ“
- ük`§¨sÝ¡}›,ì«0©YƒËaDðä®ÈµÈµMyFËMváYd°ÅS÷±‡í2Œå¢Äé0~™>´/ãŠqJŒžG
- iòô<ýÒ#cýŒ´0ë·C~G²�ÿ²ƒ9eeKv«¯Ð²[Ú·{&V(Ó¨1j•1…M‰Zqr�7±,gKÜ¥þXåè›õå0éíò–›ÌÛQY{Ô
- ªý›MžY˜¹Ð¶z=ÉË×a°:[jEÝ¢Ÿ ¬²BZìZÿ=nôüs¸`Í+oÍýÔÌ����xÚmÕU”SgFá샧BÝ]óýÉ9Iê$uw÷-J;m©»»Pwwwwwwww˜lîšµ²Þ•‹³ó]<3)e¥®×¿7—Ré^�üÎèVêVê_@÷Ò$zГ^ô¦ÓЗ~ôg�Ä`†0mé[¦czf`(3233³2³3s2s3ó2ó³�²³‹²‹³e‚D…*95ê4X’¥XšeX–åXž†1œ4i±+²+³
- «²«³k²k³ë²ë³²³ ›²›³[²[³
Û²Û3’QŒfvd;1–qŒgg&°»ÒÉnìÎLdOöboöa_öcà@â`áPãpŽàHŽâhŽáXŽãxNàDNâdNa§r§sgrgsçrçsrs —r—sWrWs
×r×s7r7s·r·swrws÷r÷ó�òó�ò�óOòOóÏòÏó/ò/ó
- ¯ò¯óoòoóïòïóòó ŸòŸó_ò_ó
ßòßó?ò?ó¿ò¿óòóÿf¥Œ,˺eݳYϬWÖ;ë“M“õÍúeý³ÙÀlP68Òs䘉ãGE{R¯Î±£ËåŽò”MåòÔ
7¹·êænáÖܺÛp;Ú›ZíÍ[Ý›�Ƶ?ѵ•Öµykx×~yÑj?\3V+wEš×ô¸¦Ç5=ªéQM�jzTÓ£šå(»vÂN؉ªk/ì…½°ö’½d/ÙKö’½d/ÙKö’½d¯b¯b¯b¯b¯b¯b¯b¯b¯b¯b¯j¯j¯j¯j¯j¯j¯j¯j¯j¯j/·—ÛËíåör{¹½Ü^n/·—Û+ìv
- ;…�ÂNa§°SØ)ìÔìÔ¼«f¯f¯f¯f¯f¯f¯f¯f¯n¯n¯n¯n¯n¯n¯n¯n¯n¯n¯a¯a¯a¯a¯a¯a¯a¯Ñî…îC÷¡ûhÿQNÞÜ-Ü©ÏÕÝö¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôú݇îC÷¡ûÐ}è>tºÝ‡îC÷¡ûÐ}öôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôú�©îvíNjÿHMÞp“[q«nî®Ïë?é?é?é?é?é?é?é>é>é=é<é<é<é<é<é:é:é:é:é:é:é:U¦>ï÷ë:é:é:é:é:é:é:é:ù=é;é;é;é;é;é;é;é;é;é;é;é;µ}·êVÏÎhåS¦èèø·ªÙo����TPÃ��ŸN��AM���������������������LP����������������������',������������������(�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s����R�e�g�u�l�a�r���x�V�e�r�s�i�o�n� �1�.�0�0�9�;�P�S� �0�0�1�.�0�0�9�;�h�o�t�c�o�n�v� �1�.�0�.�7�0�;�m�a�k�e�o�t�f�.�l�i�b�2�.�5�.�5�8�3�2�9���8�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s� �R�e�g�u�l�a�r�����BSGP�����������������©Ü�M�M�FîÍéŒÏÒÙ£(uÊŒ<0DãB/X
ïNïˆ�CCê^ÇrmR2skÉËPJ"5+–gléW*iÕW–/EÓ4#¬Ô£U¦~²f‰‘UDÜĹ÷ˆ«±àJ·1á/!þþ/žºÊsª7’“kŠ•”(ºˆ¡hNøé8o�íd$yq޹1³âÖ9ƒ@-‰‚HG’ôµS"øFjôØ 6C3”¤&ž‡ÁøªW51ÁÓÜ×BŸ¯aËêQaR†U/õ¶{*¿‚Ëï�‚=–@dôøh$¡1ÉTÛ—nc+c’ÞA¡§¼ •ZÉ€¤@QÑca‡ÕÞl÷�2>ÊK°Èmó' “ËC‡HMĬfB‰X�,¾YòÂp¨e¢�
- î�¸UøØ*Ò”zÿ
- m‚ËËiO1nEÆ.›„ä
hx!aC
- XTÚV¢Å©Â‹–—éR¥š%¥|Iä Hð�ÅÕPƒ5"Åb’N²µ=âøƒrÙ/_åRŒ›”™_à%Ò„�uzÉéÒ˜Ö5’2Ä¡ÒãPÚ)žÔþžÆÃFƒ7S‹q„FÀ{náia�·¸@DÐsˆ;š}9⬥?ź‘§ÂR{¦Tkí;޵ǜ×U\NžZø›Q-»^Ôs�7òf0˜ÊÆS3AÜ
_n��`W7Pp˜»ôài«í³!ðgØ/à_p»ÁÒZ€-=Ã×¥~WZ#/á4 KF�`´ »ŒzßÒ0Û| D‚ѵ�ì�‚&däI‰´ŽüÃ�Á;·Mì”{'¶om†”m¢I!wi9|H:§Û§À»ç÷Êþ¾{û~ö¹ýqº¸©Oøåôî© ú›,˜ ‚L]&„J0ñ•Ù9/í9&ÌYøè“°{;÷ú'À3`’e�@vH„yDZ$º�„3�ˈDx28ƒW€ Cx5xw‚B`£$C$'ãÊEl…y Õh¿ëÔ€
DJ
- $(p�½îQA”A܉A–@'Ç$
hpÊ0ÎV0 `�ºs¾ªeÒ$É4$"t2=f´˜4„A„{Tk–0|rH¤öÄУï`L&±´sÔh¦]”§A<£¡‹²`R´'£•!ƒ‹�1N¦;£_Št3Û# âòëúØêVãê*veÑF`E O$Ž{)ÙW=p:®ÞÖF`о2ÆÄ2Ú“CëÁŒÒ^×.Êć˜¡ø–øGþ<<?¢éç~zк¢©å¥>û.pçNe2ê‹ïÖ´ºÞ+YìsÛl:ÂÃ˼ïµÜ«u5©¦ÞîÐtÀu•^8¾Ì6èóÈ„TmyðQÉ%þu~ôòš%~1rÒ˜aýwßš^�ù_©Z£�Z�a¢ƒ²0!Ùè�¡·úNö`¥.Ž
uqÀ±çêYB¥\™¨ó…„ÊᨀÔê…[eð‹îîþ:@ êJ'EÛ�,¯3ubj@�p¨ÁÆäð´f¨Éßóîµ·eW9( óºå ´Þ…‰³æ=‹l”G¦à7gj âSƒM6ư ô0ƒÿ9ò§–OË‘¨�üí�l§®B¼aªÝ�ò¯ ƒ<¦çžÇBÕ™(VRAp¡fù^°ú¯+g9 qÓݹ�ŠMÆt]»Øª�pëE�•r@]‡@ó©V�ŸkV¥
- uêädé^ÑX �å–—R@?EÕöY2ô¨˜Éï]#àǼš4ÀJÞåKöÁäÖ'ÃÁ¾d²âPC|mãmånä#¾‚$+48u'…�çe&û¿€[n[LáÈù’ž±%{BCDÚL:^! ‹‚ÓbÆ™:&Éÿˆî‚g3“-3Ðøu´èÇæÐð¹ƒb
iLZéÚ‚W‚FSÉäIdÍñ¡6.‘k5Pî„l7ž7üUz’T:NýN¡‘—.ý"€ªåü)‰Å—ì’['ß|U"Aƒ€³—‚I•�Ûv©wÐÛØpë™ít¹dk‚ˆž9Ø›Šå««Í9�n¨D‹mq¹—7I|6›Kbcƒ]¶Mô“©²ÄÎ÷—è¶B�A�€BøÈª�_ôJºTÙüq Ð 6@—§„¸F�—‡ƒžhd`G®�Tëñ·:MÅ7'à…L,éIh—ÆFP »Ê~j�½ŠŒíĬ$¡„ Ä3™hAÝä��’-SŒ^ûÚ†�…Ðä-%qeÏìë~ÀÆQq«§¬ln"i¾ž&�‘æÑQe?FlKï¨"úAsÀ(Ý3Y;"¡LžÚÔe€tå'ÄRz<MW!¬ßSŠ3$rZ:ˆ’b¥-^Ç„/ƒ$Qý·qõJB'WdáGAO³¨Êã`.Í( ßž±o¤3öB0øÌÊÉ‘ø1å Ìp(®Äí(*–oõ^ÉǪk“†J`vñŒâ±[‘‹¡C|9œ=ðÙåé#„œAöÂQ˜‰ã# ¢òÉ7;.]L:î¿Äϸc®ç€ÐdŸÂêi€ˆEsr¯¡�âó6?æ}¯†eÇ@H-š�b»…ÑÆ–C¶1;®”™è.
�v.±É¾$`T‘ùöÂüù JW¼ÄÜÙ%BËZ¯I04ÄÙøÆ^:kU,èöC‰^êWVF©ÿ¥Ú`£F¬b‘¾(ñOÙÊO©È2<Åß@ÔX™u‘��ðg~ÖÉ‘ÎW št‘&1\ô1§LŒ:φ�„"‡!‘P¶Æ¢Ãè3/ØþÔ^¤øÇ°�q�ˆw`IA¼äD
- ˜)°q£CÐfâ€ÑO“× ±é0õ2Y29®3N°‰fãpà„¨‰é\�˜CÐÃÆahö÷&°6åpË`âÚ�z³g‚B
- hRf�ž];]Ì#pw_t(›pqê¿�Ù·,ÏÎíbdk‹R‰ÕBŽËèÚT?Ùì2¡Œ—À2¯cåF„y2˜™%¬ÍÏCÏnÁ9 ÐŒ…0›ñÜ÷9E&#×l’T__ÀSлg¶)eh/Ú·+÷#:FGot÷k5Gbr;CbË´Ü:ÄÊÒ#½¼Éœ &�Õã�QC ñwÿ’…™mxlN‡«qˆª€éPÇ´)�Í�3f-v5K‰¸¨hý·0A×›¢§Ðj»nSp¬ ÿœ^HªÐG·FŠÀfÝ�¾ó‚HŽ "%[Ñ»‰ßÍ @�Ûèp ÉaÁ¦Î±�ì$$�œÍ‚Å*âÂ_Ü\Àï@>Mœª10¨{=æ�÷)ž€³K %�$C
- Âø‘9ŠMðö¼ë¼4c ê€EotjÍÂV§GDŽ)lñ8“¯,˜\wÀ¥à!�%$¿×3tÉ TBz’žÒ´ iUJÒÝ[¢Çxgd„Brï$Å!eqˆ�’"J>࣠)\�~¡‚Љ3�(^
â R€8#>Öb›äH€âG'7_fÓ«cκtD�oAA߃†(q™B<ý`Ç`VˆüøéΫ”©Ö˜Â*úbÞÏu‹P4v@—+•Ê.�’îQåÔ¥$V‚¡•í@C0
- íR¢ÓÜ�P[‘z:X¦H#eäÁòs >?úEÈWO>@IØ$|s¬žiâ
- ES¥²)0AŒ?£9•ab,¶�@KšñÌ©o&îþüˆ¬Q´%¬ÏžLu+›
- Â+�H|ÌÆ�?´NKÌ4ŒÆ’ÓCnPtè³
'OTòœÒ.j5àÄ´8ÈÜv¶wÖœ�«I¥&•+ß`¼ŠyS��caO[#¡g°§Q§œ€¸Údª[îK½I矗`ôÄŒLPýÓ¸ #°Áœ½ ©)2Ò7aTƒäëi@c\Þ�‘îÂâÈ0nêC»pòß–é�‹4͵Ž�xö*ñËÐR”zÕYâ„b‡ÀúÛT[\úkU™vìHʈÜq’p঄IÂíIëÅ—)‹bB
X”PºN´…štzí 2
Iæ==¤ ¦³ˆý¨Ã;}†bŠœàqþÓjiÞ†§a²#" ¬Ÿ>1¼‚�°1äA›£p1ÖíÝP‚§OÇèO—ux÷Qôù°¹Î
- Fϲ(úhÝ„©O'MDxÊLíK$ȵœhæ&
ù‹¦Ð�1ŒïÄ4››Si ÜãrHJ’P°t�DMË;rMã‚+”ö—
- *–àŸíØ—5u2$ªf3’K ß<ùP²LçrÑc‹I)�˜Öå^ëda>
- %Åàѳb(Ÿú–@,‘2f,~"¦7ÛR;®EÑŽ;¬”HXå(ú¹Ÿ4Š2ZäÝ'�TªÛ¿ö‹�„”½2J+ÿ^!#oŽ„›”Y~4Ø-׃òGW*ð!ßÃA•0&8€fä{`¼½øàWö=’DP8’'ÿ= ÖR¦ g©}ôiP>“Ê#¹Ëå¹4ÃÒEÐBRY®Æ^4eó�ý‚§N8¸�V,[B‹†Ä¨îD#�X†ø]²,Öèâ«LBsNC>
+¢íoÍê^x¨ì§
- ÷•�újCì.4ÀYa‰_{e¦A2=rŽðØ+�‰´Öî§¡9PO»A!!
- ×}´YÊPJe„—çGnš±%xü�1¬/}RgHØšaŽ^3-Š© ‹5
- ¶|‹qS§ÐðaWK{1al`IÀ1Ó™ÆQé¾ëf_yyCZ)ÄL3X±]W6@DM™Tø<.„«uëGÎKŒì8ÙDsôÚбWæ‘r…Ý\ß7Z\ÕËÿòVÓ"I¦¢ŒõS¡§®dµ‰>CަÈU�j�ßÉežÉÈÓD ®3MÇtWcP﯆–òÓ‰6#3Qךnቩ…°J\º¡Ã7ž#磱`Ø€Këë¤ ©×lV6&ÓTŽ’ Þ~îÚl.’�¾¡ <˜˜BP
- £*´!zRZÄäeÑ™»¾¾Ù·T±#£CéLH±¬ÈªWÅ)ÚD›†÷“p®YU#ÉÊ51{WJ€Ž¤4^Äf³Ì¼Z°öÌÑy6–Ó‘T2™dÎ4H=êB„Ҋɬ}œ&݃êÂ,aPçv+:2æ~òÁ*0¼°¢ˆd¦É“ÂõÖƒd ‚øáË!"A+‰r��Hn¡ÇàsAäÁÈÚ—U
€ýø¤b H“ÛN6þ$.ÐlÀ};½@£¡âiKà \¬Ò‚:v‰QEÇ�:,|ýªQ Y0|Ç%Ö@í° Ü�äqcçÓÑdqh¯«è«¹vÜCÍGV†°©¸¯-(шm…’1»®âq89KF–Öä
- "2±ò}RrzóŽ,j^¥ÀqË\…Ý–#pƒ»+õ`flš³½�â:k´t–5E„OaIÃJ¬P
@psE™j1ä4;6öô/aHÎ.¼ÏÓ°T�X¤p“L‹¸ÄL8¤½Fç„Üši¨lí1–²YØŠ8É
%�!/Áù{¨ÒÅñ 霋ÙåÆXœ€ºbˆ•½…�NÉÂxp»ºäPWê½ÛíèÄcI9g²*þº¿î�ƒ¹œ%:Ö»LËÞuŠ‚CAOÂŒ™%¬/Å“´(Y¢³^ï? Þã�&I'ˆÈuh[x‹´–Qô$ÇzҵŽø‚ ß³ž�‚(=V×€Ÿê
¾mðÅU)»ílÎ Î’¾Ìiœ•d㦈™¨½~f¦ùjGíµÖR{D€%>®¥�@”…”6‚¥¤1‚œ`Æ!Î ` ņ¶wYó§‰Õà�k/a�0A†«Â¹ŸÔ�´ÊYh²¯—µòˆdìæxš‘k:fšƒÿ漣<ÕØÙWL4�`8IYMBÁSlcäÖßÈà™-»EÒ‚'ÎÚŒÅ:,ÿD¬°�çÑÙøÆ©84Ó)~÷ÿ2·j€Ÿ–Ç i¶·B(Lãµ|"a©š¦¯4,¦b8§”¥Ô“i 94¦åÔŒÒjWщ°©6*�ÐTð£†c4gŠÌ“¢×UMÉb³RÇE�²þª‹ò…C5‘Æ)jäÈ´ ‘1�6pbÃëÛÆŽH÷§ªFxòˆñ¹¿—¯«Ä£�%4âòQÙÄC‰Êˆ§Å $9Ò:ÅM>òEÖÝaÜÆo«�ÌŸ^ÂØ<IwÞ�Ygq�7s[†ð’ð -yÐ1ع5†äaÄãMKš×�æRBÇY€†óFq}¹âç±ô8ïÀ²*ÈNtå�'.Yb„”›¤ÍðZÍûvÅK
- (Ê]&ÉœŠ( Õ™¥ý2¯:0Õ
€äo¤Î�Ñ…PKiBH4Uð¹X,Ž¢�[ˆð$
- 0mX±å»Ø´�‚ ò¥fë5ð0± VR
©8ê%ÙÑñÊÞ§§Dt°ÃUŒ‘s`ô·-BP�ÈzôP”së°Á¦vIë¶8z-¥t1DiB
- ÒÝ"˶ÜÈYTJ ƒÄ.š?Ô0Ç7à€jL¢ÃNžú[2ÿtÈÂĮ̎†�æ�ù#þ6?E×»†”Œ×¡®ˆ:ÉžÎY;ƒç¬A&q…êSØIRÈ)Éss
- 9*xÒß0Bj)mìáH§A¾öhyÐ�hòMm¤&4ÅŠ…4€€‡ÜÚg¸ŸVæ&tYóÚ¦ÏOCS0³Y²ô‚d7Mv�Nïj)wë÷AÉ(¬âo
"Í¢É[¦Ö
- E`›”þŠë7ez¸Ä�†�»Þ-·QÀ]¦6Û+BcaÍ@^IÂ:²Ò»´Þþ¾=ƒ—šˆsSŸäÏncÇùÓ 6
‚ÍçOã¡B„4½ˆŸç L¥¨ÀGpãB‰q/<•zAãÓCÁ¥» €ÔA~¹ÉxÐ06rih£Íh¤IìØ·O‚N,:oÇÁkìçÚöÅ/ó¸{H°,ÛzЂgÚfÈ»z—¯Ó΀5ý�Fõ²TrÀn/ät``l†Á™*H6jT¡tG/xøË@P@(„ÄIèp
Òeº!ùê`wv,:A쑜¹N£ 4}09zÇqC�ìä$r�ìüM`Y†Q”’ øMää•«³÷Ä(|éB!í>¢ÁØ>«O pwj A*@›�ªŸJäC[h&3�üëB QbýÏ©8…:ñ“%f~�v/‹lâSäÐèÒ0ÝèþÐð0a“·¶"<TX§@Ç&°ôà°Jg€
3Ï•ì¤éHFÕÐoï–éI8«¡{þ¸:YTèób(ˆ°Pëjþ<za{¸…wX¥oa•04 ž3ƒÌlÊøGȶN’à0>ŽBæ8(f úuGoÇšÈgyñÅ×t£_Ãy~ÀÍ”Ž
- Ã%ä…°ûm�†L
- èà!I$äX<T+Ê3œdqó
- DöMåÔtÌõ2|fEV([â]‘Ndb�œD3Sp'RŸG¬m—K¢›<œT�äÙ°�}½5iÜ·µÊ¹—àÌp¸ˆ«¿#Ä&jF
ôZµ'”®’2ï%y9¡Q#2ñH]w¬Aˆ}Ævf§âØÐ¶è%ú³éòöX¡Óš·ì)”X_ S0åt£(±¤“-Ôî€â°“jHpÔ÷Ó–vœï/—Îô詵 ,9®w<`øE“ˆ
- íìF°agAÐÙ“ Љt©´)lœe
- ›øÌ;é¶ö$9ºŸ×ñ{æCù¨‰�œú()ªÇ?¯ñžÃpƒ¿¼IFã’ø¬‡‹¬¦—žb3”Òñl[):˜drr]Ÿ?†ŸÕ–˜ö?¸ÉBdÀiå¶DÕåÖÅõñ7ýühJ¤Ñ:
- ½ÀU%næ3aƬJ.Ì>t0ƒÏ€~ÀeŒPˆzËÍ]¢Uìg
Ð�=_±?ñºµº.j#+`li‘¡ BŠñâM5›Ò º¿Å‘GÒpŒž7«a
- †Ö’�%Y[UG9æ™òÆÓ@\bDêÐY…’{‰�{¤ðED0®—
- Ö$� Qø+FvCð`ݨì3°ýQ¥ “î±E\àÐuC9ÍáÃ![€$êlïßõšú�êù6ßD¨oÙDgÀGˆ*+�X!¸�%#‚C€q‘?é8ZUB)U@o¢ÏpgÞ©¶ZØq…¡¡É8ŽÊ9øžÇ|ucácAÑœ¶é°•W;©@á" €Ø>P‚Óïåh_™�Ç9}.6€„�V/ÇO:à3´}Ž¡ZS±µœ{:ØÚ~’óþœÅyŠk¦cO6;OÎBá=—bVñ. R¿k‹
- oñ¤ÿ^±GV=áØ }ïoI"+
ô
- ]w‡�×FªÁzÏ·ä®ö`<“Éõ²30�ûh÷ŒÅ3]êRfú—¿859s¼`K…M€¤8ñË
- X»Uqˆ<‰˜¥\˜“ÆZOàssè¿M’·&j&Ï
ÄÖ÷ .§%Ÿ ÒPÊBL~^äßÿùGˆËˆ‘3páD‡¬•:í¸×£Z¿£Á¹¨©<\ñ«Ç i¯¨ÛW̆¨ÈÂ"(”ƒ:áÅâz‹©–X–~ê�Î0PG]8�ª¬ƒŒˆRQMNT�¦qfÝW~!Ý0”R%Õ‘�0ðxvGFy/Fø-›Ïwúu‚/ôî*ë+’Æ \õÂ8@ˆ6¢«Âþ©´‹»c<´àLƒ;c�[šû÷ŠÛÙºnr ŸQS'o£QuòT®{qÒ��_œÍ¿�ƒƒSdª»A*ð:mò8Yuz2ÿPB«
ìHh`l´k’pèÿLLh
- cEb6eÛ��Ò‹ ?!„™>|*=V�ü»Kî@žë“rx‘0ÓG`%ryr[6êŠY3Œ7ŒÅ‡f*—*n•à%9™ÚdfÃè1ó1Þ¢Ú�^'Ìý]‰š–
RÍßèq�ÜÔ.Øê÷�,œö•‰Ó^%„¯lÂÚâ
ã½eØØ#wWÂÑsó56!Ù=âå!q[ö°ÄØÃ�%ÈÔ®]ó‹5^:€½m¨5©)?�Vb|šuÀ7f“ºìw°œæÄð,:çYeæ†R%”
- ò[À›�î
Éo gæF«AzµFP¥›òŸÀÔx›¶î{Ïíöd‚xÃÖwÃ8Ž˜–Ù”{{L> ®‚d¬�2Cä�L‘º¨äLÞ,œLÜè,„ò(àmSìø›ÃØåå$=Ñ|%�Ö�luè& Ä…”83ãÚ
- N¢XåŠxë\VnõÍïžJ[)I›êwŒÄ/Ñé¹»²Ú²| GÅºÙØY×Áð÷DHµ˜½*›Sýª�îè¤æ’p6®0Óc�J2ã@ÅW´%Ѧcï¼_^Ó$Ñç#*:G§®æ6Ž¡ïn>ÍD;úù¥�~¤`9ëhXB ñUŽ«JB_вˆ˜ùˈî%ªý’´w'¹$³èv|#T<68çªKM¶Ï‘-Ù5U+¾¶¡'íB
- ËĪN…‘øŽbJìÃOv'Èì|‹„+*MŒ¼k(dˆ
}›CÚ˱@ ³Áq°³¹&ùaR%}´
- Ë!ÖVЃ‘s3w2¦ŽÑa²2²ÿŽawHæz¡/��Q0ðF¦ Ù]~;ž¥Ã¤�ËÖ NDùP
- mü˜K3xÞŠke_™£
ñóþS¯!�¡V&=²²ª²ºvç_PÀ�L9؃Y£¡i¿
- §NUÓ_¶¬¯)–ƒ�J6Ý9‘f*ÊðS ± �1�7ÚF|¸BR$É·y,Ʊ.¿ÀÕ&=uqsáó¡ODÅòB›ÈôR„=çÙɳ—eøØ½É‡àB®¬ä¬ÖH¡®ˆ
- ª2lu'�h7^#ÿS…)£Xi2..P�e¡/@FÕKÉ‘$é](Ø%à|–2ÉðY1pC�±8tÁùIøã11N//+\»“p¥jÔÄïôd€”Îá�WÊmé›ÃI=ß½·ÓY“Zx¡ÔMЉPý8²“1/JG«õÄ^U ,PÈd1O®ó^¬yßpq”l¿�£2hÝÑ$øjvñø‹þªÌõžIšö%‡Š¨§áèÔ]VæÎÖ
- .�'[+WU8Á[Žå†Dê’³è,ß»¾-=[ÀåÙÂO
- wÿƒ ¿Eê)å3±ø¬äó¿J&¥dïقݶR¡¬—S–\.° •5J$I�&ó‘Ýoª·Hȳ~› l‡½Îz>€
- Ux/õHñÐu;š?Gt®{?à³;óT¡ŒªH äLþ|Fú8á†ð²}ˆ¡{ú˜p:ß2tì͆<L¤CA`²¼ÓʘÆâÇë“�§„+' ‰—‰‚¹ªoR0D?AûClIþç¯Z1¬¶›F?já§´ùõä{^�œEµdGIœµT°º¡&#eJ}ÖÄÉ£_m¦Ü�i’³ÐA3÷K["ošCÙTJEßž4Ëc$ô„jÝ�bYËnathY�„`YG�Èãei‚µ¨ñ(…aº#ps¼W�ò±Âi-1òÇÑb™«,ÊŽTécmªåbhv9jhÜô3«tè4Î@zöK±±æê™†fÑjÄ–Å\$5Pü…!¼hR¶“$Pé
- M“Ñš`’³ÿªÀCôC^%2Ù]uOs•‡LTx“íÝp¦Y€Ü!›UÆœ{°Í'�Ð’á¤ÏyLð +ްlÈJé‹8ª�Êß)@öw„$F5t4ÕÛ¾$Ã,£²34aTþ˜&‰†ÕÝ„¨UiõÚ+¿äì-಑-›ç,®ð{!/\ÅÂüÏ‚ŸÂŸ±'&¿S¬Å�™Á0xkÀYÿ‘Å0I¶)«'Ýöíâ~¿Ö ´ê«•jƒõ#±m!–-TQ`•‹‰=¶=œKRÔèÕ,.is¡gI&jf‰-IÍ(ÿª~²Ž³o¨‹,èiž€©å‚Œt&Ú\í�èØ`Íž¹¹éÒ•,äY†çGÜ‘uÁ I(~[Á!2=ÊÍýâø¸“¤hÙåˆ&I™¤ê{8~4œŒ
- ðj(*��aA…TîRþ?bÚ0„I“³Kë¾Pÿ
- ¸¬ž€M‹û^c³œ´Yf3Œâ-®¹J¸óºc±÷rø;þružêGuAÁT1?Q‚‰à8DŠpy‚y†+‘Òcž¦ìŠ@6!Ë[oËÄÔf£×Zp�×âɲè`$ÆQõÈ!†²O‚ á4«Š»|�¬ÇqiùŠL^·Ø_Ç€M+žÆ¾Qb²¹#7ÕƒØìX
5=žÚqQ¿çî¬!¼iëçùm~•‡ù÷Å÷ÔÜ÷‡u…Ý¢êçÓÜ r(48zrŒY;ã*1ÃyNkÖ$9jÖôÊip+ˆq] æ°gèi™f”ÑîùÒ¦f…Ô¥×¾ ¨¤×»‘>a·Ëѧp6ÑÏíÔû·¶øè5Y"LÚD“Œù.Šr¼ØV“ß‘²ßS_
ºÚÊkþÏ]»n&úH�¸z§~¦9‘æ
- ¦p
$§4Ù‚”�'¢{º& ¸«ÿËM\ŸÎ°éч¨®!ìq®i�à ÏÄ(.hš'ËB±T²Ÿ|ž{I„6cLò¡.¹ž£ë¹�iI¾ê«¿\!à;§àg`1âᾕ˜j%C ¹o�3*60÷·EŒ˜ØŽž]tä‰.×-%0
Y‰KÇ_nft] ·*VFCÆtJ’°ÄTÔ+¤\WZ�8áòÄâ×gFвàÙ^
- Þžf�¶ 5šI=¶×ù#6ö.@õ2zÒÃ;Wš`ÿB/Ä™QøŠgí°ühŠjyJ�Ó°€N²AX¤3ªÝ,õ¤›�Kä6è’ë6�Ú²ØM0®T@ Ž…O{¡£˜4kj£|"¬ftÑŸ”Û„Uü‚<-üÞa†®Õæ5b�ú)í^R±°8™„ÎÁž:†§il�¾ÀKaÇ6@µæ”Ã!ÀÍÃ] buvÎ�$ ‡oUÇœ�~:.…Lût–èêe—ü Ç€¢JξP
- l$S[z–�~Rq39é’ºô¶9ëQïË/�m"•%ʤ‰¯†¼7Ÿš Ãî5MKLŸé‘§"Iß�G„ èXTÞŽXL¿FðݧV
j‘p^¡/MÃgÁÛ»{¶¹»wô
- ì*øº€ž9ÿð—ÊO¾Êˆ<Ë"aôÁþ÷Aáîïˆq¿»¢†.M—�2@möë‡p¿^Ú'“wß•möÇkxO8ü$[ó«&Áü|Y‚Zyý`2_|%r—“/åJ?¡QùÃṈl‰3ÞÎßK¡E$–wÿvCËh£ûa@÷U€1©Mø¾%0?1*¥–$GÓZÓ{!|ÇÊ¿À$ÃßÛ•Â-òÙªEv;�‹Í“:佋Ÿ`BlÏ˸ 쌧Çɬ›oQÝ0&‹•ûþñ,†F?¡ýÆä„^�s,‡c“™ÁhË•ÿ$ÃEücl0åºw`ýâ�º¹Åˆ©@/€r^l˜8cT·3™�Ük@›ÜúJÂÝ”´uPÐ&ʪNÉódùJjT�K¸ªi ·é*u§»éX–{t“j~½É¡}ùñi\BÈKenâ‹Èµ|NëÖêšu�’ï#Ã]@lõCZ$iPæa½ã¸©t04y20ü
sØÖªâ,AuÆ!QÒØBäÏ–ö–^ìˆ@VsÉ‘€‚\ÞZßaã7©ì¾‰©¸âш³»6-Tïr±ÀäU˜�àu“Œ~ë°1HÂJ¨(<Î±Ž‚ò½�Ó³bRÔ–¸qiÏ鿢¬J?íeÿG�Á
§*jVħ"áØã†:Y);�-Fådô!ðH£»ÙG~´•u¦x cb�6m•¼ø)&;ñ0‡ÏdU?‡8ÅX~ïŸ1Ñ2�šÛ¼¨t€ˆI�Øxè5ÄÀ{(ëz„ê
- Ü'¿ûÿ[ ŃkŽèZÐ…ØìéÍi,ðÅb™1̇‹¢Íá`º±(ôªm�Há�Nðìüe‰K¤°ßÔ/
- [à´(õö#Qô—GdÊuÎT©½^øm³¢¿%ù†ŒÅ!(˜7Kgé…P=èhøÏ•ákÉ�U+ŒÂÆ.[Òe¯‹Ïм³CÁ�ž�ÿå"GDÿΨ£›<*<ÖÏþéh«)¤` A˜U@O]hýlÅf2”…!HžçÏF#�QBÂé=uȾ9f´h€ó;"R„¥Ú�’KÜ3-‚(G )¼P±áø¡¨ž¦²T],7ÁecÞ
- ë F4hHÓs³73á–Ÿ ¡²âÛ`àºR–¡Tíwfͳ;6Bó>Ř
9&ÈâÛÑÚÜ‚Î?’—÷ø)À\¨Œ€�<&Ŏ™ð5 LÃJu¥@YžÝÝ,�냲ھÛ_wÂ0˜^é17ñððöìpÞ»‡*>D”8㟘ü°_)$UźóÊR´!jOFôÖ>{ˆÐ’‘»t,¯-…bPµ,m`D"/ŸzðAâ
͔إêßQZGÕ&U]�xejxæåLwvõ~²œ=)@ØB¯Ö6Ê?!;53/ps@tƒOZS7©”§Ø™®’nŸØlxèûîÿZ?áƒZù—j
a²–{ýû6—¥ÿL4›Š«1Ÿ2¹´ù¯‹Q‡iÜý&Ö¥lƒˆá½Åì]o= 7Äļ ofüЖürMEV@ƒâHõ¦èòû/èýaD¥Ù¦ëH•ƒ®®lK5)ÂŒZ OE´œ˜„3Á¦IG©'г;îD'¶zl(‘ ÷�EŸÏÑ$�Š.Ùœð-WR'\w+)Âw3æêº¾ù¸ @Û%RÔ)ÿ.ò~Š9;]ô.šg+)Ø%È�ökÕÎÀÒ‰³¨^ÒöN€W·>b1z:s†¨oD
- K�ö²ºÂ2w[|>9â®vWMFâ¯uÞ`¹ëÍax‡chÕ«õU·�`*ʆeû]O V'6ý‡ÀƒxÔd?¼H]_rõA»£+zÀdF›¯H ÄÊ‹<¤…Ç´£ÕÆkUsFzÀºòÏaHÖÇ9-³œ��˜ƒgv‚b‹=ÓëL/žE»)°Ä.˜½x9j%Bã) $—ŒéAËB¢�æì ƒÛŸt b.bÒAE¨žZ�RböH(‘£õJÿyaãˆÒ9Wj0f¤ßF'›°Xàz¾Ãï$DQ6´ëžqƒØ` oÊÐ i=�áÁ{#4¤©FYHù@ØJÐ3
3i~‘tYТÙhkH‡PÏñ×÷ý17ÓàॆYÜD—"Üp—Ħ;'³16€Æf—pu‹ ô¾>þF›oDÅQi¨náÌ’�-Ïç@P#äš«‡ ¦h“j Þ‚ˆÅ€f´¶C– –�ƒ7°”T5HVXÉpíöÉklÄŒ³®]™ÚyXrÆ)?ͺÓBNJšBƒ÷øä½#Ë›9e”�&&»_0•Ó=®špZ�É6§ªh¤Ù)ð
Ì—ƒa bÀŒí=(p)‡âÙåí¬;Š.N•,“ÃWí^*hÔºŠC—îm}E™7�iõà‡6Á‚Ã÷aËIívͲxpƒ*Ac#4‚ÿýûŒ³Ç Nö&ð`)®Ä‰ˆ£H£We›ƒy7jl¡ï°�oÝEh_n3 ‹jp?ª4èp2WÀE'kT_ã
&£°!È–jVl˜HíÓ»_kÉšáÈâöʳùaYùŒ ¡ sÎ@ä[…G"ÊÓbYÕLÛÜ«X¦ªi�
ÕC�˜q8ñ&úz��VaY{èÆ#I@µ§�2˜Žmó!ôdŒ[1 …AàÆ¢šÿnKèðòÕÆe×�²å/>ßdƒm†uX:xÊ·\„âpòN‘ûý©l�+ƒH+cÇtSǶ‚æCÀ±[íà~3ŒÍeÀ}6° �\³,ÎñÉ„˜×|¤YòÝ§çø˜§v]¬'û|¿žŸë&í–ìMô2° dõ¬�dsàx-((76”©aX›½m=ÕîÓŠ¿ãQˆ—<$ªª�€üóQ†˜„º\�“
- ÔªqiéH阇¬‹‰i'i¤”$�"£{S*V�wF‹“/°t<ìÊÁáQ`Ê’Z¸š+ðpr)›(¹.jµé¸«Iük5õ <ä´Ê†±Ë®ÉÖ, kO‘‡œDTˆÊJ&^7º£‡ÄªQ�þ¤ËÏvße
- &žZ�Ø’
^4úÆ^s°ñD+`WHµ™®�bì6ÙÄ©˜ ¸®ÈL�˜W{ZZ ¦@°ämqáûv¦É·(DÁ\+Ôlåéû0*¥V¥ß‡°VmÕŠ§æhÆ�æØ/S`|³^\<-™„©Ã6ë¸2©N3�‚"
ToŸóŒlräÅe ‚!õÅH2‹pƒA Ö›¨ ‡ÞÃÏ{›È¼þ/£òŸÑ�çœudU2*2ò"c«Ì"p…${©€y�,饋ö&\àm¾&º`Ð|x ¦p…ˆCªÒw#ÂÉûW�9DIiñÑ–Cˆ�›Ksï–ç‡�S¶“ã3ï,¶‘–þM›’;j¨þBë§4š›P›2ÙÙiµîïf¶®�É¿íÁbA]a¢idíÂðŠ¨†"Äò×i!aQhÔCNO½±žŠï‚õYí
- “xF$Äøg—9ž¥‘Z`W«°…VBâg¸± ìÚ#j\Ë‚—¨€eùGñû[³.à¾]‹ª0º~X{2›D©„?Šø"óŠ3ÄBáj,ÀK~Æ�b#„0¬É’L˜kcÍ(6 ¸
- ±aüE7λ�/ÕŽ¯%� ü±œ·ï àÉÄ¡Rë^JûëÅCÏ�Z+71XÛ´ÐUO,Á„öá}#�-”�eÙ¤ 4ö3Å‚ðítÃ8§™Z7†Îià¬Ê<:iÑ?Ft‹Fk–CW'˜êf0i<âXdj—ùŒ”0ÛW#i‹‹š–eCÏ
- zI7ˆÎB°s·¬˜.Kƒ *ë�ÝV‘°�«dÿ‡ŸD�ljö@ì«ï%
- ©Üˆ�å�
ÎZˆÄsÝï®�sh̸%‡^ß
- ýèøÍ÷@8†ò§¤øÎ? Nº8gÔGøgr¨X°€Sƒ» üä•
Ap‘³º4‡z*ö¹4á�Ýà§,ùÄt4GÙnÔè÷‘¼õdSå>fî”Q–CòÏWUZ{SÙ;N�xå½Ê}°ÇH&º¼*�9׸¯q‹šU1 Êóa `(M-aÈG}Õn¶Ì½è¢Ú0 –¼pÊÔÇmcnñŽ
òð‚ɘÀ_ú\±ül¼ÞÛàþ»}Î È�Þ9÷FávžHþkƒJZüNO å´mZ�áÁQžíÒ¤ aSûëfú�
- )QC+2
- d’˜¡[¯ý» ÌïÁõH"t*Þ
Ác*bÏÆÚ¢÷¯q°¨,µ™óã#S˜Ÿ#¢äu›'Ò¬õ:4©as¥©¾CDM�F§|ɸm©_Ã1L]öáY˜Ê\À§ý*¤XœŠ>tú–¯¸Ìg‹§ØD‰Ÿ£Šøèd@&[°)8ÃÎ;<œ{óÊ8<–È+VG\°H˜®¦^�¯a—‹a�eÝ-4”úsÚJÔA \à�hM[‚\`ð“¼#¿pD5Z97g;²÷BWâmÎä‰qTXX‘%0¹�vºžã†ù&ù·]E¹Û4]ûFŸIJä¤ù–œ„&ÝSŽ_¦îƒ4ÈR‰0 ¯¥Dü+Ëme¹Ô¨Y ƒg÷ÐOøñ+M{”03Ïv�'Í…f…ÁÅt¯á�è :;ôØ±Ê Nô¦nà\Ç”^Ü,)1Þlãá’aBïZZÚ„[•à ¸� ûZSÒÒä¼UYhÜ߆ÏÊw€õ‹šS¸\®/¤*?zQЋÿ`�X4ïg¹ríÛ[§ŠCWæÛGû.§Y„ì0Q|ûRÔƒ‚E�[w¾¦î„yƒ)¸áï‘,шï$ËNK@c/b
- -#Z¯I
¹G$Æ—¯™‹tmçÊH#êð)X£wPZAD|¢S
oýf�ŠõT¤€ÝHÚë)¸ÎäÓçÇ>ªM1 b
7ᰅɆS‹uÐÃq×
- ö·öjK4[sð„‡ •—×xL ›Ö¼Ç¢©ë]5ú!M!A¾dƧN Ë><«:Ç»Z(°8�†ø�)e…„ß
»¥™†/™WØÈÀ|
ý°bªØéˆú<é÷œƒ®T?%à ²:@±äÔ,-àø€ecMPð8u¤m°VÐg�Œ9Héö6®Ëç‹}¾=³5�ƒ�—AbÒÄŽæýÏì°�¬Î™ÀV:’�…_ leɹß
- ÏÊî–•vý`Í0Žä!$`GÁéA"I;$ß^?ú�®Ší‰Ke O¢ Í÷³N(Õ½çö“YyÊ5Bç¡w¸ÐV¹%ˆju;)lFµoaåìË›7�óxéÿ’Ú¸Ø4-‰É%ë� †ð$ÏÖ¹/zskǘ(sh>»ÁDD©ÅƒÉt¥TÄ7örurÀœ¸0ÉÒ¢ `Ü´h5
5�Œ¦Éä¶�“Sá}¸ÑÝÈÿÒ4hrva¼éléc!ZjB]�¹Ž¦©ÎxâD¯¶ÿb–Tx�zYS‚ß6_ö)ƒÊo°Ôp>˜#�@P¢SÓ*ýbÜS\qÆ‹xñYfQ><"ó·²ã¢
Y6‘ÅòIE�r_7ñˆÒ°VÔHÃ!�³ÅIçrŒELçŽ6ž!N»�öq"'’d “aþqMvºÅ‹A‚%íõºº¾ ñv³í½Žn<Eб‰;�Ã,Úw®ß2pO%¬r’‡X“Hö`˜uI#™/šK¹Åò;‰56‡ßLL.œMI8ÔqÁ¤4U‘närÉ¡"s9¦(ûÜ@=¬ò}N¢¤)?S™ú‚….úr½0L3¯m7VÂýK HG°/®yQ¾Ãé2û/Ww«F)±Áãd)s•¬Fë7|óŽÆºvQÌ´ËAÝIz`€\‰†¸¾åÜ–Ðä„›<>ð.;šëA/Ïç°ô2ʲ‰œa8D$ÿGWv…#Ì�û
9®kÅÅ'ü‰ËoØŸœo€@âýÌ (]gkí+}/ (nq‡ºìK(f¢ÍÖÝÆŸÐ¸žpüøÌ2ÔÈ3Y°ãÝéw�²pDþdG´q2$ÌÉ}‘KÓ¯A"öE&N‚tg'NeýsÕó!Юð4qìœo}ì¿�¥Sµµë,oÕjr/sœTþMT—&öÐðQf\12¡h'&ctN¦ú'TÅx7¼�]2û ;GÍ Ê…ë¢ã|Tª++:%/ †è¦ûгÿ1T‘ÅúÏ“óË€Ÿ<ÔñÌ4ÂÓÔùŠÀÍ”×ÿ“Ë— É,0~áò�!¡W‹O©à'‰ áÍ:sñuÈÆÊÒ¦Ù†ù�(´^ﮎµ¥œÂ)˜ø7èØ�fÁ€Ñml¥òÒ¹î1Å«tÜÒZƒèhÀ
ÊL0§£·–6ÒX"JÒ‚í
- Œˆ4§9ØÑ �Ö©Bé}ƒÞÔ`è`‘¥®ð„Ó’ç #¦JÞïnéäôÑ_‘F H|š¡$OÈKÎú=¡Å“i1÷¡¦7Œ”o-HËq¡ªûp[É«%%:ˆä€Éˆi3Û ú„G C—�LL‰4ŠSÐ:ždBòj|‰ˆpYÓöSþD�P>¶pÓv�Þ²5KLeè{t0®ò‘yÇEND$à*�;z»5šŠN’áBIóÙgnŒ€.NÉ|×¶àÑnÐ�”RÈaS¤Z×ÂJcH² mÍÑXøÜÊße�k;_6È,yÊÂb”�0#¦Z„¸A
e|w‚ÔÌG
U½1l¸ËLDØ7ÄV£q’Ýt[xuÝE”QULˆïðPB�lZSh–’.áé1Q0UìÙ±8R„i�úp;¦ñ{óôH#–GON!?ë£èt>©Q |pÊk¤�Ûó¨q!çgT,öÕjÇÐ2ÃÈsÇ�4툊t”jä·nÆ›/IÉO˜E!Ë‹nFõ›4¨†·ˆM&Ô1„’—¾…xÓ$§ew+v™SðË
- bm]e%8²ä�PÌÂ
- !úï³�ŒsÂó_06£ò)Â�Q´2JB†êØý„[t9®–ƒ'”§³Ôœ,§¢Ìô[½f�Æג¶]˜ÂBŠBÃ@š¦îr&B„s|•Qš
°§™×g¨íOCˆž1‡ÜJ Dç<ÌÏâUÿ‡²Î¼Ó(o©!³�h¦�ÜK½Hüê 0q›ˆ’§AÑVˆ¼'p´fÌy"Q
- O…Û2ÇZ»¾ŸqÂà½#d"›@bQ»,®“Âw)îPÍ\b`xŠß�Oþ)Þ¢d¼MC€$[Ho¤�WÞ¦Ñva4{äDZ`52íýº‡³5;‚…X°ÿao�K†;˜6“%ÁR(À‚ŒÓÆÑ…x9Š8À2rãDc÷¥@ÙˆŒæ¾É¤îF×<†d(ÈAN#F�I·ž›zmEþ‰»F=©±…Æšå•S‚€f
- 4Ê8§<'´„íj�êŽô-ª˜Ú'ǘ<ÒTbñ2Ýv€EÀt¸¿q¡Ò3qODd_íÐ{`/œhhê‚öÌ`Â’9_ü1hAY|/ùë«Þ·Uê-Í•ºÐÄAÞ”Õo(ñËê"“$r؆TÌ×PR;§.¸-w>&LJøiC`A£^±—Ó#‰€ÄX8—t—öâH?€dÁ¿aÃÄ–TSTÚa¨HŸ0@ÒîŠðóU)ˆ£æï^e}Jb7%×Ü”%:›ÓÆ¿@�—¯MŽ+ñ»y”sqŽ�ª¡ëLÌÒýø¿áÊYª00Ô÷GüD¡ >Ä©êAWˆ¶ð2�IÛ:ÄÙF žÈÇš3ãŸ2<k½}[{ç¼*™"A�z0…Î:@ÞÀ¢1¨A:�µðçŠíܤhÖXÃî£Cûñ““£9èˆ8ÈËèµÔE„ùòÉÅUÖØeu)[?©mt-5Ër”~J’ݪÓV2li)áÕž<¸Ò³?ò(D†¦î;)’�o (¤˜ÊXI¿I$¦–’ñ$ª)À'i(Àª*’¦_µŸE K´ª*½4C‹kàýÏ÷wkOIð˜FfQ$8γ�;(0+.½9²ÃÂ9uÝ$áÂ0öì�t‘170‰ìfȦ
Ç’ûaOµ=T,èm;°€ôn™‘�¥øË¸ÅýΧ—cí<9ð0ú<êÆð
_½=g ÀQV&ÞÅB±Ü€Á%fÒ3`5ÍF�ݶ–~‰§`6dÉ.ê2`?ÎÀé]„}ìO´0^A¿K´N\Qç(I {ÉÆŒïp[ꜪÒ4Å$6x§P&Õ :²'�7u„ÇêáßÔ æ§´&éõŸRó®®dÀ'Ä
Í´#{*Wøµàâl ·DÆQ§ÕÌŽ.*ZEîÿ
šcƒÝé7µ¼|4€ã€Õ‚or\�*öí
- HX¥³Ø'È#k?WRÀ‡‘mP�xÙ$Ù“]�©¯�
ׄFKÁ ~È4;
[ÒŠh2ÇAÌɉf‰�¨<P
dg¶é’÷)—!b#Z¥?0o´Ôá[¯¯E hXÜ$ö¶…ÓêSþí’Ø¾eþˆ½NÛì$�ò–æð“Œ=Ÿ8Ш"^ ‡VÙcFDÔïx˜Á§ýÑRX³CõX“ážÎ.:Fƒ¿q,†„æ1)b¡Bº1
ò§²+¡Qž)ò_ÆOyE£�³
- ôŸü‰¾º¹nTp „š}1`î�#
- ×£d-½Ö¥#„OñáℚtïÈ:5ЋŸ/<b0°'m�oqI£ßÁBâŒFW‰ü.‘\k¯cø5ߦ-v›T[Í‚àô�°êà± ôü›-4:dÝ—u”†[ 8:P금ª£ªBT˜ûµUÌËçÆQð ,F24‚lÀEO÷?ªDþk£œ{
å±1¸k6)Rä̘GIÉË6§Yp^UÁ!Aâ@é{xg�#^/ ‚×E‰Tz°ÇÄ’Ê»@:FŽ'\�Q6ƒt,æÔpT!iõ
- N!¦dGÁBáÄ^
- ó$@yn�ˆ_uœUüºCÒàíK¨_K62˜ìB|
- ^‡�¢‚T²mr½Ž¡LDgÊ¿Ëf›)!-îúú�ÓoФ�ch»}Éí@oà[ràE] �ë/iÚWJ8ÁOgbêÓ�FÖe‚(/”ÂEÎ çyOñ™LB�œ]IkTÚ‰aÌàbVŽÌÕ
- ÏÎ
- 2¼¹“™Ö�%Íb»ŠÂjúªÔg†Œ'‚Àñ‡2…-6µÿ˜Düí»¢òJZe' ·oBi2üû+]x;S¾Pσ¥{£{Ju¤m²„f^L
- S0Ñ’ÍÄ~oÇÇëæü-ë÷ÐS¸Ecô*€vl��pOmó�@�öv -SãÿD;<UÈC¯Y×à¾îûÖnA)¤pxOý@¥iåLŠ�Â7—E`K\‡J`ô9ÛU$ü pº'°Õ� Ý…ŒÓ3Áv
+�“nœ˜%§lSŠ}܉AÅìNj0*±¦è׳48ØÏÎi%Ñ‡Š”Ò8ÑãP5Âc‰Œ#ÅèT$F»?$²—€L~ªIžQN_òMC
- Tn‰LŠ`)e|È�‹!dšäóÚòìÜ‘[ìsû‘D”\Vo�‚gFûœŽG(1¨ ÆÌOJB™É�JÛFR%pá�Ž�3NðP CéSêóÒë@pM”�ÍÝvA�f,- +®HƒFt»,Ÿ¶‡ówfA¨€�©²‹æŽ)yÁóî^Ƹ}ÈNÅ+s8Z‚$j‡NF³ñ×âi#ÚlÈÖâh�–´ÿP!9ge]ði˨öhòïç€öf“v'ôƒláð!êèynÛOÛä]3ã�i†™Ñ�ÀFÍ ›€ÈPkcœ\çˆ
- `çõÞ@Þ92Ä
z¿µXãú;]Û©áiª%[5‹”€àp¬8Q c‹ÈådÛð\ÑLo±ä;jPÚ/Šønýg�¢ó[åÒqBÒQP;ö˜,V“eÙçÐ3ÜPr´'Ø·õ4Yÿ©† 8»÷[%Íö¦c“
- ^ˆ`Õ÷° š‹PjL>Ê íq€÷À”:6S•—ŽÑ]KÎÏ" ¥®g[¦� åÏ‘H“˜âB¬5ÈVEqÛLJŒ•X{C¼ˆ¹§B½ÅÙÒ!¥P«Iá�q9»øLlx–®Êª7Ò>Ö¤–Û]@Õ!@9H”!ªíäÈpÀÉ™Õ$ â?ÞÕ)›«�ÜŽ¨l°/"±”ÀÌ�–¯+“@`}}:\÷•¯Ð 8•zQgS£¿+ò’¤¿Á’C„£}€R:ŸõHþUF\¡Xþ’göÀ/âë€AZ%c1ÕwlET�–wX ZNh¥ …Äyf2DÆ €Ã¸‰&v®L“qî4Æ7•ñ§ûÊzúð\�iJyÀèJ-k¯NÄ3½ ë £-¼s‘ÑJ5‰—)ÙV0™N0ÝdÚ\Ó›d0d-©ãEÚ[mf£\£UmÁx²ÒÒC«R<(`ªÑ•æƒp4^!�hÔQè�`¢ù�!l“ ~Æ™ì:J‡É ñlüW±þ€9˸ÌZXB=ëÈl)`jžªeVJ³àU€³†G!®sØç1Ô?Ƽ3„¨ÃŠ.³}bIaÙê6àÊ•
œt?èÀ€ÞSxZJ'Ãp
- ië,¦.ˆ�ñ¬�ØR2T`5�˜-R
- BxræWHöJP°e#Bb‰|“¯”-±þ�¡�ì‹[²„ ÆäPÂâý…¤¨Eh‹±³Â‹(5Sœ¢•fÕräÃ/]˰ÑIÆŠ
ÌÖd”ÞE#ú¢O®Sú3—9Ó»]¸º³€e‚¿Û®Õɹ.9_Œbêe§æ¾MŒ´�9b#e�©(’¦-ˆ 0�§Ò×Ra±àÆ„9ùº–ˆ"þ‰±þýýU,áÂ%ú~¾XèÜ€ö—”ëz€Û½{'6[@„t[W%ýÑ*.d'vR {”ÒðhЦ!ÞAed’CªE}»x=E[|ïB$7J¡* B-á�,=k7”[_¶ê-ÐIô–¢«€’‡J5eÖ̶Ĵ{
Èí( ´†;�WMw§`«°€Ë~pÜA °z 8‡îfæ))âŒâÂ(Þü@ ©ÄªÙ……Ù<áî…ä.a%N òìné@bzÇÈÑÀµ¿>À�ëô%…‡€T*?lgb¿döÈ<‚ĵãúÀw9Na¬Å¼8;<^*%�›yÒ:tD¥Ò•Z<@ü‰0ª¨«ä‚q4±äÐíl\
–†1†îÉŸÓ�`/ž$IJ Ò“sN)¼;:A;’)$ו
- °Ww¢y%KrÞIv\b¶V™£\nd{ÀÞôÈ6t»�v�í×/~¢�ü*OÖí
- 7U>£8ûr‚AC<ºjéŠEâ¢-jçØç‰·¨üxsî)��ÌD¢›–1¼ÃŒ/ÏÊq“p**̸À$Ù‘�,Ûá
ƒ³BõȼpÄúk MhpˆKê7ÆUè¤Ã]ðøáh&„-ž$ˆéŽ»�¯”“Yê�£;àqËé6w•zÝ÷ÖWûîË„ÖA¦h²ìDœ‘^RöÞÉ"Æs5�fýüîw
ˆ¿ä+çQ&’/9È‚–œ¸wNbÇëéü��ãü°Øz{娕ÓþYÅ>
- ]NEÚÁ±c,ßž#BFý:0ÍØ/-EȾÆÂŒÇ׃ëF\êŒôäI§{tìäA»Z‰C™ORÃuk¥iú”ô)…ytkd�N¸&›v§A±™ˆP{ÍÖîôËP'šó’>ÈêàxàÆ†`.Üä%,;:Ô¿Ù:Ž©«¿íaFñ§oTQ«}v#ôìš×£‘öÚQkèÆ'ÝsÄÔÓÖØ÷~…µÞÍz5hMÄQÊ’áY>C…èÊ�™�„è¾i·ÌU± ÓNF#J0uŒÎCðäð8k“!
- f«éì§v¹{Eñ/ÏëæIKIEË>ºp·yd†Ìe
- ʾ”=zô†:@7ÖJà÷ijÌ|ÆÆ5g8ÀîxÅ3çO±Œªþ€ÄÜÜ
- þ3€H1‹ó±Ø„F. y´fz´ìWIMñÙƒÆj[�.wæ%„i?Ò†UÂè©f|}@+[8•k7Cx¤˜S�…íEOÞ¯p $ä—üáç¾Qæ»+™Ê:¸<á]�¶¸Kâ3�‹T-y²ÂÍ[NÑÖz´µ„;y³Š¤-HZþªY^¡Ô.¥M�*Ô'h8ÒíA….°Nï2r‰œLBœ7:Or�’©}‘C‰SËšS9äJq#ì£WI}*8ËD!ˆ¸# g#Y�>8`•
- ìÐ’Âñ?a…�2H,^ñãÄ'ƒ�ï?¸ÿ�^¸ˆæ§nƒhãOÆ’¿i<ѪæÝYa2É+™üÌ6a°F±âa<Ì!„Û0¬‰2½]�c:ïe¼K¤¬X˜X˜[UgéO¯u5iÔyPcVÙTºž5RIúŸA6òOÔ¸i
¤ýCŽ\‡ñ…—ãQZ�M„DÄÆƒÓÚ�ÏB!X–Ä:ôÐã\!Ç^Á…"{¡E Vax$P \$³DBBTÞÓFtèŸ~™Ã{O‡�¼
w�ïøž5a#ø`�«=�g�€Ð�°Yý2>‡±MG¯-Gk�èªÛ1T¾b¦ü…L
- ¹`*Ù€«V¬X
- Þ*¥xªe§֊�Z*c`ªVÁSÕb¥ºÅJUŠ’ªÐ*6 TK@¨zqPÄâ¶ÉÅh“ŠÇg†Ì*ß”U§(ªöQU4‚§9L’
- cMÆ*�ŒT»©R!R,B£È…E°Šˆ ¾*C|TzøôpðôFèô@èô4èô*àôà÷õ±î±í…°–†Ø¬á±Xób°€L€.™�T2�y`�®ÀUpbàåÀë�
- �ª�T�, �%@`äÀè€��# �?@�t€�¤øGLˆëÅž�SÀ)öžÃ¿ z“ÿtϲFy׎� �14�Lh�ŒÐ�ဃ�f�™�°ÈeÀ(.)pK€@\âà—�X¸e@�Tb v•h˜DÀÅ&ù0-I�bD‰ d@�ZD1¤@‘�DàyÀ¸ó€Ñ§�CN|
9Ü4æØÓš#NclÂÀ°;�¸,
�`c‹XâÀ³@�(„�2$0�"@- �˜$è�B@‰�<$�Ð�ÁÀø8p7C�¦€àbè(�@¥
- PA@…�F�¸0�Àõ�t‰üœÞ‹äGéÔOR—‰éIJâIïTñyS�ÍMW52\TÆoRå¥KV•0ÈŽ¬à»‚Œ(
- - $²€’š€”
¤!6¦„¢wˆêH¢©†£ùú�Gù O r~àe~/à]þ·àV~/àP~7 Szï Kú— Fv`;ö¯`9vÑ#
- J¤Ü§BÍN‚,�ä×ÎÅÓ²'°��`��¡'â�‚`\LTþðÙApBs�)r…!Õ
- â(
- Òi‚`<?xml version="1.0" standalone="no"?>
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
- <svg xmlns="http://www.w3.org/2000/svg">
- <metadata></metadata>
- <defs>
- <font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
- <font-face units-per-em="1200" ascent="960" descent="-240" />
- <missing-glyph horiz-adv-x="500" />
- <glyph horiz-adv-x="0" />
- <glyph horiz-adv-x="400" />
- <glyph unicode=" " />
- <glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
- <glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode=" " />
- <glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
- <glyph unicode=" " horiz-adv-x="650" />
- <glyph unicode=" " horiz-adv-x="1300" />
- <glyph unicode=" " horiz-adv-x="650" />
- <glyph unicode=" " horiz-adv-x="1300" />
- <glyph unicode=" " horiz-adv-x="433" />
- <glyph unicode=" " horiz-adv-x="325" />
- <glyph unicode=" " horiz-adv-x="216" />
- <glyph unicode=" " horiz-adv-x="216" />
- <glyph unicode=" " horiz-adv-x="162" />
- <glyph unicode=" " horiz-adv-x="260" />
- <glyph unicode=" " horiz-adv-x="72" />
- <glyph unicode=" " horiz-adv-x="260" />
- <glyph unicode=" " horiz-adv-x="325" />
- <glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
- <glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
- <glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
- <glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
- <glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
- <glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
- <glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
- <glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
- <glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
- <glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
- <glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
- <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
- <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
- <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
- <glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
- <glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
- <glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
- <glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
- <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
- <glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
- <glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
- <glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
- <glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
- <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
- <glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
- <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
- <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
- <glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
- <glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
- <glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
- <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
- <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
- <glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
- <glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
- <glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
- <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
- <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
- <glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
- <glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
- <glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
- <glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
- <glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
- <glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
- <glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
- <glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
- <glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
- <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
- <glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
- <glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
- <glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
- <glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
- <glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
- <glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
- <glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
- <glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
- <glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
- <glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
- <glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
- <glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
- <glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
- <glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
- <glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
- <glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
- <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
- <glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
- <glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
- <glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
- <glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
- <glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
- <glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
- <glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
- <glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
- <glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
- <glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
- <glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
- <glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
- <glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
- <glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
- <glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
- <glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
- <glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
- <glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
- <glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
- <glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
- <glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
- <glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
- <glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
- <glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
- <glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
- <glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
- <glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
- <glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
- <glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
- <glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
- <glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
- <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
- <glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
- <glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
- <glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
- <glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
- <glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
- <glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
- <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
- <glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
- <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
- <glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
- <glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
- <glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
- <glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
- <glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
- <glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
- <glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
- <glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
- <glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
- <glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
- <glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
- <glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
- <glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
- <glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
- <glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
- <glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
- <glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
- <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
- <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
- <glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
- <glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
- <glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
- <glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
- <glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
- <glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
- <glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
- <glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
- <glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
- <glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
- <glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
- <glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
- <glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
- <glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
- <glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
- <glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
- <glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
- <glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
- <glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
- <glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
- <glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
- <glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
- <glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
- <glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
- <glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
- <glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
- <glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
- <glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
- <glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
- <glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
- <glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
- <glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
- <glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
- <glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
- <glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
- <glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
- <glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
- <glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
- <glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
- <glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
- <glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
- <glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
- <glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
- <glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
- <glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
- <glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
- <glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
- </font>
- </defs></svg> <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Renders a PHP_CodeCoverage_Report_Node_Directory node.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_Directory extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
- {
- $template = new Text_Template($this->templatePath . 'directory.html', '{{', '}}');
- $this->setCommonTemplateVariables($template, $node);
- $items = $this->renderItem($node, true);
- foreach ($node->getDirectories() as $item) {
- $items .= $this->renderItem($item);
- }
- foreach ($node->getFiles() as $item) {
- $items .= $this->renderItem($item);
- }
- $template->setVar(
- array(
- 'id' => $node->getId(),
- 'items' => $items
- )
- );
- $template->renderTo($file);
- }
- /**
- * @param PHP_CodeCoverage_Report_Node $item
- * @param bool $total
- * @return string
- */
- protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false)
- {
- $data = array(
- 'numClasses' => $item->getNumClassesAndTraits(),
- 'numTestedClasses' => $item->getNumTestedClassesAndTraits(),
- 'numMethods' => $item->getNumMethods(),
- 'numTestedMethods' => $item->getNumTestedMethods(),
- 'linesExecutedPercent' => $item->getLineExecutedPercent(false),
- 'linesExecutedPercentAsString' => $item->getLineExecutedPercent(),
- 'numExecutedLines' => $item->getNumExecutedLines(),
- 'numExecutableLines' => $item->getNumExecutableLines(),
- 'testedMethodsPercent' => $item->getTestedMethodsPercent(false),
- 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(),
- 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false),
- 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent()
- );
- if ($total) {
- $data['name'] = 'Total';
- } else {
- if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $data['name'] = sprintf(
- '<a href="%s/index.html">%s</a>',
- $item->getName(),
- $item->getName()
- );
- $data['icon'] = '<span class="glyphicon glyphicon-folder-open"></span> ';
- } else {
- $data['name'] = sprintf(
- '<a href="%s.html">%s</a>',
- $item->getName(),
- $item->getName()
- );
- $data['icon'] = '<span class="glyphicon glyphicon-file"></span> ';
- }
- }
- return $this->renderItemTemplate(
- new Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'),
- $data
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_Crap4j
- {
- /**
- * @var int
- */
- private $threshold;
- /**
- * @param int $threshold
- */
- public function __construct($threshold = 30)
- {
- if (!is_int($threshold)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'integer'
- );
- }
- $this->threshold = $threshold;
- }
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @param string $name
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null, $name = null)
- {
- $document = new DOMDocument('1.0', 'UTF-8');
- $document->formatOutput = true;
- $root = $document->createElement('crap_result');
- $document->appendChild($root);
- $project = $document->createElement('project', is_string($name) ? $name : '');
- $root->appendChild($project);
- $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s', (int) $_SERVER['REQUEST_TIME'])));
- $stats = $document->createElement('stats');
- $methodsNode = $document->createElement('methods');
- $report = $coverage->getReport();
- unset($coverage);
- $fullMethodCount = 0;
- $fullCrapMethodCount = 0;
- $fullCrapLoad = 0;
- $fullCrap = 0;
- foreach ($report as $item) {
- $namespace = 'global';
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $file = $document->createElement('file');
- $file->setAttribute('name', $item->getPath());
- $classes = $item->getClassesAndTraits();
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- $crapLoad = $this->getCrapLoad($method['crap'], $method['ccn'], $method['coverage']);
- $fullCrap += $method['crap'];
- $fullCrapLoad += $crapLoad;
- $fullMethodCount++;
- if ($method['crap'] >= $this->threshold) {
- $fullCrapMethodCount++;
- }
- $methodNode = $document->createElement('method');
- if (!empty($class['package']['namespace'])) {
- $namespace = $class['package']['namespace'];
- }
- $methodNode->appendChild($document->createElement('package', $namespace));
- $methodNode->appendChild($document->createElement('className', $className));
- $methodNode->appendChild($document->createElement('methodName', $methodName));
- $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature'])));
- $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature'])));
- $methodNode->appendChild($document->createElement('crap', $this->roundValue($method['crap'])));
- $methodNode->appendChild($document->createElement('complexity', $method['ccn']));
- $methodNode->appendChild($document->createElement('coverage', $this->roundValue($method['coverage'])));
- $methodNode->appendChild($document->createElement('crapLoad', round($crapLoad)));
- $methodsNode->appendChild($methodNode);
- }
- }
- }
- $stats->appendChild($document->createElement('name', 'Method Crap Stats'));
- $stats->appendChild($document->createElement('methodCount', $fullMethodCount));
- $stats->appendChild($document->createElement('crapMethodCount', $fullCrapMethodCount));
- $stats->appendChild($document->createElement('crapLoad', round($fullCrapLoad)));
- $stats->appendChild($document->createElement('totalCrap', $fullCrap));
- if ($fullMethodCount > 0) {
- $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount);
- } else {
- $crapMethodPercent = '';
- }
- $stats->appendChild($document->createElement('crapMethodPercent', $crapMethodPercent));
- $root->appendChild($stats);
- $root->appendChild($methodsNode);
- if ($target !== null) {
- if (!is_dir(dirname($target))) {
- mkdir(dirname($target), 0777, true);
- }
- return $document->save($target);
- } else {
- return $document->saveXML();
- }
- }
- /**
- * @param float $crapValue
- * @param int $cyclomaticComplexity
- * @param float $coveragePercent
- * @return float
- */
- private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent)
- {
- $crapLoad = 0;
- if ($crapValue >= $this->threshold) {
- $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100);
- $crapLoad += $cyclomaticComplexity / $this->threshold;
- }
- return $crapLoad;
- }
- /**
- * @param float $value
- * @return float
- */
- private function roundValue($value)
- {
- return round($value, 2);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Tests
- {
- private $contextNode;
- private $codeMap = array(
- 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED
- 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED
- 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE
- 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE
- 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
- 5 => 'RISKY' // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY
- );
- public function __construct(DOMElement $context)
- {
- $this->contextNode = $context;
- }
- public function addTest($test, array $result)
- {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'test'
- )
- );
- $node->setAttribute('name', $test);
- $node->setAttribute('size', $result['size']);
- $node->setAttribute('result', (int) $result['status']);
- $node->setAttribute('status', $this->codeMap[(int) $result['status']]);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File
- {
- /**
- * @var DOMDocument
- */
- protected $dom;
- /**
- * @var DOMElement
- */
- protected $contextNode;
- public function __construct(DOMElement $context)
- {
- $this->dom = $context->ownerDocument;
- $this->contextNode = $context;
- }
- public function getTotals()
- {
- $totalsContainer = $this->contextNode->firstChild;
- if (!$totalsContainer) {
- $totalsContainer = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'totals'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer);
- }
- public function getLineCoverage($line)
- {
- $coverage = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'coverage'
- )->item(0);
- if (!$coverage) {
- $coverage = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'coverage'
- )
- );
- }
- $lineNode = $coverage->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'line'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Coverage($lineNode, $line);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Node
- {
- /**
- * @var DOMDocument
- */
- private $dom;
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context)
- {
- $this->setContextNode($context);
- }
- protected function setContextNode(DOMElement $context)
- {
- $this->dom = $context->ownerDocument;
- $this->contextNode = $context;
- }
- public function getDom()
- {
- return $this->dom;
- }
- protected function getContextNode()
- {
- return $this->contextNode;
- }
- public function getTotals()
- {
- $totalsContainer = $this->getContextNode()->firstChild;
- if (!$totalsContainer) {
- $totalsContainer = $this->getContextNode()->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'totals'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer);
- }
- public function addDirectory($name)
- {
- $dirNode = $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'directory'
- );
- $dirNode->setAttribute('name', $name);
- $this->getContextNode()->appendChild($dirNode);
- return new PHP_CodeCoverage_Report_XML_Directory($dirNode);
- }
- public function addFile($name, $href)
- {
- $fileNode = $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'file'
- );
- $fileNode->setAttribute('name', $name);
- $fileNode->setAttribute('href', $href);
- $this->getContextNode()->appendChild($fileNode);
- return new PHP_CodeCoverage_Report_XML_File($fileNode);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Project extends PHP_CodeCoverage_Report_XML_Node
- {
- public function __construct($name)
- {
- $this->init();
- $this->setProjectName($name);
- }
- private function init()
- {
- $dom = new DOMDocument;
- $dom->loadXML('<?xml version="1.0" ?><phpunit xmlns="http://schema.phpunit.de/coverage/1.0"><project/></phpunit>');
- $this->setContextNode(
- $dom->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'project'
- )->item(0)
- );
- }
- private function setProjectName($name)
- {
- $this->getContextNode()->setAttribute('name', $name);
- }
- public function getTests()
- {
- $testsNode = $this->getContextNode()->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'tests'
- )->item(0);
- if (!$testsNode) {
- $testsNode = $this->getContextNode()->appendChild(
- $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'tests'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Tests($testsNode);
- }
- public function asDom()
- {
- return $this->getDom();
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Totals
- {
- /**
- * @var DOMNode
- */
- private $container;
- /**
- * @var DOMElement
- */
- private $linesNode;
- /**
- * @var DOMElement
- */
- private $methodsNode;
- /**
- * @var DOMElement
- */
- private $functionsNode;
- /**
- * @var DOMElement
- */
- private $classesNode;
- /**
- * @var DOMElement
- */
- private $traitsNode;
- public function __construct(DOMElement $container)
- {
- $this->container = $container;
- $dom = $container->ownerDocument;
- $this->linesNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'lines'
- );
- $this->methodsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'methods'
- );
- $this->functionsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'functions'
- );
- $this->classesNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'classes'
- );
- $this->traitsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'traits'
- );
- $container->appendChild($this->linesNode);
- $container->appendChild($this->methodsNode);
- $container->appendChild($this->functionsNode);
- $container->appendChild($this->classesNode);
- $container->appendChild($this->traitsNode);
- }
- public function getContainer()
- {
- return $this->container;
- }
- public function setNumLines($loc, $cloc, $ncloc, $executable, $executed)
- {
- $this->linesNode->setAttribute('total', $loc);
- $this->linesNode->setAttribute('comments', $cloc);
- $this->linesNode->setAttribute('code', $ncloc);
- $this->linesNode->setAttribute('executable', $executable);
- $this->linesNode->setAttribute('executed', $executed);
- $this->linesNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($executed, $executable, true)
- );
- }
- public function setNumClasses($count, $tested)
- {
- $this->classesNode->setAttribute('count', $count);
- $this->classesNode->setAttribute('tested', $tested);
- $this->classesNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumTraits($count, $tested)
- {
- $this->traitsNode->setAttribute('count', $count);
- $this->traitsNode->setAttribute('tested', $tested);
- $this->traitsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumMethods($count, $tested)
- {
- $this->methodsNode->setAttribute('count', $count);
- $this->methodsNode->setAttribute('tested', $tested);
- $this->methodsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumFunctions($count, $tested)
- {
- $this->functionsNode->setAttribute('count', $count);
- $this->functionsNode->setAttribute('tested', $tested);
- $this->functionsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Directory extends PHP_CodeCoverage_Report_XML_Node
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Method
- {
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context, $name)
- {
- $this->contextNode = $context;
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function setSignature($signature)
- {
- $this->contextNode->setAttribute('signature', $signature);
- }
- public function setLines($start, $end = null)
- {
- $this->contextNode->setAttribute('start', $start);
- if ($end !== null) {
- $this->contextNode->setAttribute('end', $end);
- }
- }
- public function setTotals($executable, $executed, $coverage)
- {
- $this->contextNode->setAttribute('executable', $executable);
- $this->contextNode->setAttribute('executed', $executed);
- $this->contextNode->setAttribute('coverage', $coverage);
- }
- public function setCrap($crap)
- {
- $this->contextNode->setAttribute('crap', $crap);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Report extends PHP_CodeCoverage_Report_XML_File
- {
- public function __construct($name)
- {
- $this->dom = new DOMDocument;
- $this->dom->loadXML('<?xml version="1.0" ?><phpunit xmlns="http://schema.phpunit.de/coverage/1.0"><file /></phpunit>');
- $this->contextNode = $this->dom->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'file'
- )->item(0);
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function asDom()
- {
- return $this->dom;
- }
- public function getFunctionObject($name)
- {
- $node = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'function'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Method($node, $name);
- }
- public function getClassObject($name)
- {
- return $this->getUnitObject('class', $name);
- }
- public function getTraitObject($name)
- {
- return $this->getUnitObject('trait', $name);
- }
- private function getUnitObject($tagName, $name)
- {
- $node = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- $tagName
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Unit($node, $name);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Coverage
- {
- /**
- * @var XMLWriter
- */
- private $writer;
- /**
- * @var DOMElement
- */
- private $contextNode;
- /**
- * @var bool
- */
- private $finalized = false;
- public function __construct(DOMElement $context, $line)
- {
- $this->contextNode = $context;
- $this->writer = new XMLWriter();
- $this->writer->openMemory();
- $this->writer->startElementNs(null, $context->nodeName, 'http://schema.phpunit.de/coverage/1.0');
- $this->writer->writeAttribute('nr', $line);
- }
- public function addTest($test)
- {
- if ($this->finalized) {
- throw new PHP_CodeCoverage_Exception('Coverage Report already finalized');
- }
- $this->writer->startElement('covered');
- $this->writer->writeAttribute('by', $test);
- $this->writer->endElement();
- }
- public function finalize()
- {
- $this->writer->endElement();
- $fragment = $this->contextNode->ownerDocument->createDocumentFragment();
- $fragment->appendXML($this->writer->outputMemory());
- $this->contextNode->parentNode->replaceChild(
- $fragment,
- $this->contextNode
- );
- $this->finalized = true;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Unit
- {
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context, $name)
- {
- $this->contextNode = $context;
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function setLines($start, $executable, $executed)
- {
- $this->contextNode->setAttribute('start', $start);
- $this->contextNode->setAttribute('executable', $executable);
- $this->contextNode->setAttribute('executed', $executed);
- }
- public function setCrap($crap)
- {
- $this->contextNode->setAttribute('crap', $crap);
- }
- public function setPackage($full, $package, $sub, $category)
- {
- $node = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'package'
- )->item(0);
- if (!$node) {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'package'
- )
- );
- }
- $node->setAttribute('full', $full);
- $node->setAttribute('name', $package);
- $node->setAttribute('sub', $sub);
- $node->setAttribute('category', $category);
- }
- public function setNamespace($namespace)
- {
- $node = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'namespace'
- )->item(0);
- if (!$node) {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'namespace'
- )
- );
- }
- $node->setAttribute('name', $namespace);
- }
- public function addMethod($name)
- {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'method'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Method($node, $name);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for nodes in the code coverage information tree.
- *
- * @since Class available since Release 1.1.0
- */
- abstract class PHP_CodeCoverage_Report_Node implements Countable
- {
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $path;
- /**
- * @var array
- */
- protected $pathArray;
- /**
- * @var PHP_CodeCoverage_Report_Node
- */
- protected $parent;
- /**
- * @var string
- */
- protected $id;
- /**
- * Constructor.
- *
- * @param string $name
- * @param PHP_CodeCoverage_Report_Node $parent
- */
- public function __construct($name, PHP_CodeCoverage_Report_Node $parent = null)
- {
- if (substr($name, -1) == '/') {
- $name = substr($name, 0, -1);
- }
- $this->name = $name;
- $this->parent = $parent;
- }
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * @return string
- */
- public function getId()
- {
- if ($this->id === null) {
- $parent = $this->getParent();
- if ($parent === null) {
- $this->id = 'index';
- } else {
- $parentId = $parent->getId();
- if ($parentId == 'index') {
- $this->id = str_replace(':', '_', $this->name);
- } else {
- $this->id = $parentId . '/' . $this->name;
- }
- }
- }
- return $this->id;
- }
- /**
- * @return string
- */
- public function getPath()
- {
- if ($this->path === null) {
- if ($this->parent === null || $this->parent->getPath() === null || $this->parent->getPath() === false) {
- $this->path = $this->name;
- } else {
- $this->path = $this->parent->getPath() . '/' . $this->name;
- }
- }
- return $this->path;
- }
- /**
- * @return array
- */
- public function getPathAsArray()
- {
- if ($this->pathArray === null) {
- if ($this->parent === null) {
- $this->pathArray = array();
- } else {
- $this->pathArray = $this->parent->getPathAsArray();
- }
- $this->pathArray[] = $this;
- }
- return $this->pathArray;
- }
- /**
- * @return PHP_CodeCoverage_Report_Node
- */
- public function getParent()
- {
- return $this->parent;
- }
- /**
- * Returns the percentage of classes that has been tested.
- *
- * @param bool $asString
- * @return int
- */
- public function getTestedClassesPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedClasses(),
- $this->getNumClasses(),
- $asString
- );
- }
- /**
- * Returns the percentage of traits that has been tested.
- *
- * @param bool $asString
- * @return int
- */
- public function getTestedTraitsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedTraits(),
- $this->getNumTraits(),
- $asString
- );
- }
- /**
- * Returns the percentage of traits that has been tested.
- *
- * @param bool $asString
- * @return int
- * @since Method available since Release 1.2.0
- */
- public function getTestedClassesAndTraitsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedClassesAndTraits(),
- $this->getNumClassesAndTraits(),
- $asString
- );
- }
- /**
- * Returns the percentage of methods that has been tested.
- *
- * @param bool $asString
- * @return int
- */
- public function getTestedMethodsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedMethods(),
- $this->getNumMethods(),
- $asString
- );
- }
- /**
- * Returns the percentage of executed lines.
- *
- * @param bool $asString
- * @return int
- */
- public function getLineExecutedPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumExecutedLines(),
- $this->getNumExecutableLines(),
- $asString
- );
- }
- /**
- * Returns the number of classes and traits.
- *
- * @return int
- * @since Method available since Release 1.2.0
- */
- public function getNumClassesAndTraits()
- {
- return $this->getNumClasses() + $this->getNumTraits();
- }
- /**
- * Returns the number of tested classes and traits.
- *
- * @return int
- * @since Method available since Release 1.2.0
- */
- public function getNumTestedClassesAndTraits()
- {
- return $this->getNumTestedClasses() + $this->getNumTestedTraits();
- }
- /**
- * Returns the classes and traits of this node.
- *
- * @return array
- * @since Method available since Release 1.2.0
- */
- public function getClassesAndTraits()
- {
- return array_merge($this->getClasses(), $this->getTraits());
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- abstract public function getClasses();
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- abstract public function getTraits();
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- abstract public function getFunctions();
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- abstract public function getLinesOfCode();
- /**
- * Returns the number of executable lines.
- *
- * @return int
- */
- abstract public function getNumExecutableLines();
- /**
- * Returns the number of executed lines.
- *
- * @return int
- */
- abstract public function getNumExecutedLines();
- /**
- * Returns the number of classes.
- *
- * @return int
- */
- abstract public function getNumClasses();
- /**
- * Returns the number of tested classes.
- *
- * @return int
- */
- abstract public function getNumTestedClasses();
- /**
- * Returns the number of traits.
- *
- * @return int
- */
- abstract public function getNumTraits();
- /**
- * Returns the number of tested traits.
- *
- * @return int
- */
- abstract public function getNumTestedTraits();
- /**
- * Returns the number of methods.
- *
- * @return int
- */
- abstract public function getNumMethods();
- /**
- * Returns the number of tested methods.
- *
- * @return int
- */
- abstract public function getNumTestedMethods();
- /**
- * Returns the number of functions.
- *
- * @return int
- */
- abstract public function getNumFunctions();
- /**
- * Returns the number of tested functions.
- *
- * @return int
- */
- abstract public function getNumTestedFunctions();
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Recursive iterator for PHP_CodeCoverage_Report_Node object graphs.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_Iterator implements RecursiveIterator
- {
- /**
- * @var int
- */
- protected $position;
- /**
- * @var PHP_CodeCoverage_Report_Node[]
- */
- protected $nodes;
- /**
- * Constructor.
- *
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- */
- public function __construct(PHP_CodeCoverage_Report_Node_Directory $node)
- {
- $this->nodes = $node->getChildNodes();
- }
- /**
- * Rewinds the Iterator to the first element.
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * Checks if there is a current element after calls to rewind() or next().
- *
- * @return bool
- */
- public function valid()
- {
- return $this->position < count($this->nodes);
- }
- /**
- * Returns the key of the current element.
- *
- * @return int
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * Returns the current element.
- *
- * @return PHPUnit_Framework_Test
- */
- public function current()
- {
- return $this->valid() ? $this->nodes[$this->position] : null;
- }
- /**
- * Moves forward to next element.
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * Returns the sub iterator for the current element.
- *
- * @return PHP_CodeCoverage_Report_Node_Iterator
- */
- public function getChildren()
- {
- return new self(
- $this->nodes[$this->position]
- );
- }
- /**
- * Checks whether the current element has children.
- *
- * @return bool
- */
- public function hasChildren()
- {
- return $this->nodes[$this->position] instanceof PHP_CodeCoverage_Report_Node_Directory;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a file in the code coverage information tree.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node
- {
- /**
- * @var array
- */
- protected $coverageData;
- /**
- * @var array
- */
- protected $testData;
- /**
- * @var int
- */
- protected $numExecutableLines = 0;
- /**
- * @var int
- */
- protected $numExecutedLines = 0;
- /**
- * @var array
- */
- protected $classes = array();
- /**
- * @var array
- */
- protected $traits = array();
- /**
- * @var array
- */
- protected $functions = array();
- /**
- * @var array
- */
- protected $linesOfCode = array();
- /**
- * @var int
- */
- protected $numTestedTraits = 0;
- /**
- * @var int
- */
- protected $numTestedClasses = 0;
- /**
- * @var int
- */
- protected $numMethods = null;
- /**
- * @var int
- */
- protected $numTestedMethods = null;
- /**
- * @var int
- */
- protected $numTestedFunctions = null;
- /**
- * @var array
- */
- protected $startLines = array();
- /**
- * @var array
- */
- protected $endLines = array();
- /**
- * @var bool
- */
- protected $cacheTokens;
- /**
- * Constructor.
- *
- * @param string $name
- * @param PHP_CodeCoverage_Report_Node $parent
- * @param array $coverageData
- * @param array $testData
- * @param bool $cacheTokens
- * @throws PHP_CodeCoverage_Exception
- */
- public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens)
- {
- if (!is_bool($cacheTokens)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- parent::__construct($name, $parent);
- $this->coverageData = $coverageData;
- $this->testData = $testData;
- $this->cacheTokens = $cacheTokens;
- $this->calculateStatistics();
- }
- /**
- * Returns the number of files in/under this node.
- *
- * @return int
- */
- public function count()
- {
- return 1;
- }
- /**
- * Returns the code coverage data of this node.
- *
- * @return array
- */
- public function getCoverageData()
- {
- return $this->coverageData;
- }
- /**
- * Returns the test data of this node.
- *
- * @return array
- */
- public function getTestData()
- {
- return $this->testData;
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- public function getClasses()
- {
- return $this->classes;
- }
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- public function getTraits()
- {
- return $this->traits;
- }
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- public function getFunctions()
- {
- return $this->functions;
- }
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- public function getLinesOfCode()
- {
- return $this->linesOfCode;
- }
- /**
- * Returns the number of executable lines.
- *
- * @return int
- */
- public function getNumExecutableLines()
- {
- return $this->numExecutableLines;
- }
- /**
- * Returns the number of executed lines.
- *
- * @return int
- */
- public function getNumExecutedLines()
- {
- return $this->numExecutedLines;
- }
- /**
- * Returns the number of classes.
- *
- * @return int
- */
- public function getNumClasses()
- {
- return count($this->classes);
- }
- /**
- * Returns the number of tested classes.
- *
- * @return int
- */
- public function getNumTestedClasses()
- {
- return $this->numTestedClasses;
- }
- /**
- * Returns the number of traits.
- *
- * @return int
- */
- public function getNumTraits()
- {
- return count($this->traits);
- }
- /**
- * Returns the number of tested traits.
- *
- * @return int
- */
- public function getNumTestedTraits()
- {
- return $this->numTestedTraits;
- }
- /**
- * Returns the number of methods.
- *
- * @return int
- */
- public function getNumMethods()
- {
- if ($this->numMethods === null) {
- $this->numMethods = 0;
- foreach ($this->classes as $class) {
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] > 0) {
- $this->numMethods++;
- }
- }
- }
- foreach ($this->traits as $trait) {
- foreach ($trait['methods'] as $method) {
- if ($method['executableLines'] > 0) {
- $this->numMethods++;
- }
- }
- }
- }
- return $this->numMethods;
- }
- /**
- * Returns the number of tested methods.
- *
- * @return int
- */
- public function getNumTestedMethods()
- {
- if ($this->numTestedMethods === null) {
- $this->numTestedMethods = 0;
- foreach ($this->classes as $class) {
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] > 0 &&
- $method['coverage'] == 100) {
- $this->numTestedMethods++;
- }
- }
- }
- foreach ($this->traits as $trait) {
- foreach ($trait['methods'] as $method) {
- if ($method['executableLines'] > 0 &&
- $method['coverage'] == 100) {
- $this->numTestedMethods++;
- }
- }
- }
- }
- return $this->numTestedMethods;
- }
- /**
- * Returns the number of functions.
- *
- * @return int
- */
- public function getNumFunctions()
- {
- return count($this->functions);
- }
- /**
- * Returns the number of tested functions.
- *
- * @return int
- */
- public function getNumTestedFunctions()
- {
- if ($this->numTestedFunctions === null) {
- $this->numTestedFunctions = 0;
- foreach ($this->functions as $function) {
- if ($function['executableLines'] > 0 &&
- $function['coverage'] == 100) {
- $this->numTestedFunctions++;
- }
- }
- }
- return $this->numTestedFunctions;
- }
- /**
- * Calculates coverage statistics for the file.
- */
- protected function calculateStatistics()
- {
- if ($this->cacheTokens) {
- $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath());
- } else {
- $tokens = new PHP_Token_Stream($this->getPath());
- }
- $this->processClasses($tokens);
- $this->processTraits($tokens);
- $this->processFunctions($tokens);
- $this->linesOfCode = $tokens->getLinesOfCode();
- unset($tokens);
- for ($lineNumber = 1; $lineNumber <= $this->linesOfCode['loc']; $lineNumber++) {
- if (isset($this->startLines[$lineNumber])) {
- // Start line of a class.
- if (isset($this->startLines[$lineNumber]['className'])) {
- $currentClass = &$this->startLines[$lineNumber];
- } // Start line of a trait.
- elseif (isset($this->startLines[$lineNumber]['traitName'])) {
- $currentTrait = &$this->startLines[$lineNumber];
- } // Start line of a method.
- elseif (isset($this->startLines[$lineNumber]['methodName'])) {
- $currentMethod = &$this->startLines[$lineNumber];
- } // Start line of a function.
- elseif (isset($this->startLines[$lineNumber]['functionName'])) {
- $currentFunction = &$this->startLines[$lineNumber];
- }
- }
- if (isset($this->coverageData[$lineNumber]) &&
- $this->coverageData[$lineNumber] !== null) {
- if (isset($currentClass)) {
- $currentClass['executableLines']++;
- }
- if (isset($currentTrait)) {
- $currentTrait['executableLines']++;
- }
- if (isset($currentMethod)) {
- $currentMethod['executableLines']++;
- }
- if (isset($currentFunction)) {
- $currentFunction['executableLines']++;
- }
- $this->numExecutableLines++;
- if (count($this->coverageData[$lineNumber]) > 0) {
- if (isset($currentClass)) {
- $currentClass['executedLines']++;
- }
- if (isset($currentTrait)) {
- $currentTrait['executedLines']++;
- }
- if (isset($currentMethod)) {
- $currentMethod['executedLines']++;
- }
- if (isset($currentFunction)) {
- $currentFunction['executedLines']++;
- }
- $this->numExecutedLines++;
- }
- }
- if (isset($this->endLines[$lineNumber])) {
- // End line of a class.
- if (isset($this->endLines[$lineNumber]['className'])) {
- unset($currentClass);
- } // End line of a trait.
- elseif (isset($this->endLines[$lineNumber]['traitName'])) {
- unset($currentTrait);
- } // End line of a method.
- elseif (isset($this->endLines[$lineNumber]['methodName'])) {
- unset($currentMethod);
- } // End line of a function.
- elseif (isset($this->endLines[$lineNumber]['functionName'])) {
- unset($currentFunction);
- }
- }
- }
- foreach ($this->traits as &$trait) {
- foreach ($trait['methods'] as &$method) {
- if ($method['executableLines'] > 0) {
- $method['coverage'] = ($method['executedLines'] /
- $method['executableLines']) * 100;
- } else {
- $method['coverage'] = 100;
- }
- $method['crap'] = $this->crap(
- $method['ccn'],
- $method['coverage']
- );
- $trait['ccn'] += $method['ccn'];
- }
- if ($trait['executableLines'] > 0) {
- $trait['coverage'] = ($trait['executedLines'] /
- $trait['executableLines']) * 100;
- } else {
- $trait['coverage'] = 100;
- }
- if ($trait['coverage'] == 100) {
- $this->numTestedClasses++;
- }
- $trait['crap'] = $this->crap(
- $trait['ccn'],
- $trait['coverage']
- );
- }
- foreach ($this->classes as &$class) {
- foreach ($class['methods'] as &$method) {
- if ($method['executableLines'] > 0) {
- $method['coverage'] = ($method['executedLines'] /
- $method['executableLines']) * 100;
- } else {
- $method['coverage'] = 100;
- }
- $method['crap'] = $this->crap(
- $method['ccn'],
- $method['coverage']
- );
- $class['ccn'] += $method['ccn'];
- }
- if ($class['executableLines'] > 0) {
- $class['coverage'] = ($class['executedLines'] /
- $class['executableLines']) * 100;
- } else {
- $class['coverage'] = 100;
- }
- if ($class['coverage'] == 100) {
- $this->numTestedClasses++;
- }
- $class['crap'] = $this->crap(
- $class['ccn'],
- $class['coverage']
- );
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processClasses(PHP_Token_Stream $tokens)
- {
- $classes = $tokens->getClasses();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($classes as $className => $class) {
- $this->classes[$className] = array(
- 'className' => $className,
- 'methods' => array(),
- 'startLine' => $class['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => 0,
- 'coverage' => 0,
- 'crap' => 0,
- 'package' => $class['package'],
- 'link' => $link . $class['startLine']
- );
- $this->startLines[$class['startLine']] = &$this->classes[$className];
- $this->endLines[$class['endLine']] = &$this->classes[$className];
- foreach ($class['methods'] as $methodName => $method) {
- $this->classes[$className]['methods'][$methodName] = array(
- 'methodName' => $methodName,
- 'signature' => $method['signature'],
- 'startLine' => $method['startLine'],
- 'endLine' => $method['endLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $method['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $method['startLine']
- );
- $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName];
- $this->endLines[$method['endLine']] = &$this->classes[$className]['methods'][$methodName];
- }
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processTraits(PHP_Token_Stream $tokens)
- {
- $traits = $tokens->getTraits();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($traits as $traitName => $trait) {
- $this->traits[$traitName] = array(
- 'traitName' => $traitName,
- 'methods' => array(),
- 'startLine' => $trait['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => 0,
- 'coverage' => 0,
- 'crap' => 0,
- 'package' => $trait['package'],
- 'link' => $link . $trait['startLine']
- );
- $this->startLines[$trait['startLine']] = &$this->traits[$traitName];
- $this->endLines[$trait['endLine']] = &$this->traits[$traitName];
- foreach ($trait['methods'] as $methodName => $method) {
- $this->traits[$traitName]['methods'][$methodName] = array(
- 'methodName' => $methodName,
- 'signature' => $method['signature'],
- 'startLine' => $method['startLine'],
- 'endLine' => $method['endLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $method['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $method['startLine']
- );
- $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName];
- $this->endLines[$method['endLine']] = &$this->traits[$traitName]['methods'][$methodName];
- }
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processFunctions(PHP_Token_Stream $tokens)
- {
- $functions = $tokens->getFunctions();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($functions as $functionName => $function) {
- $this->functions[$functionName] = array(
- 'functionName' => $functionName,
- 'signature' => $function['signature'],
- 'startLine' => $function['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $function['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $function['startLine']
- );
- $this->startLines[$function['startLine']] = &$this->functions[$functionName];
- $this->endLines[$function['endLine']] = &$this->functions[$functionName];
- }
- }
- /**
- * Calculates the Change Risk Anti-Patterns (CRAP) index for a unit of code
- * based on its cyclomatic complexity and percentage of code coverage.
- *
- * @param int $ccn
- * @param float $coverage
- * @return string
- * @since Method available since Release 1.2.0
- */
- protected function crap($ccn, $coverage)
- {
- if ($coverage == 0) {
- return (string) (pow($ccn, 2) + $ccn);
- }
- if ($coverage >= 95) {
- return (string) $ccn;
- }
- return sprintf(
- '%01.2F',
- pow($ccn, 2) * pow(1 - $coverage/100, 3) + $ccn
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a directory in the code coverage information tree.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_Directory extends PHP_CodeCoverage_Report_Node implements IteratorAggregate
- {
- /**
- * @var PHP_CodeCoverage_Report_Node[]
- */
- protected $children = array();
- /**
- * @var PHP_CodeCoverage_Report_Node_Directory[]
- */
- protected $directories = array();
- /**
- * @var PHP_CodeCoverage_Report_Node_File[]
- */
- protected $files = array();
- /**
- * @var array
- */
- protected $classes;
- /**
- * @var array
- */
- protected $traits;
- /**
- * @var array
- */
- protected $functions;
- /**
- * @var array
- */
- protected $linesOfCode = null;
- /**
- * @var int
- */
- protected $numFiles = -1;
- /**
- * @var int
- */
- protected $numExecutableLines = -1;
- /**
- * @var int
- */
- protected $numExecutedLines = -1;
- /**
- * @var int
- */
- protected $numClasses = -1;
- /**
- * @var int
- */
- protected $numTestedClasses = -1;
- /**
- * @var int
- */
- protected $numTraits = -1;
- /**
- * @var int
- */
- protected $numTestedTraits = -1;
- /**
- * @var int
- */
- protected $numMethods = -1;
- /**
- * @var int
- */
- protected $numTestedMethods = -1;
- /**
- * @var int
- */
- protected $numFunctions = -1;
- /**
- * @var int
- */
- protected $numTestedFunctions = -1;
- /**
- * Returns the number of files in/under this node.
- *
- * @return int
- */
- public function count()
- {
- if ($this->numFiles == -1) {
- $this->numFiles = 0;
- foreach ($this->children as $child) {
- $this->numFiles += count($child);
- }
- }
- return $this->numFiles;
- }
- /**
- * Returns an iterator for this node.
- *
- * @return RecursiveIteratorIterator
- */
- public function getIterator()
- {
- return new RecursiveIteratorIterator(
- new PHP_CodeCoverage_Report_Node_Iterator($this),
- RecursiveIteratorIterator::SELF_FIRST
- );
- }
- /**
- * Adds a new directory.
- *
- * @param string $name
- * @return PHP_CodeCoverage_Report_Node_Directory
- */
- public function addDirectory($name)
- {
- $directory = new self($name, $this);
- $this->children[] = $directory;
- $this->directories[] = &$this->children[count($this->children) - 1];
- return $directory;
- }
- /**
- * Adds a new file.
- *
- * @param string $name
- * @param array $coverageData
- * @param array $testData
- * @param bool $cacheTokens
- * @return PHP_CodeCoverage_Report_Node_File
- * @throws PHP_CodeCoverage_Exception
- */
- public function addFile($name, array $coverageData, array $testData, $cacheTokens)
- {
- $file = new PHP_CodeCoverage_Report_Node_File(
- $name,
- $this,
- $coverageData,
- $testData,
- $cacheTokens
- );
- $this->children[] = $file;
- $this->files[] = &$this->children[count($this->children) - 1];
- $this->numExecutableLines = -1;
- $this->numExecutedLines = -1;
- return $file;
- }
- /**
- * Returns the directories in this directory.
- *
- * @return array
- */
- public function getDirectories()
- {
- return $this->directories;
- }
- /**
- * Returns the files in this directory.
- *
- * @return array
- */
- public function getFiles()
- {
- return $this->files;
- }
- /**
- * Returns the child nodes of this node.
- *
- * @return array
- */
- public function getChildNodes()
- {
- return $this->children;
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- public function getClasses()
- {
- if ($this->classes === null) {
- $this->classes = array();
- foreach ($this->children as $child) {
- $this->classes = array_merge(
- $this->classes,
- $child->getClasses()
- );
- }
- }
- return $this->classes;
- }
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- public function getTraits()
- {
- if ($this->traits === null) {
- $this->traits = array();
- foreach ($this->children as $child) {
- $this->traits = array_merge(
- $this->traits,
- $child->getTraits()
- );
- }
- }
- return $this->traits;
- }
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- public function getFunctions()
- {
- if ($this->functions === null) {
- $this->functions = array();
- foreach ($this->children as $child) {
- $this->functions = array_merge(
- $this->functions,
- $child->getFunctions()
- );
- }
- }
- return $this->functions;
- }
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- public function getLinesOfCode()
- {
- if ($this->linesOfCode === null) {
- $this->linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
- foreach ($this->children as $child) {
- $linesOfCode = $child->getLinesOfCode();
- $this->linesOfCode['loc'] += $linesOfCode['loc'];
- $this->linesOfCode['cloc'] += $linesOfCode['cloc'];
- $this->linesOfCode['ncloc'] += $linesOfCode['ncloc'];
- }
- }
- return $this->linesOfCode;
- }
- /**
- * Returns the number of executable lines.
- *
- * @return int
- */
- public function getNumExecutableLines()
- {
- if ($this->numExecutableLines == -1) {
- $this->numExecutableLines = 0;
- foreach ($this->children as $child) {
- $this->numExecutableLines += $child->getNumExecutableLines();
- }
- }
- return $this->numExecutableLines;
- }
- /**
- * Returns the number of executed lines.
- *
- * @return int
- */
- public function getNumExecutedLines()
- {
- if ($this->numExecutedLines == -1) {
- $this->numExecutedLines = 0;
- foreach ($this->children as $child) {
- $this->numExecutedLines += $child->getNumExecutedLines();
- }
- }
- return $this->numExecutedLines;
- }
- /**
- * Returns the number of classes.
- *
- * @return int
- */
- public function getNumClasses()
- {
- if ($this->numClasses == -1) {
- $this->numClasses = 0;
- foreach ($this->children as $child) {
- $this->numClasses += $child->getNumClasses();
- }
- }
- return $this->numClasses;
- }
- /**
- * Returns the number of tested classes.
- *
- * @return int
- */
- public function getNumTestedClasses()
- {
- if ($this->numTestedClasses == -1) {
- $this->numTestedClasses = 0;
- foreach ($this->children as $child) {
- $this->numTestedClasses += $child->getNumTestedClasses();
- }
- }
- return $this->numTestedClasses;
- }
- /**
- * Returns the number of traits.
- *
- * @return int
- */
- public function getNumTraits()
- {
- if ($this->numTraits == -1) {
- $this->numTraits = 0;
- foreach ($this->children as $child) {
- $this->numTraits += $child->getNumTraits();
- }
- }
- return $this->numTraits;
- }
- /**
- * Returns the number of tested traits.
- *
- * @return int
- */
- public function getNumTestedTraits()
- {
- if ($this->numTestedTraits == -1) {
- $this->numTestedTraits = 0;
- foreach ($this->children as $child) {
- $this->numTestedTraits += $child->getNumTestedTraits();
- }
- }
- return $this->numTestedTraits;
- }
- /**
- * Returns the number of methods.
- *
- * @return int
- */
- public function getNumMethods()
- {
- if ($this->numMethods == -1) {
- $this->numMethods = 0;
- foreach ($this->children as $child) {
- $this->numMethods += $child->getNumMethods();
- }
- }
- return $this->numMethods;
- }
- /**
- * Returns the number of tested methods.
- *
- * @return int
- */
- public function getNumTestedMethods()
- {
- if ($this->numTestedMethods == -1) {
- $this->numTestedMethods = 0;
- foreach ($this->children as $child) {
- $this->numTestedMethods += $child->getNumTestedMethods();
- }
- }
- return $this->numTestedMethods;
- }
- /**
- * Returns the number of functions.
- *
- * @return int
- */
- public function getNumFunctions()
- {
- if ($this->numFunctions == -1) {
- $this->numFunctions = 0;
- foreach ($this->children as $child) {
- $this->numFunctions += $child->getNumFunctions();
- }
- }
- return $this->numFunctions;
- }
- /**
- * Returns the number of tested functions.
- *
- * @return int
- */
- public function getNumTestedFunctions()
- {
- if ($this->numTestedFunctions == -1) {
- $this->numTestedFunctions = 0;
- foreach ($this->children as $child) {
- $this->numTestedFunctions += $child->getNumTestedFunctions();
- }
- }
- return $this->numTestedFunctions;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates a Clover XML logfile from an PHP_CodeCoverage object.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Report_Clover
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @param string $name
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null, $name = null)
- {
- $xmlDocument = new DOMDocument('1.0', 'UTF-8');
- $xmlDocument->formatOutput = true;
- $xmlCoverage = $xmlDocument->createElement('coverage');
- $xmlCoverage->setAttribute('generated', (int) $_SERVER['REQUEST_TIME']);
- $xmlDocument->appendChild($xmlCoverage);
- $xmlProject = $xmlDocument->createElement('project');
- $xmlProject->setAttribute('timestamp', (int) $_SERVER['REQUEST_TIME']);
- if (is_string($name)) {
- $xmlProject->setAttribute('name', $name);
- }
- $xmlCoverage->appendChild($xmlProject);
- $packages = array();
- $report = $coverage->getReport();
- unset($coverage);
- foreach ($report as $item) {
- $namespace = 'global';
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $xmlFile = $xmlDocument->createElement('file');
- $xmlFile->setAttribute('name', $item->getPath());
- $classes = $item->getClassesAndTraits();
- $coverage = $item->getCoverageData();
- $lines = array();
- foreach ($classes as $className => $class) {
- $classStatements = 0;
- $coveredClassStatements = 0;
- $coveredMethods = 0;
- $classMethods = 0;
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['executableLines'] == 0) {
- continue;
- }
- $classMethods++;
- $classStatements += $method['executableLines'];
- $coveredClassStatements += $method['executedLines'];
- if ($method['coverage'] == 100) {
- $coveredMethods++;
- }
- $methodCount = 0;
- for ($i = $method['startLine'];
- $i <= $method['endLine'];
- $i++) {
- if (isset($coverage[$i]) && ($coverage[$i] !== null)) {
- $methodCount = max($methodCount, count($coverage[$i]));
- }
- }
- $lines[$method['startLine']] = array(
- 'count' => $methodCount,
- 'crap' => $method['crap'],
- 'type' => 'method',
- 'name' => $methodName
- );
- }
- if (!empty($class['package']['namespace'])) {
- $namespace = $class['package']['namespace'];
- }
- $xmlClass = $xmlDocument->createElement('class');
- $xmlClass->setAttribute('name', $className);
- $xmlClass->setAttribute('namespace', $namespace);
- if (!empty($class['package']['fullPackage'])) {
- $xmlClass->setAttribute(
- 'fullPackage',
- $class['package']['fullPackage']
- );
- }
- if (!empty($class['package']['category'])) {
- $xmlClass->setAttribute(
- 'category',
- $class['package']['category']
- );
- }
- if (!empty($class['package']['package'])) {
- $xmlClass->setAttribute(
- 'package',
- $class['package']['package']
- );
- }
- if (!empty($class['package']['subpackage'])) {
- $xmlClass->setAttribute(
- 'subpackage',
- $class['package']['subpackage']
- );
- }
- $xmlFile->appendChild($xmlClass);
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('methods', $classMethods);
- $xmlMetrics->setAttribute('coveredmethods', $coveredMethods);
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute('statements', $classStatements);
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $coveredClassStatements
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $classMethods +
- $classStatements
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $coveredMethods +
- $coveredClassStatements
- /* + coveredconditionals */
- );
- $xmlClass->appendChild($xmlMetrics);
- }
- foreach ($coverage as $line => $data) {
- if ($data === null || isset($lines[$line])) {
- continue;
- }
- $lines[$line] = array(
- 'count' => count($data), 'type' => 'stmt'
- );
- }
- ksort($lines);
- foreach ($lines as $line => $data) {
- $xmlLine = $xmlDocument->createElement('line');
- $xmlLine->setAttribute('num', $line);
- $xmlLine->setAttribute('type', $data['type']);
- if (isset($data['name'])) {
- $xmlLine->setAttribute('name', $data['name']);
- }
- if (isset($data['crap'])) {
- $xmlLine->setAttribute('crap', $data['crap']);
- }
- $xmlLine->setAttribute('count', $data['count']);
- $xmlFile->appendChild($xmlLine);
- }
- $linesOfCode = $item->getLinesOfCode();
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
- $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
- $xmlMetrics->setAttribute('classes', $item->getNumClassesAndTraits());
- $xmlMetrics->setAttribute('methods', $item->getNumMethods());
- $xmlMetrics->setAttribute(
- 'coveredmethods',
- $item->getNumTestedMethods()
- );
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute(
- 'statements',
- $item->getNumExecutableLines()
- );
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $item->getNumExecutedLines()
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $item->getNumMethods() + $item->getNumExecutableLines()
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $item->getNumTestedMethods() + $item->getNumExecutedLines()
- /* + coveredconditionals */
- );
- $xmlFile->appendChild($xmlMetrics);
- if ($namespace == 'global') {
- $xmlProject->appendChild($xmlFile);
- } else {
- if (!isset($packages[$namespace])) {
- $packages[$namespace] = $xmlDocument->createElement(
- 'package'
- );
- $packages[$namespace]->setAttribute('name', $namespace);
- $xmlProject->appendChild($packages[$namespace]);
- }
- $packages[$namespace]->appendChild($xmlFile);
- }
- }
- $linesOfCode = $report->getLinesOfCode();
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('files', count($report));
- $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
- $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
- $xmlMetrics->setAttribute(
- 'classes',
- $report->getNumClassesAndTraits()
- );
- $xmlMetrics->setAttribute('methods', $report->getNumMethods());
- $xmlMetrics->setAttribute(
- 'coveredmethods',
- $report->getNumTestedMethods()
- );
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute(
- 'statements',
- $report->getNumExecutableLines()
- );
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $report->getNumExecutedLines()
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $report->getNumMethods() + $report->getNumExecutableLines()
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $report->getNumTestedMethods() + $report->getNumExecutedLines()
- /* + coveredconditionals */
- );
- $xmlProject->appendChild($xmlMetrics);
- if ($target !== null) {
- if (!is_dir(dirname($target))) {
- mkdir(dirname($target), 0777, true);
- }
- return $xmlDocument->save($target);
- } else {
- return $xmlDocument->saveXML();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates an HTML report from an PHP_CodeCoverage object.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Report_HTML
- {
- /**
- * @var string
- */
- private $templatePath;
- /**
- * @var string
- */
- private $generator;
- /**
- * @var int
- */
- private $lowUpperBound;
- /**
- * @var int
- */
- private $highLowerBound;
- /**
- * Constructor.
- *
- * @param int $lowUpperBound
- * @param int $highLowerBound
- * @param string $generator
- */
- public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generator = '')
- {
- $this->generator = $generator;
- $this->highLowerBound = $highLowerBound;
- $this->lowUpperBound = $lowUpperBound;
- $this->templatePath = sprintf(
- '%s%sHTML%sRenderer%sTemplate%s',
- dirname(__FILE__),
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR
- );
- }
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- */
- public function process(PHP_CodeCoverage $coverage, $target)
- {
- $target = $this->getDirectory($target);
- $report = $coverage->getReport();
- unset($coverage);
- if (!isset($_SERVER['REQUEST_TIME'])) {
- $_SERVER['REQUEST_TIME'] = time();
- }
- $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']);
- $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $file = new PHP_CodeCoverage_Report_HTML_Renderer_File(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $directory->render($report, $target . 'index.html');
- $dashboard->render($report, $target . 'dashboard.html');
- foreach ($report as $node) {
- $id = $node->getId();
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- if (!file_exists($target . $id)) {
- mkdir($target . $id, 0777, true);
- }
- $directory->render($node, $target . $id . '/index.html');
- $dashboard->render($node, $target . $id . '/dashboard.html');
- } else {
- $dir = dirname($target . $id);
- if (!file_exists($dir)) {
- mkdir($dir, 0777, true);
- }
- $file->render($node, $target . $id . '.html');
- }
- }
- $this->copyFiles($target);
- }
- /**
- * @param string $target
- */
- private function copyFiles($target)
- {
- $dir = $this->getDirectory($target . 'css');
- copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css');
- copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css');
- copy($this->templatePath . 'css/style.css', $dir . 'style.css');
- $dir = $this->getDirectory($target . 'fonts');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.eot', $dir . 'glyphicons-halflings-regular.eot');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.svg', $dir . 'glyphicons-halflings-regular.svg');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.ttf', $dir . 'glyphicons-halflings-regular.ttf');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff', $dir . 'glyphicons-halflings-regular.woff');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff2', $dir . 'glyphicons-halflings-regular.woff2');
- $dir = $this->getDirectory($target . 'js');
- copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js');
- copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js');
- copy($this->templatePath . 'js/holder.min.js', $dir . 'holder.min.js');
- copy($this->templatePath . 'js/html5shiv.min.js', $dir . 'html5shiv.min.js');
- copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js');
- copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js');
- copy($this->templatePath . 'js/respond.min.js', $dir . 'respond.min.js');
- }
- /**
- * @param string $directory
- * @return string
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 1.2.0
- */
- private function getDirectory($directory)
- {
- if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) {
- $directory .= DIRECTORY_SEPARATOR;
- }
- if (is_dir($directory)) {
- return $directory;
- }
- if (@mkdir($directory, 0777, true)) {
- return $directory;
- }
- throw new PHP_CodeCoverage_Exception(
- sprintf(
- 'Directory "%s" does not exist.',
- $directory
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHP_CodeCoverage_Report_Node_* object graphs.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Factory
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @return PHP_CodeCoverage_Report_Node_Directory
- */
- public function create(PHP_CodeCoverage $coverage)
- {
- $files = $coverage->getData();
- $commonPath = $this->reducePaths($files);
- $root = new PHP_CodeCoverage_Report_Node_Directory(
- $commonPath,
- null
- );
- $this->addItems(
- $root,
- $this->buildDirectoryStructure($files),
- $coverage->getTests(),
- $coverage->getCacheTokens()
- );
- return $root;
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $root
- * @param array $items
- * @param array $tests
- * @param bool $cacheTokens
- */
- private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $items, array $tests, $cacheTokens)
- {
- foreach ($items as $key => $value) {
- if (substr($key, -2) == '/f') {
- $key = substr($key, 0, -2);
- if (file_exists($root->getPath() . DIRECTORY_SEPARATOR . $key)) {
- $root->addFile($key, $value, $tests, $cacheTokens);
- }
- } else {
- $child = $root->addDirectory($key);
- $this->addItems($child, $value, $tests, $cacheTokens);
- }
- }
- }
- /**
- * Builds an array representation of the directory structure.
- *
- * For instance,
- *
- * <code>
- * Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * is transformed into
- *
- * <code>
- * Array
- * (
- * [.] => Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * )
- * </code>
- *
- * @param array $files
- * @return array
- */
- private function buildDirectoryStructure($files)
- {
- $result = array();
- foreach ($files as $path => $file) {
- $path = explode('/', $path);
- $pointer = &$result;
- $max = count($path);
- for ($i = 0; $i < $max; $i++) {
- if ($i == ($max - 1)) {
- $type = '/f';
- } else {
- $type = '';
- }
- $pointer = &$pointer[$path[$i] . $type];
- }
- $pointer = $file;
- }
- return $result;
- }
- /**
- * Reduces the paths by cutting the longest common start path.
- *
- * For instance,
- *
- * <code>
- * Array
- * (
- * [/home/sb/Money/Money.php] => Array
- * (
- * ...
- * )
- *
- * [/home/sb/Money/MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * is reduced to
- *
- * <code>
- * Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * @param array $files
- * @return string
- */
- private function reducePaths(&$files)
- {
- if (empty($files)) {
- return '.';
- }
- $commonPath = '';
- $paths = array_keys($files);
- if (count($files) == 1) {
- $commonPath = dirname($paths[0]) . '/';
- $files[basename($paths[0])] = $files[$paths[0]];
- unset($files[$paths[0]]);
- return $commonPath;
- }
- $max = count($paths);
- for ($i = 0; $i < $max; $i++) {
- // strip phar:// prefixes
- if (strpos($paths[$i], 'phar://') === 0) {
- $paths[$i] = substr($paths[$i], 7);
- $paths[$i] = strtr($paths[$i], '/', DIRECTORY_SEPARATOR);
- }
- $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]);
- if (empty($paths[$i][0])) {
- $paths[$i][0] = DIRECTORY_SEPARATOR;
- }
- }
- $done = false;
- $max = count($paths);
- while (!$done) {
- for ($i = 0; $i < $max - 1; $i++) {
- if (!isset($paths[$i][0]) ||
- !isset($paths[$i+1][0]) ||
- $paths[$i][0] != $paths[$i+1][0]) {
- $done = true;
- break;
- }
- }
- if (!$done) {
- $commonPath .= $paths[0][0];
- if ($paths[0][0] != DIRECTORY_SEPARATOR) {
- $commonPath .= DIRECTORY_SEPARATOR;
- }
- for ($i = 0; $i < $max; $i++) {
- array_shift($paths[$i]);
- }
- }
- }
- $original = array_keys($files);
- $max = count($original);
- for ($i = 0; $i < $max; $i++) {
- $files[implode('/', $paths[$i])] = $files[$original[$i]];
- unset($files[$original[$i]]);
- }
- ksort($files);
- return substr($commonPath, 0, -1);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML
- {
- /**
- * @var string
- */
- private $target;
- /**
- * @var PHP_CodeCoverage_Report_XML_Project
- */
- private $project;
- public function process(PHP_CodeCoverage $coverage, $target)
- {
- if (substr($target, -1, 1) != DIRECTORY_SEPARATOR) {
- $target .= DIRECTORY_SEPARATOR;
- }
- $this->target = $target;
- $this->initTargetDirectory($target);
- $report = $coverage->getReport();
- $this->project = new PHP_CodeCoverage_Report_XML_Project(
- $coverage->getReport()->getName()
- );
- $this->processTests($coverage->getTests());
- $this->processDirectory($report, $this->project);
- $index = $this->project->asDom();
- $index->formatOutput = true;
- $index->preserveWhiteSpace = false;
- $index->save($target . '/index.xml');
- }
- private function initTargetDirectory($dir)
- {
- if (file_exists($dir)) {
- if (!is_dir($dir)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' exists but is not a directory."
- );
- }
- if (!is_writable($dir)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' exists but is not writable."
- );
- }
- } elseif (!@mkdir($dir, 0777, true)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' could not be created."
- );
- }
- }
- private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context)
- {
- $dirObject = $context->addDirectory($directory->getName());
- $this->setTotals($directory, $dirObject->getTotals());
- foreach ($directory as $node) {
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $this->processDirectory($node, $dirObject);
- continue;
- }
- if ($node instanceof PHP_CodeCoverage_Report_Node_File) {
- $this->processFile($node, $dirObject);
- continue;
- }
- throw new PHP_CodeCoverage_Exception(
- 'Unknown node type for XML report'
- );
- }
- }
- private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context)
- {
- $fileObject = $context->addFile(
- $file->getName(),
- $file->getId() . '.xml'
- );
- $this->setTotals($file, $fileObject->getTotals());
- $fileReport = new PHP_CodeCoverage_Report_XML_File_Report(
- $file->getName()
- );
- $this->setTotals($file, $fileReport->getTotals());
- foreach ($file->getClassesAndTraits() as $unit) {
- $this->processUnit($unit, $fileReport);
- }
- foreach ($file->getFunctions() as $function) {
- $this->processFunction($function, $fileReport);
- }
- foreach ($file->getCoverageData() as $line => $tests) {
- if (!is_array($tests) || count($tests) == 0) {
- continue;
- }
- $coverage = $fileReport->getLineCoverage($line);
- foreach ($tests as $test) {
- $coverage->addTest($test);
- }
- $coverage->finalize();
- }
- $this->initTargetDirectory(
- $this->target . dirname($file->getId()) . '/'
- );
- $fileDom = $fileReport->asDom();
- $fileDom->formatOutput = true;
- $fileDom->preserveWhiteSpace = false;
- $fileDom->save($this->target . $file->getId() . '.xml');
- }
- private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report)
- {
- if (isset($unit['className'])) {
- $unitObject = $report->getClassObject($unit['className']);
- } else {
- $unitObject = $report->getTraitObject($unit['traitName']);
- }
- $unitObject->setLines(
- $unit['startLine'],
- $unit['executableLines'],
- $unit['executedLines']
- );
- $unitObject->setCrap($unit['crap']);
- $unitObject->setPackage(
- $unit['package']['fullPackage'],
- $unit['package']['package'],
- $unit['package']['subpackage'],
- $unit['package']['category']
- );
- $unitObject->setNamespace($unit['package']['namespace']);
- foreach ($unit['methods'] as $method) {
- $methodObject = $unitObject->addMethod($method['methodName']);
- $methodObject->setSignature($method['signature']);
- $methodObject->setLines($method['startLine'], $method['endLine']);
- $methodObject->setCrap($method['crap']);
- $methodObject->setTotals(
- $method['executableLines'],
- $method['executedLines'],
- $method['coverage']
- );
- }
- }
- private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report)
- {
- $functionObject = $report->getFunctionObject($function['functionName']);
- $functionObject->setSignature($function['signature']);
- $functionObject->setLines($function['startLine']);
- $functionObject->setCrap($function['crap']);
- $functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']);
- }
- private function processTests(array $tests)
- {
- $testsObject = $this->project->getTests();
- foreach ($tests as $test => $result) {
- if ($test == 'UNCOVERED_FILES_FROM_WHITELIST') {
- continue;
- }
- $testsObject->addTest($test, $result);
- }
- }
- private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals)
- {
- $loc = $node->getLinesOfCode();
- $totals->setNumLines(
- $loc['loc'],
- $loc['cloc'],
- $loc['ncloc'],
- $node->getNumExecutableLines(),
- $node->getNumExecutedLines()
- );
- $totals->setNumClasses(
- $node->getNumClasses(),
- $node->getNumTestedClasses()
- );
- $totals->setNumTraits(
- $node->getNumTraits(),
- $node->getNumTestedTraits()
- );
- $totals->setNumMethods(
- $node->getNumMethods(),
- $node->getNumTestedMethods()
- );
- $totals->setNumFunctions(
- $node->getNumFunctions(),
- $node->getNumTestedFunctions()
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Uses var_export() to write a PHP_CodeCoverage object to a file.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_PHP
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null)
- {
- $filter = $coverage->filter();
- $output = sprintf(
- '<?php
- $coverage = new PHP_CodeCoverage;
- $coverage->setData(%s);
- $coverage->setTests(%s);
- $filter = $coverage->filter();
- $filter->setBlacklistedFiles(%s);
- $filter->setWhitelistedFiles(%s);
- return $coverage;',
- var_export($coverage->getData(true), 1),
- var_export($coverage->getTests(), 1),
- var_export($filter->getBlacklistedFiles(), 1),
- var_export($filter->getWhitelistedFiles(), 1)
- );
- if ($target !== null) {
- return file_put_contents($target, $output);
- } else {
- return $output;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates human readable output from an PHP_CodeCoverage object.
- *
- * The output gets put into a text file our written to the CLI.
- *
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Text
- {
- protected $lowUpperBound;
- protected $highLowerBound;
- protected $showUncoveredFiles;
- protected $showOnlySummary;
- protected $colors = array(
- 'green' => "\x1b[30;42m",
- 'yellow' => "\x1b[30;43m",
- 'red' => "\x1b[37;41m",
- 'header' => "\x1b[1;37;40m",
- 'reset' => "\x1b[0m",
- 'eol' => "\x1b[2K",
- );
- public function __construct($lowUpperBound, $highLowerBound, $showUncoveredFiles, $showOnlySummary)
- {
- $this->lowUpperBound = $lowUpperBound;
- $this->highLowerBound = $highLowerBound;
- $this->showUncoveredFiles = $showUncoveredFiles;
- $this->showOnlySummary = $showOnlySummary;
- }
- /**
- * @param PHP_CodeCoverage $coverage
- * @param bool $showColors
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $showColors = false)
- {
- $output = PHP_EOL . PHP_EOL;
- $report = $coverage->getReport();
- unset($coverage);
- $colors = array(
- 'header' => '',
- 'classes' => '',
- 'methods' => '',
- 'lines' => '',
- 'reset' => '',
- 'eol' => ''
- );
- if ($showColors) {
- $colors['classes'] = $this->getCoverageColor(
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits()
- );
- $colors['methods'] = $this->getCoverageColor(
- $report->getNumTestedMethods(),
- $report->getNumMethods()
- );
- $colors['lines'] = $this->getCoverageColor(
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines()
- );
- $colors['reset'] = $this->colors['reset'];
- $colors['header'] = $this->colors['header'];
- $colors['eol'] = $this->colors['eol'];
- }
- $classes = sprintf(
- ' Classes: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits(),
- true
- ),
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits()
- );
- $methods = sprintf(
- ' Methods: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumTestedMethods(),
- $report->getNumMethods(),
- true
- ),
- $report->getNumTestedMethods(),
- $report->getNumMethods()
- );
- $lines = sprintf(
- ' Lines: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines(),
- true
- ),
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines()
- );
- $padding = max(array_map('strlen', array($classes, $methods, $lines)));
- if ($this->showOnlySummary) {
- $title = 'Code Coverage Report Summary:';
- $padding = max($padding, strlen($title));
- $output .= $this->format($colors['header'], $padding, $title);
- } else {
- $date = date(' Y-m-d H:i:s', $_SERVER['REQUEST_TIME']);
- $title = 'Code Coverage Report:';
- $output .= $this->format($colors['header'], $padding, $title);
- $output .= $this->format($colors['header'], $padding, $date);
- $output .= $this->format($colors['header'], $padding, '');
- $output .= $this->format($colors['header'], $padding, ' Summary:');
- }
- $output .= $this->format($colors['classes'], $padding, $classes);
- $output .= $this->format($colors['methods'], $padding, $methods);
- $output .= $this->format($colors['lines'], $padding, $lines);
- if ($this->showOnlySummary) {
- return $output . PHP_EOL;
- }
- $classCoverage = array();
- foreach ($report as $item) {
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $classes = $item->getClassesAndTraits();
- foreach ($classes as $className => $class) {
- $classStatements = 0;
- $coveredClassStatements = 0;
- $coveredMethods = 0;
- $classMethods = 0;
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] == 0) {
- continue;
- }
- $classMethods++;
- $classStatements += $method['executableLines'];
- $coveredClassStatements += $method['executedLines'];
- if ($method['coverage'] == 100) {
- $coveredMethods++;
- }
- }
- if (!empty($class['package']['namespace'])) {
- $namespace = '\\' . $class['package']['namespace'] . '::';
- } elseif (!empty($class['package']['fullPackage'])) {
- $namespace = '@' . $class['package']['fullPackage'] . '::';
- } else {
- $namespace = '';
- }
- $classCoverage[$namespace . $className] = array(
- 'namespace' => $namespace,
- 'className ' => $className,
- 'methodsCovered' => $coveredMethods,
- 'methodCount' => $classMethods,
- 'statementsCovered' => $coveredClassStatements,
- 'statementCount' => $classStatements,
- );
- }
- }
- ksort($classCoverage);
- $methodColor = '';
- $linesColor = '';
- $resetColor = '';
- foreach ($classCoverage as $fullQualifiedPath => $classInfo) {
- if ($classInfo['statementsCovered'] != 0 ||
- $this->showUncoveredFiles) {
- if ($showColors) {
- $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']);
- $linesColor = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']);
- $resetColor = $colors['reset'];
- }
- $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL
- . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '
- . ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor
- ;
- }
- }
- return $output . PHP_EOL;
- }
- protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElements)
- {
- $coverage = PHP_CodeCoverage_Util::percent(
- $numberOfCoveredElements,
- $totalNumberOfElements
- );
- if ($coverage >= $this->highLowerBound) {
- return $this->colors['green'];
- } elseif ($coverage > $this->lowUpperBound) {
- return $this->colors['yellow'];
- }
- return $this->colors['red'];
- }
- protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $presicion)
- {
- $format = '%' . $presicion . 's';
- return PHP_CodeCoverage_Util::percent(
- $numberOfCoveredElements,
- $totalNumberOfElements,
- true,
- true
- ) .
- ' (' . sprintf($format, $numberOfCoveredElements) . '/' .
- sprintf($format, $totalNumberOfElements) . ')';
- }
- private function format($color, $padding, $string)
- {
- $reset = $color ? $this->colors['reset'] : '';
- return $color . str_pad($string, $padding) . $reset . PHP_EOL;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception that is raised when code is unintentionally covered.
- *
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Exception_UnintentionallyCoveredCode extends PHP_CodeCoverage_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for code coverage drivers.
- *
- * @since Class available since Release 1.0.0
- */
- interface PHP_CodeCoverage_Driver
- {
- /**
- * Start collection of code coverage information.
- */
- public function start();
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop();
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Filter for blacklisting and whitelisting of code coverage information.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Filter
- {
- /**
- * Source files that are blacklisted.
- *
- * @var array
- */
- private $blacklistedFiles = array();
- /**
- * Source files that are whitelisted.
- *
- * @var array
- */
- private $whitelistedFiles = array();
- /**
- * Adds a directory to the blacklist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->addFileToBlacklist($file);
- }
- }
- /**
- * Adds a file to the blacklist.
- *
- * @param string $filename
- */
- public function addFileToBlacklist($filename)
- {
- $this->blacklistedFiles[realpath($filename)] = true;
- }
- /**
- * Adds files to the blacklist.
- *
- * @param array $files
- */
- public function addFilesToBlacklist(array $files)
- {
- foreach ($files as $file) {
- $this->addFileToBlacklist($file);
- }
- }
- /**
- * Removes a directory from the blacklist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->removeFileFromBlacklist($file);
- }
- }
- /**
- * Removes a file from the blacklist.
- *
- * @param string $filename
- */
- public function removeFileFromBlacklist($filename)
- {
- $filename = realpath($filename);
- if (isset($this->blacklistedFiles[$filename])) {
- unset($this->blacklistedFiles[$filename]);
- }
- }
- /**
- * Adds a directory to the whitelist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->addFileToWhitelist($file);
- }
- }
- /**
- * Adds a file to the whitelist.
- *
- * @param string $filename
- */
- public function addFileToWhitelist($filename)
- {
- $this->whitelistedFiles[realpath($filename)] = true;
- }
- /**
- * Adds files to the whitelist.
- *
- * @param array $files
- */
- public function addFilesToWhitelist(array $files)
- {
- foreach ($files as $file) {
- $this->addFileToWhitelist($file);
- }
- }
- /**
- * Removes a directory from the whitelist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->removeFileFromWhitelist($file);
- }
- }
- /**
- * Removes a file from the whitelist.
- *
- * @param string $filename
- */
- public function removeFileFromWhitelist($filename)
- {
- $filename = realpath($filename);
- if (isset($this->whitelistedFiles[$filename])) {
- unset($this->whitelistedFiles[$filename]);
- }
- }
- /**
- * Checks whether a filename is a real filename.
- *
- * @param string $filename
- */
- public function isFile($filename)
- {
- if ($filename == '-' ||
- strpos($filename, 'vfs://') === 0 ||
- strpos($filename, 'xdebug://debug-eval') !== false ||
- strpos($filename, 'eval()\'d code') !== false ||
- strpos($filename, 'runtime-created function') !== false ||
- strpos($filename, 'runkit created function') !== false ||
- strpos($filename, 'assert code') !== false ||
- strpos($filename, 'regexp code') !== false) {
- return false;
- }
- return file_exists($filename);
- }
- /**
- * Checks whether or not a file is filtered.
- *
- * When the whitelist is empty (default), blacklisting is used.
- * When the whitelist is not empty, whitelisting is used.
- *
- * @param string $filename
- * @return bool
- * @throws PHP_CodeCoverage_Exception
- */
- public function isFiltered($filename)
- {
- if (!$this->isFile($filename)) {
- return true;
- }
- $filename = realpath($filename);
- if (!empty($this->whitelistedFiles)) {
- return !isset($this->whitelistedFiles[$filename]);
- }
- return isset($this->blacklistedFiles[$filename]);
- }
- /**
- * Returns the list of blacklisted files.
- *
- * @return array
- */
- public function getBlacklist()
- {
- return array_keys($this->blacklistedFiles);
- }
- /**
- * Returns the list of whitelisted files.
- *
- * @return array
- */
- public function getWhitelist()
- {
- return array_keys($this->whitelistedFiles);
- }
- /**
- * Returns whether this filter has a whitelist.
- *
- * @return bool
- * @since Method available since Release 1.1.0
- */
- public function hasWhitelist()
- {
- return !empty($this->whitelistedFiles);
- }
- /**
- * Returns the blacklisted files.
- *
- * @return array
- * @since Method available since Release 2.0.0
- */
- public function getBlacklistedFiles()
- {
- return $this->blacklistedFiles;
- }
- /**
- * Sets the blacklisted files.
- *
- * @param array $blacklistedFiles
- * @since Method available since Release 2.0.0
- */
- public function setBlacklistedFiles($blacklistedFiles)
- {
- $this->blacklistedFiles = $blacklistedFiles;
- }
- /**
- * Returns the whitelisted files.
- *
- * @return array
- * @since Method available since Release 2.0.0
- */
- public function getWhitelistedFiles()
- {
- return $this->whitelistedFiles;
- }
- /**
- * Sets the whitelisted files.
- *
- * @param array $whitelistedFiles
- * @since Method available since Release 2.0.0
- */
- public function setWhitelistedFiles($whitelistedFiles)
- {
- $this->whitelistedFiles = $whitelistedFiles;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHP_CodeCoverage_Exception objects that are used to describe
- * invalid arguments passed to a function or method.
- *
- * @since Class available since Release 1.2.0
- */
- class PHP_CodeCoverage_Util_InvalidArgumentHelper
- {
- /**
- * @param int $argument
- * @param string $type
- * @param mixed $value
- */
- public static function factory($argument, $type, $value = null)
- {
- $stack = debug_backtrace(false);
- return new PHP_CodeCoverage_Exception(
- sprintf(
- 'Argument #%d%sof %s::%s() must be a %s',
- $argument,
- $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ',
- $stack[1]['class'],
- $stack[1]['function'],
- $type
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Driver for HHVM's code coverage functionality.
- *
- * @since Class available since Release 1.3.0
- * @codeCoverageIgnore
- */
- class PHP_CodeCoverage_Driver_HHVM implements PHP_CodeCoverage_Driver
- {
- /**
- * Constructor.
- */
- public function __construct()
- {
- if (!defined('HHVM_VERSION')) {
- throw new PHP_CodeCoverage_Exception('This driver requires HHVM');
- }
- }
- /**
- * Start collection of code coverage information.
- */
- public function start()
- {
- fb_enable_code_coverage();
- }
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop()
- {
- $codeCoverage = fb_get_code_coverage(true);
- fb_disable_code_coverage();
- return $codeCoverage;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Driver for Xdebug's code coverage functionality.
- *
- * @since Class available since Release 1.0.0
- * @codeCoverageIgnore
- */
- class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver
- {
- /**
- * Constructor.
- */
- public function __construct()
- {
- if (!extension_loaded('xdebug')) {
- throw new PHP_CodeCoverage_Exception('This driver requires Xdebug');
- }
- if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') &&
- !ini_get('xdebug.coverage_enable')) {
- throw new PHP_CodeCoverage_Exception(
- 'xdebug.coverage_enable=On has to be set in php.ini'
- );
- }
- }
- /**
- * Start collection of code coverage information.
- */
- public function start()
- {
- xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
- }
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop()
- {
- $data = xdebug_get_code_coverage();
- xdebug_stop_code_coverage();
- return $this->cleanup($data);
- }
- /**
- * @param array $data
- * @return array
- * @since Method available since Release 2.0.0
- */
- private function cleanup(array $data)
- {
- foreach (array_keys($data) as $file) {
- if (isset($data[$file][0])) {
- unset($data[$file][0]);
- }
- if ($file != 'xdebug://debug-eval' && file_exists($file)) {
- $numLines = $this->getNumberOfLinesInFile($file);
- foreach (array_keys($data[$file]) as $line) {
- if (isset($data[$file][$line]) && $line > $numLines) {
- unset($data[$file][$line]);
- }
- }
- }
- }
- return $data;
- }
- /**
- * @param string $file
- * @return int
- * @since Method available since Release 2.0.0
- */
- private function getNumberOfLinesInFile($file)
- {
- $buffer = file_get_contents($file);
- $lines = substr_count($buffer, "\n");
- if (substr($buffer, -1) !== "\n") {
- $lines++;
- }
- return $lines;
- }
- }
- PHP_CodeCoverage
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Provides collection functionality for PHP code coverage information.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage
- {
- /**
- * @var PHP_CodeCoverage_Driver
- */
- private $driver;
- /**
- * @var PHP_CodeCoverage_Filter
- */
- private $filter;
- /**
- * @var bool
- */
- private $cacheTokens = false;
- /**
- * @var bool
- */
- private $checkForUnintentionallyCoveredCode = false;
- /**
- * @var bool
- */
- private $forceCoversAnnotation = false;
- /**
- * @var bool
- */
- private $mapTestClassNameToCoveredClassName = false;
- /**
- * @var bool
- */
- private $addUncoveredFilesFromWhitelist = true;
- /**
- * @var bool
- */
- private $processUncoveredFilesFromWhitelist = false;
- /**
- * @var mixed
- */
- private $currentId;
- /**
- * Code coverage data.
- *
- * @var array
- */
- private $data = array();
- /**
- * @var array
- */
- private $ignoredLines = array();
- /**
- * Test data.
- *
- * @var array
- */
- private $tests = array();
- /**
- * Constructor.
- *
- * @param PHP_CodeCoverage_Driver $driver
- * @param PHP_CodeCoverage_Filter $filter
- * @throws PHP_CodeCoverage_Exception
- */
- public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null)
- {
- if ($driver === null) {
- $runtime = new Runtime;
- if ($runtime->isHHVM()) {
- $driver = new PHP_CodeCoverage_Driver_HHVM;
- } elseif ($runtime->hasXdebug()) {
- $driver = new PHP_CodeCoverage_Driver_Xdebug;
- } else {
- throw new PHP_CodeCoverage_Exception('No code coverage driver available');
- }
- }
- if ($filter === null) {
- $filter = new PHP_CodeCoverage_Filter;
- }
- $this->driver = $driver;
- $this->filter = $filter;
- }
- /**
- * Returns the PHP_CodeCoverage_Report_Node_* object graph
- * for this PHP_CodeCoverage object.
- *
- * @return PHP_CodeCoverage_Report_Node_Directory
- * @since Method available since Release 1.1.0
- */
- public function getReport()
- {
- $factory = new PHP_CodeCoverage_Report_Factory;
- return $factory->create($this);
- }
- /**
- * Clears collected code coverage data.
- */
- public function clear()
- {
- $this->currentId = null;
- $this->data = array();
- $this->tests = array();
- }
- /**
- * Returns the PHP_CodeCoverage_Filter used.
- *
- * @return PHP_CodeCoverage_Filter
- */
- public function filter()
- {
- return $this->filter;
- }
- /**
- * Returns the collected code coverage data.
- * Set $raw = true to bypass all filters.
- *
- * @param bool $raw
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getData($raw = false)
- {
- if (!$raw && $this->addUncoveredFilesFromWhitelist) {
- $this->addUncoveredFilesFromWhitelist();
- }
- // We need to apply the blacklist filter a second time
- // when no whitelist is used.
- if (!$raw && !$this->filter->hasWhitelist()) {
- $this->applyListsFilter($this->data);
- }
- return $this->data;
- }
- /**
- * Sets the coverage data.
- *
- * @param array $data
- * @since Method available since Release 2.0.0
- */
- public function setData(array $data)
- {
- $this->data = $data;
- }
- /**
- * Returns the test data.
- *
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getTests()
- {
- return $this->tests;
- }
- /**
- * Sets the test data.
- *
- * @param array $tests
- * @since Method available since Release 2.0.0
- */
- public function setTests(array $tests)
- {
- $this->tests = $tests;
- }
- /**
- * Start collection of code coverage information.
- *
- * @param mixed $id
- * @param bool $clear
- * @throws PHP_CodeCoverage_Exception
- */
- public function start($id, $clear = false)
- {
- if (!is_bool($clear)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- if ($clear) {
- $this->clear();
- }
- $this->currentId = $id;
- $this->driver->start();
- }
- /**
- * Stop collection of code coverage information.
- *
- * @param bool $append
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @return array
- * @throws PHP_CodeCoverage_Exception
- */
- public function stop($append = true, $linesToBeCovered = array(), array $linesToBeUsed = array())
- {
- if (!is_bool($append)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or false'
- );
- }
- $data = $this->driver->stop();
- $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed);
- $this->currentId = null;
- return $data;
- }
- /**
- * Appends code coverage data.
- *
- * @param array $data
- * @param mixed $id
- * @param bool $append
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception
- */
- public function append(array $data, $id = null, $append = true, $linesToBeCovered = array(), array $linesToBeUsed = array())
- {
- if ($id === null) {
- $id = $this->currentId;
- }
- if ($id === null) {
- throw new PHP_CodeCoverage_Exception;
- }
- $this->applyListsFilter($data);
- $this->applyIgnoredLinesFilter($data);
- $this->initializeFilesThatAreSeenTheFirstTime($data);
- if (!$append) {
- return;
- }
- if ($id != 'UNCOVERED_FILES_FROM_WHITELIST') {
- $this->applyCoversAnnotationFilter(
- $data,
- $linesToBeCovered,
- $linesToBeUsed
- );
- }
- if (empty($data)) {
- return;
- }
- $size = 'unknown';
- $status = null;
- if ($id instanceof PHPUnit_Framework_TestCase) {
- $_size = $id->getSize();
- if ($_size == PHPUnit_Util_Test::SMALL) {
- $size = 'small';
- } elseif ($_size == PHPUnit_Util_Test::MEDIUM) {
- $size = 'medium';
- } elseif ($_size == PHPUnit_Util_Test::LARGE) {
- $size = 'large';
- }
- $status = $id->getStatus();
- $id = get_class($id) . '::' . $id->getName();
- } elseif ($id instanceof PHPUnit_Extensions_PhptTestCase) {
- $size = 'large';
- $id = $id->getName();
- }
- $this->tests[$id] = array('size' => $size, 'status' => $status);
- foreach ($data as $file => $lines) {
- if (!$this->filter->isFile($file)) {
- continue;
- }
- foreach ($lines as $k => $v) {
- if ($v == 1) {
- if (empty($this->data[$file][$k]) || !in_array($id, $this->data[$file][$k])) {
- $this->data[$file][$k][] = $id;
- }
- }
- }
- }
- }
- /**
- * Merges the data from another instance of PHP_CodeCoverage.
- *
- * @param PHP_CodeCoverage $that
- */
- public function merge(PHP_CodeCoverage $that)
- {
- foreach ($that->data as $file => $lines) {
- if (!isset($this->data[$file])) {
- if (!$this->filter->isFiltered($file)) {
- $this->data[$file] = $lines;
- }
- continue;
- }
- foreach ($lines as $line => $data) {
- if ($data !== null) {
- if (!isset($this->data[$file][$line])) {
- $this->data[$file][$line] = $data;
- } else {
- $this->data[$file][$line] = array_unique(
- array_merge($this->data[$file][$line], $data)
- );
- }
- }
- }
- }
- $this->tests = array_merge($this->tests, $that->getTests());
- $this->filter->setBlacklistedFiles(
- array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles())
- );
- $this->filter->setWhitelistedFiles(
- array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles())
- );
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 1.1.0
- */
- public function setCacheTokens($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->cacheTokens = $flag;
- }
- /**
- * @since Method available since Release 1.1.0
- */
- public function getCacheTokens()
- {
- return $this->cacheTokens;
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 2.0.0
- */
- public function setCheckForUnintentionallyCoveredCode($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->checkForUnintentionallyCoveredCode = $flag;
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setForceCoversAnnotation($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->forceCoversAnnotation = $flag;
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setMapTestClassNameToCoveredClassName($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->mapTestClassNameToCoveredClassName = $flag;
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setAddUncoveredFilesFromWhitelist($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->addUncoveredFilesFromWhitelist = $flag;
- }
- /**
- * @param bool $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setProcessUncoveredFilesFromWhitelist($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->processUncoveredFilesFromWhitelist = $flag;
- }
- /**
- * Applies the @covers annotation filtering.
- *
- * @param array $data
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
- */
- private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed)
- {
- if ($linesToBeCovered === false ||
- ($this->forceCoversAnnotation && empty($linesToBeCovered))) {
- $data = array();
- return;
- }
- if (empty($linesToBeCovered)) {
- return;
- }
- if ($this->checkForUnintentionallyCoveredCode) {
- $this->performUnintentionallyCoveredCodeCheck(
- $data,
- $linesToBeCovered,
- $linesToBeUsed
- );
- }
- $data = array_intersect_key($data, $linesToBeCovered);
- foreach (array_keys($data) as $filename) {
- $_linesToBeCovered = array_flip($linesToBeCovered[$filename]);
- $data[$filename] = array_intersect_key(
- $data[$filename],
- $_linesToBeCovered
- );
- }
- }
- /**
- * Applies the blacklist/whitelist filtering.
- *
- * @param array $data
- */
- private function applyListsFilter(array &$data)
- {
- foreach (array_keys($data) as $filename) {
- if ($this->filter->isFiltered($filename)) {
- unset($data[$filename]);
- }
- }
- }
- /**
- * Applies the "ignored lines" filtering.
- *
- * @param array $data
- */
- private function applyIgnoredLinesFilter(array &$data)
- {
- foreach (array_keys($data) as $filename) {
- if (!$this->filter->isFile($filename)) {
- continue;
- }
- foreach ($this->getLinesToBeIgnored($filename) as $line) {
- unset($data[$filename][$line]);
- }
- }
- }
- /**
- * @param array $data
- * @since Method available since Release 1.1.0
- */
- private function initializeFilesThatAreSeenTheFirstTime(array $data)
- {
- foreach ($data as $file => $lines) {
- if ($this->filter->isFile($file) && !isset($this->data[$file])) {
- $this->data[$file] = array();
- foreach ($lines as $k => $v) {
- $this->data[$file][$k] = $v == -2 ? null : array();
- }
- }
- }
- }
- /**
- * Processes whitelisted files that are not covered.
- */
- private function addUncoveredFilesFromWhitelist()
- {
- $data = array();
- $uncoveredFiles = array_diff(
- $this->filter->getWhitelist(),
- array_keys($this->data)
- );
- foreach ($uncoveredFiles as $uncoveredFile) {
- if (!file_exists($uncoveredFile)) {
- continue;
- }
- if ($this->processUncoveredFilesFromWhitelist) {
- $this->processUncoveredFileFromWhitelist(
- $uncoveredFile,
- $data,
- $uncoveredFiles
- );
- } else {
- $data[$uncoveredFile] = array();
- $lines = count(file($uncoveredFile));
- for ($i = 1; $i <= $lines; $i++) {
- $data[$uncoveredFile][$i] = -1;
- }
- }
- }
- $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST');
- }
- /**
- * @param string $uncoveredFile
- * @param array $data
- * @param array $uncoveredFiles
- */
- private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, array $uncoveredFiles)
- {
- $this->driver->start();
- include_once $uncoveredFile;
- $coverage = $this->driver->stop();
- foreach ($coverage as $file => $fileCoverage) {
- if (!isset($data[$file]) &&
- in_array($file, $uncoveredFiles)) {
- foreach (array_keys($fileCoverage) as $key) {
- if ($fileCoverage[$key] == 1) {
- $fileCoverage[$key] = -1;
- }
- }
- $data[$file] = $fileCoverage;
- }
- }
- }
- /**
- * Returns the lines of a source file that should be ignored.
- *
- * @param string $filename
- * @return array
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 2.0.0
- */
- private function getLinesToBeIgnored($filename)
- {
- if (!is_string($filename)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'string'
- );
- }
- if (!isset($this->ignoredLines[$filename])) {
- $this->ignoredLines[$filename] = array();
- $ignore = false;
- $stop = false;
- $lines = file($filename);
- $numLines = count($lines);
- foreach ($lines as $index => $line) {
- if (!trim($line)) {
- $this->ignoredLines[$filename][] = $index + 1;
- }
- }
- if ($this->cacheTokens) {
- $tokens = PHP_Token_Stream_CachingFactory::get($filename);
- } else {
- $tokens = new PHP_Token_Stream($filename);
- }
- $classes = array_merge($tokens->getClasses(), $tokens->getTraits());
- $tokens = $tokens->tokens();
- foreach ($tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_COMMENT':
- case 'PHP_Token_DOC_COMMENT':
- $_token = trim($token);
- $_line = trim($lines[$token->getLine() - 1]);
- if ($_token == '// @codeCoverageIgnore' ||
- $_token == '//@codeCoverageIgnore') {
- $ignore = true;
- $stop = true;
- } elseif ($_token == '// @codeCoverageIgnoreStart' ||
- $_token == '//@codeCoverageIgnoreStart') {
- $ignore = true;
- } elseif ($_token == '// @codeCoverageIgnoreEnd' ||
- $_token == '//@codeCoverageIgnoreEnd') {
- $stop = true;
- }
- if (!$ignore) {
- $start = $token->getLine();
- $end = $start + substr_count($token, "\n");
- // Do not ignore the first line when there is a token
- // before the comment
- if (0 !== strpos($_token, $_line)) {
- $start++;
- }
- for ($i = $start; $i < $end; $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- // A DOC_COMMENT token or a COMMENT token starting with "/*"
- // does not contain the final \n character in its text
- if (isset($lines[$i-1]) && 0 === strpos($_token, '/*') && '*/' === substr(trim($lines[$i-1]), -2)) {
- $this->ignoredLines[$filename][] = $i;
- }
- }
- break;
- case 'PHP_Token_INTERFACE':
- case 'PHP_Token_TRAIT':
- case 'PHP_Token_CLASS':
- case 'PHP_Token_FUNCTION':
- $docblock = $token->getDocblock();
- $this->ignoredLines[$filename][] = $token->getLine();
- if (strpos($docblock, '@codeCoverageIgnore')) {
- $endLine = $token->getEndLine();
- for ($i = $token->getLine(); $i <= $endLine; $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- } elseif ($token instanceof PHP_Token_INTERFACE ||
- $token instanceof PHP_Token_TRAIT ||
- $token instanceof PHP_Token_CLASS) {
- if (empty($classes[$token->getName()]['methods'])) {
- for ($i = $token->getLine();
- $i <= $token->getEndLine();
- $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- } else {
- $firstMethod = array_shift(
- $classes[$token->getName()]['methods']
- );
- do {
- $lastMethod = array_pop(
- $classes[$token->getName()]['methods']
- );
- } while ($lastMethod !== null &&
- substr($lastMethod['signature'], 0, 18) == 'anonymous function');
- if ($lastMethod === null) {
- $lastMethod = $firstMethod;
- }
- for ($i = $token->getLine();
- $i < $firstMethod['startLine'];
- $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- for ($i = $token->getEndLine();
- $i > $lastMethod['endLine'];
- $i--) {
- $this->ignoredLines[$filename][] = $i;
- }
- }
- }
- break;
- case 'PHP_Token_NAMESPACE':
- $this->ignoredLines[$filename][] = $token->getEndLine();
- // Intentional fallthrough
- case 'PHP_Token_OPEN_TAG':
- case 'PHP_Token_CLOSE_TAG':
- case 'PHP_Token_USE':
- $this->ignoredLines[$filename][] = $token->getLine();
- break;
- }
- if ($ignore) {
- $this->ignoredLines[$filename][] = $token->getLine();
- if ($stop) {
- $ignore = false;
- $stop = false;
- }
- }
- }
- $this->ignoredLines[$filename][] = $numLines + 1;
- $this->ignoredLines[$filename] = array_unique(
- $this->ignoredLines[$filename]
- );
- sort($this->ignoredLines[$filename]);
- }
- return $this->ignoredLines[$filename];
- }
- /**
- * @param array $data
- * @param array $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
- * @since Method available since Release 2.0.0
- */
- private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed)
- {
- $allowedLines = $this->getAllowedLines(
- $linesToBeCovered,
- $linesToBeUsed
- );
- $message = '';
- foreach ($data as $file => $_data) {
- foreach ($_data as $line => $flag) {
- if ($flag == 1 &&
- (!isset($allowedLines[$file]) ||
- !isset($allowedLines[$file][$line]))) {
- $message .= sprintf(
- '- %s:%d' . PHP_EOL,
- $file,
- $line
- );
- }
- }
- }
- if (!empty($message)) {
- throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode(
- $message
- );
- }
- }
- /**
- * @param array $linesToBeCovered
- * @param array $linesToBeUsed
- * @return array
- * @since Method available since Release 2.0.0
- */
- private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed)
- {
- $allowedLines = array();
- foreach (array_keys($linesToBeCovered) as $file) {
- if (!isset($allowedLines[$file])) {
- $allowedLines[$file] = array();
- }
- $allowedLines[$file] = array_merge(
- $allowedLines[$file],
- $linesToBeCovered[$file]
- );
- }
- foreach (array_keys($linesToBeUsed) as $file) {
- if (!isset($allowedLines[$file])) {
- $allowedLines[$file] = array();
- }
- $allowedLines[$file] = array_merge(
- $allowedLines[$file],
- $linesToBeUsed[$file]
- );
- }
- foreach (array_keys($allowedLines) as $file) {
- $allowedLines[$file] = array_flip(
- array_unique($allowedLines[$file])
- );
- }
- return $allowedLines;
- }
- }
- Copyright (c) 2004-2015 Fabien Potencier
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is furnished
- to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- use Symfony\Component\Yaml\Exception\DumpException;
- /**
- * Inline implements a YAML parser/dumper for the YAML inline syntax.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Inline
- {
- const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
- private static $exceptionOnInvalidType = false;
- private static $objectSupport = false;
- private static $objectForMap = false;
- /**
- * Converts a YAML string to a PHP array.
- *
- * @param string $value A YAML string
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- * @param array $references Mapping of variable names to values
- *
- * @return array A PHP array representing the YAML string
- *
- * @throws ParseException
- */
- public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false, $references = array())
- {
- self::$exceptionOnInvalidType = $exceptionOnInvalidType;
- self::$objectSupport = $objectSupport;
- self::$objectForMap = $objectForMap;
- $value = trim($value);
- if (0 == strlen($value)) {
- return '';
- }
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding('ASCII');
- }
- $i = 0;
- switch ($value[0]) {
- case '[':
- $result = self::parseSequence($value, $i, $references);
- ++$i;
- break;
- case '{':
- $result = self::parseMapping($value, $i, $references);
- ++$i;
- break;
- default:
- $result = self::parseScalar($value, null, array('"', "'"), $i, true, $references);
- }
- // some comments are allowed at the end
- if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
- throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return $result;
- }
- /**
- * Dumps a given PHP variable to a YAML string.
- *
- * @param mixed $value The PHP variable to convert
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML string representing the PHP array
- *
- * @throws DumpException When trying to dump PHP resource
- */
- public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- switch (true) {
- case is_resource($value):
- if ($exceptionOnInvalidType) {
- throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
- }
- return 'null';
- case is_object($value):
- if ($objectSupport) {
- return '!!php/object:'.serialize($value);
- }
- if ($exceptionOnInvalidType) {
- throw new DumpException('Object support when dumping a YAML file has been disabled.');
- }
- return 'null';
- case is_array($value):
- return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport);
- case null === $value:
- return 'null';
- case true === $value:
- return 'true';
- case false === $value:
- return 'false';
- case ctype_digit($value):
- return is_string($value) ? "'$value'" : (int) $value;
- case is_numeric($value):
- $locale = setlocale(LC_NUMERIC, 0);
- if (false !== $locale) {
- setlocale(LC_NUMERIC, 'C');
- }
- if (is_float($value)) {
- $repr = (string) $value;
- if (is_infinite($value)) {
- $repr = str_ireplace('INF', '.Inf', $repr);
- } elseif (floor($value) == $value && $repr == $value) {
- // Preserve float data type since storing a whole number will result in integer value.
- $repr = '!!float '.$repr;
- }
- } else {
- $repr = is_string($value) ? "'$value'" : (string) $value;
- }
- if (false !== $locale) {
- setlocale(LC_NUMERIC, $locale);
- }
- return $repr;
- case '' == $value:
- return "''";
- case Escaper::requiresDoubleQuoting($value):
- return Escaper::escapeWithDoubleQuotes($value);
- case Escaper::requiresSingleQuoting($value):
- case preg_match(self::getHexRegex(), $value):
- case preg_match(self::getTimestampRegex(), $value):
- return Escaper::escapeWithSingleQuotes($value);
- default:
- return $value;
- }
- }
- /**
- * Dumps a PHP array to a YAML string.
- *
- * @param array $value The PHP array to dump
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML string representing the PHP array
- */
- private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport)
- {
- // array
- $keys = array_keys($value);
- $keysCount = count($keys);
- if ((1 === $keysCount && '0' == $keys[0])
- || ($keysCount > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) === $keysCount * ($keysCount - 1) / 2)
- ) {
- $output = array();
- foreach ($value as $val) {
- $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport);
- }
- return sprintf('[%s]', implode(', ', $output));
- }
- // mapping
- $output = array();
- foreach ($value as $key => $val) {
- $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport));
- }
- return sprintf('{ %s }', implode(', ', $output));
- }
- /**
- * Parses a scalar to a YAML string.
- *
- * @param string $scalar
- * @param string $delimiters
- * @param array $stringDelimiters
- * @param int &$i
- * @param bool $evaluate
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array())
- {
- if (in_array($scalar[$i], $stringDelimiters)) {
- // quoted scalar
- $output = self::parseQuotedScalar($scalar, $i);
- if (null !== $delimiters) {
- $tmp = ltrim(substr($scalar, $i), ' ');
- if (!in_array($tmp[0], $delimiters)) {
- throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
- }
- }
- } else {
- // "normal" string
- if (!$delimiters) {
- $output = substr($scalar, $i);
- $i += strlen($output);
- // remove comments
- if (false !== $strpos = strpos($output, ' #')) {
- $output = rtrim(substr($output, 0, $strpos));
- }
- } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
- $output = $match[1];
- $i += strlen($output);
- } else {
- throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar));
- }
- if ($evaluate) {
- $output = self::evaluateScalar($output, $references);
- }
- }
- return $output;
- }
- /**
- * Parses a quoted scalar to YAML.
- *
- * @param string $scalar
- * @param int &$i
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseQuotedScalar($scalar, &$i)
- {
- if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
- throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
- }
- $output = substr($match[0], 1, strlen($match[0]) - 2);
- $unescaper = new Unescaper();
- if ('"' == $scalar[$i]) {
- $output = $unescaper->unescapeDoubleQuotedString($output);
- } else {
- $output = $unescaper->unescapeSingleQuotedString($output);
- }
- $i += strlen($match[0]);
- return $output;
- }
- /**
- * Parses a sequence to a YAML string.
- *
- * @param string $sequence
- * @param int &$i
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseSequence($sequence, &$i = 0, $references = array())
- {
- $output = array();
- $len = strlen($sequence);
- ++$i;
- // [foo, bar, ...]
- while ($i < $len) {
- switch ($sequence[$i]) {
- case '[':
- // nested sequence
- $output[] = self::parseSequence($sequence, $i, $references);
- break;
- case '{':
- // nested mapping
- $output[] = self::parseMapping($sequence, $i, $references);
- break;
- case ']':
- return $output;
- case ',':
- case ' ':
- break;
- default:
- $isQuoted = in_array($sequence[$i], array('"', "'"));
- $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i, true, $references);
- // the value can be an array if a reference has been resolved to an array var
- if (!is_array($value) && !$isQuoted && false !== strpos($value, ': ')) {
- // embedded mapping?
- try {
- $pos = 0;
- $value = self::parseMapping('{'.$value.'}', $pos, $references);
- } catch (\InvalidArgumentException $e) {
- // no, it's not
- }
- }
- $output[] = $value;
- --$i;
- }
- ++$i;
- }
- throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence));
- }
- /**
- * Parses a mapping to a YAML string.
- *
- * @param string $mapping
- * @param int &$i
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseMapping($mapping, &$i = 0, $references = array())
- {
- $output = array();
- $len = strlen($mapping);
- ++$i;
- // {foo: bar, bar:foo, ...}
- while ($i < $len) {
- switch ($mapping[$i]) {
- case ' ':
- case ',':
- ++$i;
- continue 2;
- case '}':
- if (self::$objectForMap) {
- return (object) $output;
- }
- return $output;
- }
- // key
- $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
- // value
- $done = false;
- while ($i < $len) {
- switch ($mapping[$i]) {
- case '[':
- // nested sequence
- $value = self::parseSequence($mapping, $i, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- break;
- case '{':
- // nested mapping
- $value = self::parseMapping($mapping, $i, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- break;
- case ':':
- case ' ':
- break;
- default:
- $value = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i, true, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- --$i;
- }
- ++$i;
- if ($done) {
- continue 2;
- }
- }
- }
- throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping));
- }
- /**
- * Evaluates scalars and replaces magic values.
- *
- * @param string $scalar
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
- */
- private static function evaluateScalar($scalar, $references = array())
- {
- $scalar = trim($scalar);
- $scalarLower = strtolower($scalar);
- if (0 === strpos($scalar, '*')) {
- if (false !== $pos = strpos($scalar, '#')) {
- $value = substr($scalar, 1, $pos - 2);
- } else {
- $value = substr($scalar, 1);
- }
- // an unquoted *
- if (false === $value || '' === $value) {
- throw new ParseException('A reference must contain at least one character.');
- }
- if (!array_key_exists($value, $references)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $value));
- }
- return $references[$value];
- }
- switch (true) {
- case 'null' === $scalarLower:
- case '' === $scalar:
- case '~' === $scalar:
- return;
- case 'true' === $scalarLower:
- return true;
- case 'false' === $scalarLower:
- return false;
- // Optimise for returning strings.
- case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
- switch (true) {
- case 0 === strpos($scalar, '!str'):
- return (string) substr($scalar, 5);
- case 0 === strpos($scalar, '! '):
- return (int) self::parseScalar(substr($scalar, 2));
- case 0 === strpos($scalar, '!!php/object:'):
- if (self::$objectSupport) {
- return unserialize(substr($scalar, 13));
- }
- if (self::$exceptionOnInvalidType) {
- throw new ParseException('Object support when parsing a YAML file has been disabled.');
- }
- return;
- case 0 === strpos($scalar, '!!float '):
- return (float) substr($scalar, 8);
- case ctype_digit($scalar):
- $raw = $scalar;
- $cast = (int) $scalar;
- return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
- case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
- $raw = $scalar;
- $cast = (int) $scalar;
- return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw);
- case is_numeric($scalar):
- case preg_match(self::getHexRegex(), $scalar):
- return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
- case '.inf' === $scalarLower:
- case '.nan' === $scalarLower:
- return -log(0);
- case '-.inf' === $scalarLower:
- return log(0);
- case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
- return (float) str_replace(',', '', $scalar);
- case preg_match(self::getTimestampRegex(), $scalar):
- return strtotime($scalar);
- }
- default:
- return (string) $scalar;
- }
- }
- /**
- * Gets a regex that matches a YAML date.
- *
- * @return string The regular expression
- *
- * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
- */
- private static function getTimestampRegex()
- {
- return <<<EOF
- ~^
- (?P<year>[0-9][0-9][0-9][0-9])
- -(?P<month>[0-9][0-9]?)
- -(?P<day>[0-9][0-9]?)
- (?:(?:[Tt]|[ \t]+)
- (?P<hour>[0-9][0-9]?)
- :(?P<minute>[0-9][0-9])
- :(?P<second>[0-9][0-9])
- (?:\.(?P<fraction>[0-9]*))?
- (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
- (?::(?P<tz_minute>[0-9][0-9]))?))?)?
- $~x
- EOF;
- }
- /**
- * Gets a regex that matches a YAML number in hexadecimal notation.
- *
- * @return string
- */
- private static function getHexRegex()
- {
- return '~^0x[0-9a-f]++$~i';
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Unescaper encapsulates unescaping rules for single and double-quoted
- * YAML strings.
- *
- * @author Matthew Lewinski <matthew@lewinski.org>
- */
- class Unescaper
- {
- /**
- * Parser and Inline assume UTF-8 encoding, so escaped Unicode characters
- * must be converted to that encoding.
- *
- * @deprecated since version 2.5, to be removed in 3.0
- * @internal
- */
- const ENCODING = 'UTF-8';
- /**
- * Regex fragment that matches an escaped character in a double quoted string.
- */
- const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})";
- /**
- * Unescapes a single quoted string.
- *
- * @param string $value A single quoted string.
- *
- * @return string The unescaped string.
- */
- public function unescapeSingleQuotedString($value)
- {
- return str_replace('\'\'', '\'', $value);
- }
- /**
- * Unescapes a double quoted string.
- *
- * @param string $value A double quoted string.
- *
- * @return string The unescaped string.
- */
- public function unescapeDoubleQuotedString($value)
- {
- $self = $this;
- $callback = function ($match) use ($self) {
- return $self->unescapeCharacter($match[0]);
- };
- // evaluate the string
- return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
- }
- /**
- * Unescapes a character that was found in a double-quoted string.
- *
- * @param string $value An escaped character
- *
- * @return string The unescaped character
- */
- public function unescapeCharacter($value)
- {
- switch ($value{1}) {
- case '0':
- return "\x0";
- case 'a':
- return "\x7";
- case 'b':
- return "\x8";
- case 't':
- return "\t";
- case "\t":
- return "\t";
- case 'n':
- return "\n";
- case 'v':
- return "\xB";
- case 'f':
- return "\xC";
- case 'r':
- return "\r";
- case 'e':
- return "\x1B";
- case ' ':
- return ' ';
- case '"':
- return '"';
- case '/':
- return '/';
- case '\\':
- return '\\';
- case 'N':
- // U+0085 NEXT LINE
- return "\xC2\x85";
- case '_':
- // U+00A0 NO-BREAK SPACE
- return "\xC2\xA0";
- case 'L':
- // U+2028 LINE SEPARATOR
- return "\xE2\x80\xA8";
- case 'P':
- // U+2029 PARAGRAPH SEPARATOR
- return "\xE2\x80\xA9";
- case 'x':
- return self::utf8chr(hexdec(substr($value, 2, 2)));
- case 'u':
- return self::utf8chr(hexdec(substr($value, 2, 4)));
- case 'U':
- return self::utf8chr(hexdec(substr($value, 2, 8)));
- }
- }
- /**
- * Get the UTF-8 character for the given code point.
- *
- * @param int $c The unicode code point
- *
- * @return string The corresponding UTF-8 character
- */
- private static function utf8chr($c)
- {
- if (0x80 > $c %= 0x200000) {
- return chr($c);
- }
- if (0x800 > $c) {
- return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
- }
- if (0x10000 > $c) {
- return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
- }
- return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- /**
- * Yaml offers convenience methods to load and dump YAML.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class Yaml
- {
- /**
- * Parses YAML into a PHP array.
- *
- * The parse method, when supplied with a YAML stream (string or file),
- * will do its best to convert YAML in a file into a PHP array.
- *
- * Usage:
- * <code>
- * $array = Yaml::parse(file_get_contents('config.yml'));
- * print_r($array);
- * </code>
- *
- * As this method accepts both plain strings and file names as an input,
- * you must validate the input before calling this method. Passing a file
- * as an input is a deprecated feature and will be removed in 3.0.
- *
- * Note: the ability to pass file names to the Yaml::parse method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.
- *
- * @param string $input Path to a YAML file or a string containing YAML
- * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
- * @param bool $objectSupport True if object support is enabled, false otherwise
- * @param bool $objectForMap True if maps should return a stdClass instead of array()
- *
- * @return array The YAML converted to a PHP array
- *
- * @throws ParseException If the YAML is not valid
- *
- * @api
- */
- public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
- {
- // if input is a file, process it
- $file = '';
- if (strpos($input, "\n") === false && is_file($input)) {
- @trigger_error('The ability to pass file names to the '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.', E_USER_DEPRECATED);
- if (false === is_readable($input)) {
- throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input));
- }
- $file = $input;
- $input = file_get_contents($file);
- }
- $yaml = new Parser();
- try {
- return $yaml->parse($input, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } catch (ParseException $e) {
- if ($file) {
- $e->setParsedFile($file);
- }
- throw $e;
- }
- }
- /**
- * Dumps a PHP array to a YAML string.
- *
- * The dump method, when supplied with an array, will do its best
- * to convert the array into friendly YAML.
- *
- * @param array $array PHP array
- * @param int $inline The level where you switch to inline YAML
- * @param int $indent The amount of spaces to use for indentation of nested nodes.
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string A YAML string representing the original PHP array
- *
- * @api
- */
- public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- $yaml = new Dumper();
- $yaml->setIndentation($indent);
- return $yaml->dump($array, $inline, 0, $exceptionOnInvalidType, $objectSupport);
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during parsing.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class ParseException extends RuntimeException
- {
- private $parsedFile;
- private $parsedLine;
- private $snippet;
- private $rawMessage;
- /**
- * Constructor.
- *
- * @param string $message The error message
- * @param int $parsedLine The line where the error occurred
- * @param int $snippet The snippet of code near the problem
- * @param string $parsedFile The file name where the error occurred
- * @param \Exception $previous The previous exception
- */
- public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
- {
- $this->parsedFile = $parsedFile;
- $this->parsedLine = $parsedLine;
- $this->snippet = $snippet;
- $this->rawMessage = $message;
- $this->updateRepr();
- parent::__construct($this->message, 0, $previous);
- }
- /**
- * Gets the snippet of code near the error.
- *
- * @return string The snippet of code
- */
- public function getSnippet()
- {
- return $this->snippet;
- }
- /**
- * Sets the snippet of code near the error.
- *
- * @param string $snippet The code snippet
- */
- public function setSnippet($snippet)
- {
- $this->snippet = $snippet;
- $this->updateRepr();
- }
- /**
- * Gets the filename where the error occurred.
- *
- * This method returns null if a string is parsed.
- *
- * @return string The filename
- */
- public function getParsedFile()
- {
- return $this->parsedFile;
- }
- /**
- * Sets the filename where the error occurred.
- *
- * @param string $parsedFile The filename
- */
- public function setParsedFile($parsedFile)
- {
- $this->parsedFile = $parsedFile;
- $this->updateRepr();
- }
- /**
- * Gets the line where the error occurred.
- *
- * @return int The file line
- */
- public function getParsedLine()
- {
- return $this->parsedLine;
- }
- /**
- * Sets the line where the error occurred.
- *
- * @param int $parsedLine The file line
- */
- public function setParsedLine($parsedLine)
- {
- $this->parsedLine = $parsedLine;
- $this->updateRepr();
- }
- private function updateRepr()
- {
- $this->message = $this->rawMessage;
- $dot = false;
- if ('.' === substr($this->message, -1)) {
- $this->message = substr($this->message, 0, -1);
- $dot = true;
- }
- if (null !== $this->parsedFile) {
- if (PHP_VERSION_ID >= 50400) {
- $jsonOptions = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
- } else {
- $jsonOptions = 0;
- }
- $this->message .= sprintf(' in %s', json_encode($this->parsedFile, $jsonOptions));
- }
- if ($this->parsedLine >= 0) {
- $this->message .= sprintf(' at line %d', $this->parsedLine);
- }
- if ($this->snippet) {
- $this->message .= sprintf(' (near "%s")', $this->snippet);
- }
- if ($dot) {
- $this->message .= '.';
- }
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during dumping.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class DumpException extends RuntimeException
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during parsing.
- *
- * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
- */
- class RuntimeException extends \RuntimeException implements ExceptionInterface
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception interface for all exceptions thrown by the component.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- interface ExceptionInterface
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- /**
- * Parser parses YAML strings to convert them to PHP arrays.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Parser
- {
- const FOLDED_SCALAR_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
- private $offset = 0;
- private $lines = array();
- private $currentLineNb = -1;
- private $currentLine = '';
- private $refs = array();
- /**
- * Constructor.
- *
- * @param int $offset The offset of YAML document (used for line numbers in error messages)
- */
- public function __construct($offset = 0)
- {
- $this->offset = $offset;
- }
- /**
- * Parses a YAML string to a PHP value.
- *
- * @param string $value A YAML string
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- *
- * @return mixed A PHP value
- *
- * @throws ParseException If the YAML is not valid
- */
- public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
- {
- if (!preg_match('//u', $value)) {
- throw new ParseException('The YAML value does not appear to be valid UTF-8.');
- }
- $this->currentLineNb = -1;
- $this->currentLine = '';
- $value = $this->cleanup($value);
- $this->lines = explode("\n", $value);
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding('UTF-8');
- }
- $data = array();
- $context = null;
- $allowOverwrite = false;
- while ($this->moveToNextLine()) {
- if ($this->isCurrentLineEmpty()) {
- continue;
- }
- // tab?
- if ("\t" === $this->currentLine[0]) {
- throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- $isRef = $mergeNode = false;
- if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
- if ($context && 'mapping' == $context) {
- throw new ParseException('You cannot define a sequence item when in a mapping');
- }
- $context = 'sequence';
- if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
- $isRef = $matches['ref'];
- $values['value'] = $matches['value'];
- }
- // array
- if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $data[] = $parser->parse($this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } else {
- if (isset($values['leadspaces'])
- && preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)
- ) {
- // this is a compact notation element, add to next block and parse
- $c = $this->getRealCurrentLineNb();
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $block = $values['value'];
- if ($this->isNextLineIndented()) {
- $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1);
- }
- $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } else {
- $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
- }
- }
- } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) {
- if ($context && 'sequence' == $context) {
- throw new ParseException('You cannot define a mapping item when in a sequence');
- }
- $context = 'mapping';
- // force correct settings
- Inline::parse(null, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- try {
- $key = Inline::parseScalar($values['key']);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- if ('<<' === $key) {
- $mergeNode = true;
- $allowOverwrite = true;
- if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
- $refName = substr($values['value'], 1);
- if (!array_key_exists($refName, $this->refs)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- $refValue = $this->refs[$refName];
- if (!is_array($refValue)) {
- throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- foreach ($refValue as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- if (isset($values['value']) && $values['value'] !== '') {
- $value = $values['value'];
- } else {
- $value = $this->getNextEmbedBlock();
- }
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- if (!is_array($parsed)) {
- throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- if (isset($parsed[0])) {
- // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
- // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
- // in the sequence override keys specified in later mapping nodes.
- foreach ($parsed as $parsedItem) {
- if (!is_array($parsedItem)) {
- throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem);
- }
- foreach ($parsedItem as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- }
- } else {
- // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
- // current mapping, unless the key already exists in it.
- foreach ($parsed as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- }
- }
- } elseif (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
- $isRef = $matches['ref'];
- $values['value'] = $matches['value'];
- }
- if ($mergeNode) {
- // Merge keys
- } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
- // hash
- // if next line is less indented or equal, then it means that the current value is null
- if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = null;
- }
- } else {
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $value = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport, $objectForMap);
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- // multiple documents are not supported
- if ('---' === $this->currentLine) {
- throw new ParseException('Multiple documents are not supported.');
- }
- // 1-liner optionally followed by newline(s)
- if ($this->lines[0] === trim($value)) {
- try {
- $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- if (is_array($value)) {
- $first = reset($value);
- if (is_string($first) && 0 === strpos($first, '*')) {
- $data = array();
- foreach ($value as $alias) {
- $data[] = $this->refs[substr($alias, 1)];
- }
- $value = $data;
- }
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return $value;
- }
- switch (preg_last_error()) {
- case PREG_INTERNAL_ERROR:
- $error = 'Internal PCRE error.';
- break;
- case PREG_BACKTRACK_LIMIT_ERROR:
- $error = 'pcre.backtrack_limit reached.';
- break;
- case PREG_RECURSION_LIMIT_ERROR:
- $error = 'pcre.recursion_limit reached.';
- break;
- case PREG_BAD_UTF8_ERROR:
- $error = 'Malformed UTF-8 data.';
- break;
- case PREG_BAD_UTF8_OFFSET_ERROR:
- $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
- break;
- default:
- $error = 'Unable to parse.';
- }
- throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- if ($isRef) {
- $this->refs[$isRef] = end($data);
- }
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return empty($data) ? null : $data;
- }
- /**
- * Returns the current line number (takes the offset into account).
- *
- * @return int The current line number
- */
- private function getRealCurrentLineNb()
- {
- return $this->currentLineNb + $this->offset;
- }
- /**
- * Returns the current line indentation.
- *
- * @return int The current line indentation
- */
- private function getCurrentLineIndentation()
- {
- return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
- }
- /**
- * Returns the next embed block of YAML.
- *
- * @param int $indentation The indent level at which the block is to be read, or null for default
- * @param bool $inSequence True if the enclosing data structure is a sequence
- *
- * @return string A YAML string
- *
- * @throws ParseException When indentation problem are detected
- */
- private function getNextEmbedBlock($indentation = null, $inSequence = false)
- {
- $oldLineIndentation = $this->getCurrentLineIndentation();
- if (!$this->moveToNextLine()) {
- return;
- }
- if (null === $indentation) {
- $newIndent = $this->getCurrentLineIndentation();
- $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine);
- if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
- throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- } else {
- $newIndent = $indentation;
- }
- $data = array();
- if ($this->getCurrentLineIndentation() >= $newIndent) {
- $data[] = substr($this->currentLine, $newIndent);
- } else {
- $this->moveToPreviousLine();
- return;
- }
- if ($inSequence && $oldLineIndentation === $newIndent && '-' === $data[0][0]) {
- // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
- // and therefore no nested list or mapping
- $this->moveToPreviousLine();
- return;
- }
- $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine);
- // Comments must not be removed inside a string block (ie. after a line ending with "|")
- $removeCommentsPattern = '~'.self::FOLDED_SCALAR_PATTERN.'$~';
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
- while ($this->moveToNextLine()) {
- $indent = $this->getCurrentLineIndentation();
- if ($indent === $newIndent) {
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
- }
- if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine) && $newIndent === $indent) {
- $this->moveToPreviousLine();
- break;
- }
- if ($this->isCurrentLineBlank()) {
- $data[] = substr($this->currentLine, $newIndent);
- continue;
- }
- if ($removeComments && $this->isCurrentLineComment()) {
- continue;
- }
- if ($indent >= $newIndent) {
- $data[] = substr($this->currentLine, $newIndent);
- } elseif (0 == $indent) {
- $this->moveToPreviousLine();
- break;
- } else {
- throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- }
- return implode("\n", $data);
- }
- /**
- * Moves the parser to the next line.
- *
- * @return bool
- */
- private function moveToNextLine()
- {
- if ($this->currentLineNb >= count($this->lines) - 1) {
- return false;
- }
- $this->currentLine = $this->lines[++$this->currentLineNb];
- return true;
- }
- /**
- * Moves the parser to the previous line.
- */
- private function moveToPreviousLine()
- {
- $this->currentLine = $this->lines[--$this->currentLineNb];
- }
- /**
- * Parses a YAML value.
- *
- * @param string $value A YAML value
- * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
- * @param bool $objectSupport True if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- *
- * @return mixed A PHP value
- *
- * @throws ParseException When reference does not exist
- */
- private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $objectForMap)
- {
- if (0 === strpos($value, '*')) {
- if (false !== $pos = strpos($value, '#')) {
- $value = substr($value, 1, $pos - 2);
- } else {
- $value = substr($value, 1);
- }
- if (!array_key_exists($value, $this->refs)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine);
- }
- return $this->refs[$value];
- }
- if (preg_match('/^'.self::FOLDED_SCALAR_PATTERN.'$/', $value, $matches)) {
- $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
- return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers));
- }
- try {
- return Inline::parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- }
- /**
- * Parses a folded scalar.
- *
- * @param string $separator The separator that was used to begin this folded scalar (| or >)
- * @param string $indicator The indicator that was used to begin this folded scalar (+ or -)
- * @param int $indentation The indentation that was used to begin this folded scalar
- *
- * @return string The text value
- */
- private function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
- {
- $notEOF = $this->moveToNextLine();
- if (!$notEOF) {
- return '';
- }
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- $text = '';
- // leading blank lines are consumed before determining indentation
- while ($notEOF && $isCurrentLineBlank) {
- // newline only if not EOF
- if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- }
- }
- // determine indentation if not specified
- if (0 === $indentation) {
- if (preg_match('/^ +/', $this->currentLine, $matches)) {
- $indentation = strlen($matches[0]);
- }
- }
- if ($indentation > 0) {
- $pattern = sprintf('/^ {%d}(.*)$/', $indentation);
- while (
- $notEOF && (
- $isCurrentLineBlank ||
- preg_match($pattern, $this->currentLine, $matches)
- )
- ) {
- if ($isCurrentLineBlank) {
- $text .= substr($this->currentLine, $indentation);
- } else {
- $text .= $matches[1];
- }
- // newline only if not EOF
- if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- }
- }
- } elseif ($notEOF) {
- $text .= "\n";
- }
- if ($notEOF) {
- $this->moveToPreviousLine();
- }
- // replace all non-trailing single newlines with spaces in folded blocks
- if ('>' === $separator) {
- preg_match('/(\n*)$/', $text, $matches);
- $text = preg_replace('/(?<!\n)\n(?!\n)/', ' ', rtrim($text, "\n"));
- $text .= $matches[1];
- }
- // deal with trailing newlines as indicated
- if ('' === $indicator) {
- $text = preg_replace('/\n+$/s', "\n", $text);
- } elseif ('-' === $indicator) {
- $text = preg_replace('/\n+$/s', '', $text);
- }
- return $text;
- }
- /**
- * Returns true if the next line is indented.
- *
- * @return bool Returns true if the next line is indented, false otherwise
- */
- private function isNextLineIndented()
- {
- $currentIndentation = $this->getCurrentLineIndentation();
- $EOF = !$this->moveToNextLine();
- while (!$EOF && $this->isCurrentLineEmpty()) {
- $EOF = !$this->moveToNextLine();
- }
- if ($EOF) {
- return false;
- }
- $ret = false;
- if ($this->getCurrentLineIndentation() > $currentIndentation) {
- $ret = true;
- }
- $this->moveToPreviousLine();
- return $ret;
- }
- /**
- * Returns true if the current line is blank or if it is a comment line.
- *
- * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
- */
- private function isCurrentLineEmpty()
- {
- return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
- }
- /**
- * Returns true if the current line is blank.
- *
- * @return bool Returns true if the current line is blank, false otherwise
- */
- private function isCurrentLineBlank()
- {
- return '' == trim($this->currentLine, ' ');
- }
- /**
- * Returns true if the current line is a comment line.
- *
- * @return bool Returns true if the current line is a comment line, false otherwise
- */
- private function isCurrentLineComment()
- {
- //checking explicitly the first char of the trim is faster than loops or strpos
- $ltrimmedLine = ltrim($this->currentLine, ' ');
- return $ltrimmedLine[0] === '#';
- }
- /**
- * Cleanups a YAML string to be parsed.
- *
- * @param string $value The input YAML string
- *
- * @return string A cleaned up YAML string
- */
- private function cleanup($value)
- {
- $value = str_replace(array("\r\n", "\r"), "\n", $value);
- // strip YAML header
- $count = 0;
- $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
- $this->offset += $count;
- // remove leading comments
- $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
- if ($count == 1) {
- // items have been removed, update the offset
- $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
- $value = $trimmedValue;
- }
- // remove start of the document marker (---)
- $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
- if ($count == 1) {
- // items have been removed, update the offset
- $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
- $value = $trimmedValue;
- // remove end of the document marker (...)
- $value = preg_replace('#\.\.\.\s*$#s', '', $value);
- }
- return $value;
- }
- /**
- * Returns true if the next line starts unindented collection.
- *
- * @return bool Returns true if the next line starts unindented collection, false otherwise
- */
- private function isNextLineUnIndentedCollection()
- {
- $currentIndentation = $this->getCurrentLineIndentation();
- $notEOF = $this->moveToNextLine();
- while ($notEOF && $this->isCurrentLineEmpty()) {
- $notEOF = $this->moveToNextLine();
- }
- if (false === $notEOF) {
- return false;
- }
- $ret = false;
- if (
- $this->getCurrentLineIndentation() == $currentIndentation
- &&
- $this->isStringUnIndentedCollectionItem($this->currentLine)
- ) {
- $ret = true;
- }
- $this->moveToPreviousLine();
- return $ret;
- }
- /**
- * Returns true if the string is un-indented collection item.
- *
- * @return bool Returns true if the string is un-indented collection item, false otherwise
- */
- private function isStringUnIndentedCollectionItem()
- {
- return (0 === strpos($this->currentLine, '- '));
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Dumper dumps PHP variables to YAML strings.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Dumper
- {
- /**
- * The amount of spaces to use for indentation of nested nodes.
- *
- * @var int
- */
- protected $indentation = 4;
- /**
- * Sets the indentation.
- *
- * @param int $num The amount of spaces to use for indentation of nested nodes.
- */
- public function setIndentation($num)
- {
- $this->indentation = (int) $num;
- }
- /**
- * Dumps a PHP value to YAML.
- *
- * @param mixed $input The PHP value
- * @param int $inline The level where you switch to inline YAML
- * @param int $indent The level of indentation (used internally)
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML representation of the PHP value
- */
- public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- $output = '';
- $prefix = $indent ? str_repeat(' ', $indent) : '';
- if ($inline <= 0 || !is_array($input) || empty($input)) {
- $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport);
- } else {
- $isAHash = array_keys($input) !== range(0, count($input) - 1);
- foreach ($input as $key => $value) {
- $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);
- $output .= sprintf('%s%s%s%s',
- $prefix,
- $isAHash ? Inline::dump($key, $exceptionOnInvalidType, $objectSupport).':' : '-',
- $willBeInlined ? ' ' : "\n",
- $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $exceptionOnInvalidType, $objectSupport)
- ).($willBeInlined ? "\n" : '');
- }
- }
- return $output;
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Escaper encapsulates escaping rules for single and double-quoted
- * YAML strings.
- *
- * @author Matthew Lewinski <matthew@lewinski.org>
- */
- class Escaper
- {
- // Characters that would cause a dumped string to require double quoting.
- const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";
- // Mapping arrays for escaping a double quoted string. The backslash is
- // first to ensure proper escaping because str_replace operates iteratively
- // on the input arrays. This ordering of the characters avoids the use of strtr,
- // which performs more slowly.
- private static $escapees = array('\\', '\\\\', '\\"', '"',
- "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07",
- "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f",
- "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17",
- "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f",
- "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",);
- private static $escaped = array('\\\\', '\\"', '\\\\', '\\"',
- '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
- '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f',
- '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
- '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f',
- '\\N', '\\_', '\\L', '\\P',);
- /**
- * Determines if a PHP value would require double quoting in YAML.
- *
- * @param string $value A PHP value
- *
- * @return bool True if the value would require double quotes.
- */
- public static function requiresDoubleQuoting($value)
- {
- return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
- }
- /**
- * Escapes and surrounds a PHP value with double quotes.
- *
- * @param string $value A PHP value
- *
- * @return string The quoted, escaped string
- */
- public static function escapeWithDoubleQuotes($value)
- {
- return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value));
- }
- /**
- * Determines if a PHP value would require single quoting in YAML.
- *
- * @param string $value A PHP value
- *
- * @return bool True if the value would require single quotes.
- */
- public static function requiresSingleQuoting($value)
- {
- // Determines if a PHP value is entirely composed of a value that would
- // require single quoting in YAML.
- if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) {
- return true;
- }
- // Determines if the PHP value contains any single characters that would
- // cause it to require single quoting in YAML.
- return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value);
- }
- /**
- * Escapes and surrounds a PHP value with single quotes.
- *
- * @param string $value A PHP value
- *
- * @return string The quoted, escaped string
- */
- public static function escapeWithSingleQuotes($value)
- {
- return sprintf("'%s'", str_replace('\'', '\'\'', $value));
- }
- }
- -----BEGIN CERTIFICATE-----
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
- MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
- IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
- MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
- FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
- bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
- dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
- H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
- uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
- mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
- a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
- E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
- WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
- VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
- Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
- cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
- IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
- AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
- YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
- Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
- c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
- mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
- -----END CERTIFICATE-----
- Copyright (c) 2014 Doctrine Project
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator;
- /**
- * Instantiator provides utility methods to build objects without invoking their constructors
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- interface InstantiatorInterface
- {
- /**
- * @param string $className
- *
- * @return object
- *
- * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
- */
- public function instantiate($className);
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- /**
- * Base exception marker interface for the instantiator component
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- interface ExceptionInterface
- {
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- use InvalidArgumentException as BaseInvalidArgumentException;
- use ReflectionClass;
- /**
- * Exception for invalid arguments provided to the instantiator
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
- {
- /**
- * @param string $className
- *
- * @return self
- */
- public static function fromNonExistingClass($className)
- {
- if (interface_exists($className)) {
- return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
- }
- if (PHP_VERSION_ID >= 50400 && trait_exists($className)) {
- return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className));
- }
- return new self(sprintf('The provided class "%s" does not exist', $className));
- }
- /**
- * @param ReflectionClass $reflectionClass
- *
- * @return self
- */
- public static function fromAbstractClass(ReflectionClass $reflectionClass)
- {
- return new self(sprintf(
- 'The provided class "%s" is abstract, and can not be instantiated',
- $reflectionClass->getName()
- ));
- }
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- use Exception;
- use ReflectionClass;
- use UnexpectedValueException as BaseUnexpectedValueException;
- /**
- * Exception for given parameters causing invalid/unexpected state on instantiation
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
- {
- /**
- * @param ReflectionClass $reflectionClass
- * @param Exception $exception
- *
- * @return self
- */
- public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception)
- {
- return new self(
- sprintf(
- 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
- $reflectionClass->getName()
- ),
- 0,
- $exception
- );
- }
- /**
- * @param ReflectionClass $reflectionClass
- * @param string $errorString
- * @param int $errorCode
- * @param string $errorFile
- * @param int $errorLine
- *
- * @return UnexpectedValueException
- */
- public static function fromUncleanUnSerialization(
- ReflectionClass $reflectionClass,
- $errorString,
- $errorCode,
- $errorFile,
- $errorLine
- ) {
- return new self(
- sprintf(
- 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
- . 'in file "%s" at line "%d"',
- $reflectionClass->getName(),
- $errorFile,
- $errorLine
- ),
- 0,
- new Exception($errorString, $errorCode)
- );
- }
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator;
- use Closure;
- use Doctrine\Instantiator\Exception\InvalidArgumentException;
- use Doctrine\Instantiator\Exception\UnexpectedValueException;
- use Exception;
- use ReflectionClass;
- /**
- * {@inheritDoc}
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- final class Instantiator implements InstantiatorInterface
- {
- /**
- * Markers used internally by PHP to define whether {@see \unserialize} should invoke
- * the method {@see \Serializable::unserialize()} when dealing with classes implementing
- * the {@see \Serializable} interface.
- */
- const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
- const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
- /**
- * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes
- */
- private static $cachedInstantiators = array();
- /**
- * @var object[] of objects that can directly be cloned
- */
- private static $cachedCloneables = array();
- /**
- * {@inheritDoc}
- */
- public function instantiate($className)
- {
- if (isset(self::$cachedCloneables[$className])) {
- return clone self::$cachedCloneables[$className];
- }
- if (isset(self::$cachedInstantiators[$className])) {
- $factory = self::$cachedInstantiators[$className];
- return $factory();
- }
- return $this->buildAndCacheFromFactory($className);
- }
- /**
- * Builds the requested object and caches it in static properties for performance
- *
- * @param string $className
- *
- * @return object
- */
- private function buildAndCacheFromFactory($className)
- {
- $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
- $instance = $factory();
- if ($this->isSafeToClone(new ReflectionClass($instance))) {
- self::$cachedCloneables[$className] = clone $instance;
- }
- return $instance;
- }
- /**
- * Builds a {@see \Closure} capable of instantiating the given $className without
- * invoking its constructor.
- *
- * @param string $className
- *
- * @return Closure
- */
- private function buildFactory($className)
- {
- $reflectionClass = $this->getReflectionClass($className);
- if ($this->isInstantiableViaReflection($reflectionClass)) {
- return function () use ($reflectionClass) {
- return $reflectionClass->newInstanceWithoutConstructor();
- };
- }
- $serializedString = sprintf(
- '%s:%d:"%s":0:{}',
- $this->getSerializationFormat($reflectionClass),
- strlen($className),
- $className
- );
- $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
- return function () use ($serializedString) {
- return unserialize($serializedString);
- };
- }
- /**
- * @param string $className
- *
- * @return ReflectionClass
- *
- * @throws InvalidArgumentException
- */
- private function getReflectionClass($className)
- {
- if (! class_exists($className)) {
- throw InvalidArgumentException::fromNonExistingClass($className);
- }
- $reflection = new ReflectionClass($className);
- if ($reflection->isAbstract()) {
- throw InvalidArgumentException::fromAbstractClass($reflection);
- }
- return $reflection;
- }
- /**
- * @param ReflectionClass $reflectionClass
- * @param string $serializedString
- *
- * @throws UnexpectedValueException
- *
- * @return void
- */
- private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString)
- {
- set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) {
- $error = UnexpectedValueException::fromUncleanUnSerialization(
- $reflectionClass,
- $message,
- $code,
- $file,
- $line
- );
- });
- $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
- restore_error_handler();
- if ($error) {
- throw $error;
- }
- }
- /**
- * @param ReflectionClass $reflectionClass
- * @param string $serializedString
- *
- * @throws UnexpectedValueException
- *
- * @return void
- */
- private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString)
- {
- try {
- unserialize($serializedString);
- } catch (Exception $exception) {
- restore_error_handler();
- throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
- }
- }
- /**
- * @param ReflectionClass $reflectionClass
- *
- * @return bool
- */
- private function isInstantiableViaReflection(ReflectionClass $reflectionClass)
- {
- if (\PHP_VERSION_ID >= 50600) {
- return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
- }
- return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass);
- }
- /**
- * Verifies whether the given class is to be considered internal
- *
- * @param ReflectionClass $reflectionClass
- *
- * @return bool
- */
- private function hasInternalAncestors(ReflectionClass $reflectionClass)
- {
- do {
- if ($reflectionClass->isInternal()) {
- return true;
- }
- } while ($reflectionClass = $reflectionClass->getParentClass());
- return false;
- }
- /**
- * Verifies if the given PHP version implements the `Serializable` interface serialization
- * with an incompatible serialization format. If that's the case, use serialization marker
- * "C" instead of "O".
- *
- * @link http://news.php.net/php.internals/74654
- *
- * @param ReflectionClass $reflectionClass
- *
- * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER
- * or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER
- */
- private function getSerializationFormat(ReflectionClass $reflectionClass)
- {
- if ($this->isPhpVersionWithBrokenSerializationFormat()
- && $reflectionClass->implementsInterface('Serializable')
- ) {
- return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER;
- }
- return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER;
- }
- /**
- * Checks whether the current PHP runtime uses an incompatible serialization format
- *
- * @return bool
- */
- private function isPhpVersionWithBrokenSerializationFormat()
- {
- return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513;
- }
- /**
- * Checks if a class is cloneable
- *
- * @param ReflectionClass $reflection
- *
- * @return bool
- */
- private function isSafeToClone(ReflectionClass $reflection)
- {
- if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) {
- return false;
- }
- // not cloneable if it implements `__clone`, as we want to avoid calling it
- return ! $reflection->hasMethod('__clone');
- }
- }
- PHP_TokenStream
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A caching factory for token stream objects.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- class PHP_Token_Stream_CachingFactory
- {
- /**
- * @var array
- */
- protected static $cache = array();
- /**
- * @param string $filename
- * @return PHP_Token_Stream
- */
- public static function get($filename)
- {
- if (!isset(self::$cache[$filename])) {
- self::$cache[$filename] = new PHP_Token_Stream($filename);
- }
- return self::$cache[$filename];
- }
- /**
- * @param string $filename
- */
- public static function clear($filename = null)
- {
- if (is_string($filename)) {
- unset(self::$cache[$filename]);
- } else {
- self::$cache = array();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A stream of PHP tokens.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
- {
- /**
- * @var array
- */
- protected static $customTokens = array(
- '(' => 'PHP_Token_OPEN_BRACKET',
- ')' => 'PHP_Token_CLOSE_BRACKET',
- '[' => 'PHP_Token_OPEN_SQUARE',
- ']' => 'PHP_Token_CLOSE_SQUARE',
- '{' => 'PHP_Token_OPEN_CURLY',
- '}' => 'PHP_Token_CLOSE_CURLY',
- ';' => 'PHP_Token_SEMICOLON',
- '.' => 'PHP_Token_DOT',
- ',' => 'PHP_Token_COMMA',
- '=' => 'PHP_Token_EQUAL',
- '<' => 'PHP_Token_LT',
- '>' => 'PHP_Token_GT',
- '+' => 'PHP_Token_PLUS',
- '-' => 'PHP_Token_MINUS',
- '*' => 'PHP_Token_MULT',
- '/' => 'PHP_Token_DIV',
- '?' => 'PHP_Token_QUESTION_MARK',
- '!' => 'PHP_Token_EXCLAMATION_MARK',
- ':' => 'PHP_Token_COLON',
- '"' => 'PHP_Token_DOUBLE_QUOTES',
- '@' => 'PHP_Token_AT',
- '&' => 'PHP_Token_AMPERSAND',
- '%' => 'PHP_Token_PERCENT',
- '|' => 'PHP_Token_PIPE',
- '$' => 'PHP_Token_DOLLAR',
- '^' => 'PHP_Token_CARET',
- '~' => 'PHP_Token_TILDE',
- '`' => 'PHP_Token_BACKTICK'
- );
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var array
- */
- protected $tokens = array();
- /**
- * @var integer
- */
- protected $position = 0;
- /**
- * @var array
- */
- protected $linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
- /**
- * @var array
- */
- protected $classes;
- /**
- * @var array
- */
- protected $functions;
- /**
- * @var array
- */
- protected $includes;
- /**
- * @var array
- */
- protected $interfaces;
- /**
- * @var array
- */
- protected $traits;
- /**
- * @var array
- */
- protected $lineToFunctionMap = array();
- /**
- * Constructor.
- *
- * @param string $sourceCode
- */
- public function __construct($sourceCode)
- {
- if (is_file($sourceCode)) {
- $this->filename = $sourceCode;
- $sourceCode = file_get_contents($sourceCode);
- }
- $this->scan($sourceCode);
- }
- /**
- * Destructor.
- */
- public function __destruct()
- {
- $this->tokens = array();
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $buffer = '';
- foreach ($this as $token) {
- $buffer .= $token;
- }
- return $buffer;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getFilename()
- {
- return $this->filename;
- }
- /**
- * Scans the source for sequences of characters and converts them into a
- * stream of tokens.
- *
- * @param string $sourceCode
- */
- protected function scan($sourceCode)
- {
- $line = 1;
- $tokens = token_get_all($sourceCode);
- $numTokens = count($tokens);
- $lastNonWhitespaceTokenWasDoubleColon = false;
- for ($i = 0; $i < $numTokens; ++$i) {
- $token = $tokens[$i];
- unset($tokens[$i]);
- if (is_array($token)) {
- $name = substr(token_name($token[0]), 2);
- $text = $token[1];
- if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') {
- $name = 'CLASS_NAME_CONSTANT';
- }
- $tokenClass = 'PHP_Token_' . $name;
- } else {
- $text = $token;
- $tokenClass = self::$customTokens[$token];
- }
- $this->tokens[] = new $tokenClass($text, $line, $this, $i);
- $lines = substr_count($text, "\n");
- $line += $lines;
- if ($tokenClass == 'PHP_Token_HALT_COMPILER') {
- break;
- } elseif ($tokenClass == 'PHP_Token_COMMENT' ||
- $tokenClass == 'PHP_Token_DOC_COMMENT') {
- $this->linesOfCode['cloc'] += $lines + 1;
- }
- if ($name == 'DOUBLE_COLON') {
- $lastNonWhitespaceTokenWasDoubleColon = true;
- } elseif ($name != 'WHITESPACE') {
- $lastNonWhitespaceTokenWasDoubleColon = false;
- }
- }
- $this->linesOfCode['loc'] = substr_count($sourceCode, "\n");
- $this->linesOfCode['ncloc'] = $this->linesOfCode['loc'] -
- $this->linesOfCode['cloc'];
- }
- /**
- * @return integer
- */
- public function count()
- {
- return count($this->tokens);
- }
- /**
- * @return PHP_Token[]
- */
- public function tokens()
- {
- return $this->tokens;
- }
- /**
- * @return array
- */
- public function getClasses()
- {
- if ($this->classes !== null) {
- return $this->classes;
- }
- $this->parse();
- return $this->classes;
- }
- /**
- * @return array
- */
- public function getFunctions()
- {
- if ($this->functions !== null) {
- return $this->functions;
- }
- $this->parse();
- return $this->functions;
- }
- /**
- * @return array
- */
- public function getInterfaces()
- {
- if ($this->interfaces !== null) {
- return $this->interfaces;
- }
- $this->parse();
- return $this->interfaces;
- }
- /**
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getTraits()
- {
- if ($this->traits !== null) {
- return $this->traits;
- }
- $this->parse();
- return $this->traits;
- }
- /**
- * Gets the names of all files that have been included
- * using include(), include_once(), require() or require_once().
- *
- * Parameter $categorize set to TRUE causing this function to return a
- * multi-dimensional array with categories in the keys of the first dimension
- * and constants and their values in the second dimension.
- *
- * Parameter $category allow to filter following specific inclusion type
- *
- * @param bool $categorize OPTIONAL
- * @param string $category OPTIONAL Either 'require_once', 'require',
- * 'include_once', 'include'.
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getIncludes($categorize = false, $category = null)
- {
- if ($this->includes === null) {
- $this->includes = array(
- 'require_once' => array(),
- 'require' => array(),
- 'include_once' => array(),
- 'include' => array()
- );
- foreach ($this->tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_REQUIRE_ONCE':
- case 'PHP_Token_REQUIRE':
- case 'PHP_Token_INCLUDE_ONCE':
- case 'PHP_Token_INCLUDE':
- $this->includes[$token->getType()][] = $token->getName();
- break;
- }
- }
- }
- if (isset($this->includes[$category])) {
- $includes = $this->includes[$category];
- } elseif ($categorize === false) {
- $includes = array_merge(
- $this->includes['require_once'],
- $this->includes['require'],
- $this->includes['include_once'],
- $this->includes['include']
- );
- } else {
- $includes = $this->includes;
- }
- return $includes;
- }
- /**
- * Returns the name of the function or method a line belongs to.
- *
- * @return string or null if the line is not in a function or method
- * @since Method available since Release 1.2.0
- */
- public function getFunctionForLine($line)
- {
- $this->parse();
- if (isset($this->lineToFunctionMap[$line])) {
- return $this->lineToFunctionMap[$line];
- }
- }
- protected function parse()
- {
- $this->interfaces = array();
- $this->classes = array();
- $this->traits = array();
- $this->functions = array();
- $class = false;
- $classEndLine = false;
- $trait = false;
- $traitEndLine = false;
- $interface = false;
- $interfaceEndLine = false;
- foreach ($this->tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_HALT_COMPILER':
- return;
- case 'PHP_Token_INTERFACE':
- $interface = $token->getName();
- $interfaceEndLine = $token->getEndLine();
- $this->interfaces[$interface] = array(
- 'methods' => array(),
- 'parent' => $token->getParent(),
- 'keywords' => $token->getKeywords(),
- 'docblock' => $token->getDocblock(),
- 'startLine' => $token->getLine(),
- 'endLine' => $interfaceEndLine,
- 'package' => $token->getPackage(),
- 'file' => $this->filename
- );
- break;
- case 'PHP_Token_CLASS':
- case 'PHP_Token_TRAIT':
- $tmp = array(
- 'methods' => array(),
- 'parent' => $token->getParent(),
- 'interfaces'=> $token->getInterfaces(),
- 'keywords' => $token->getKeywords(),
- 'docblock' => $token->getDocblock(),
- 'startLine' => $token->getLine(),
- 'endLine' => $token->getEndLine(),
- 'package' => $token->getPackage(),
- 'file' => $this->filename
- );
- if ($token instanceof PHP_Token_CLASS) {
- $class = $token->getName();
- $classEndLine = $token->getEndLine();
- $this->classes[$class] = $tmp;
- } else {
- $trait = $token->getName();
- $traitEndLine = $token->getEndLine();
- $this->traits[$trait] = $tmp;
- }
- break;
- case 'PHP_Token_FUNCTION':
- $name = $token->getName();
- $tmp = array(
- 'docblock' => $token->getDocblock(),
- 'keywords' => $token->getKeywords(),
- 'visibility'=> $token->getVisibility(),
- 'signature' => $token->getSignature(),
- 'startLine' => $token->getLine(),
- 'endLine' => $token->getEndLine(),
- 'ccn' => $token->getCCN(),
- 'file' => $this->filename
- );
- if ($class === false &&
- $trait === false &&
- $interface === false) {
- $this->functions[$name] = $tmp;
- $this->addFunctionToMap(
- $name,
- $tmp['startLine'],
- $tmp['endLine']
- );
- } elseif ($class !== false) {
- $this->classes[$class]['methods'][$name] = $tmp;
- $this->addFunctionToMap(
- $class . '::' . $name,
- $tmp['startLine'],
- $tmp['endLine']
- );
- } elseif ($trait !== false) {
- $this->traits[$trait]['methods'][$name] = $tmp;
- $this->addFunctionToMap(
- $trait . '::' . $name,
- $tmp['startLine'],
- $tmp['endLine']
- );
- } else {
- $this->interfaces[$interface]['methods'][$name] = $tmp;
- }
- break;
- case 'PHP_Token_CLOSE_CURLY':
- if ($classEndLine !== false &&
- $classEndLine == $token->getLine()) {
- $class = false;
- $classEndLine = false;
- } elseif ($traitEndLine !== false &&
- $traitEndLine == $token->getLine()) {
- $trait = false;
- $traitEndLine = false;
- } elseif ($interfaceEndLine !== false &&
- $interfaceEndLine == $token->getLine()) {
- $interface = false;
- $interfaceEndLine = false;
- }
- break;
- }
- }
- }
- /**
- * @return array
- */
- public function getLinesOfCode()
- {
- return $this->linesOfCode;
- }
- /**
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * @return boolean
- */
- public function valid()
- {
- return isset($this->tokens[$this->position]);
- }
- /**
- * @return integer
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * @return PHP_Token
- */
- public function current()
- {
- return $this->tokens[$this->position];
- }
- /**
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * @param integer $offset
- * @return boolean
- */
- public function offsetExists($offset)
- {
- return isset($this->tokens[$offset]);
- }
- /**
- * @param integer $offset
- * @return mixed
- * @throws OutOfBoundsException
- */
- public function offsetGet($offset)
- {
- if (!$this->offsetExists($offset)) {
- throw new OutOfBoundsException(
- sprintf(
- 'No token at position "%s"',
- $offset
- )
- );
- }
- return $this->tokens[$offset];
- }
- /**
- * @param integer $offset
- * @param mixed $value
- */
- public function offsetSet($offset, $value)
- {
- $this->tokens[$offset] = $value;
- }
- /**
- * @param integer $offset
- * @throws OutOfBoundsException
- */
- public function offsetUnset($offset)
- {
- if (!$this->offsetExists($offset)) {
- throw new OutOfBoundsException(
- sprintf(
- 'No token at position "%s"',
- $offset
- )
- );
- }
- unset($this->tokens[$offset]);
- }
- /**
- * Seek to an absolute position.
- *
- * @param integer $position
- * @throws OutOfBoundsException
- */
- public function seek($position)
- {
- $this->position = $position;
- if (!$this->valid()) {
- throw new OutOfBoundsException(
- sprintf(
- 'No token at position "%s"',
- $this->position
- )
- );
- }
- }
- /**
- * @param string $name
- * @param integer $startLine
- * @param integer $endLine
- */
- private function addFunctionToMap($name, $startLine, $endLine)
- {
- for ($line = $startLine; $line <= $endLine; $line++) {
- $this->lineToFunctionMap[$line] = $name;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A PHP token.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- abstract class PHP_Token
- {
- /**
- * @var string
- */
- protected $text;
- /**
- * @var integer
- */
- protected $line;
- /**
- * @var PHP_Token_Stream
- */
- protected $tokenStream;
- /**
- * @var integer
- */
- protected $id;
- /**
- * Constructor.
- *
- * @param string $text
- * @param integer $line
- * @param PHP_Token_Stream $tokenStream
- * @param integer $id
- */
- public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
- {
- $this->text = $text;
- $this->line = $line;
- $this->tokenStream = $tokenStream;
- $this->id = $id;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- return $this->text;
- }
- /**
- * @return integer
- */
- public function getLine()
- {
- return $this->line;
- }
- }
- abstract class PHP_TokenWithScope extends PHP_Token
- {
- /**
- * @var integer
- */
- protected $endTokenId;
- /**
- * Get the docblock for this token
- *
- * This method will fetch the docblock belonging to the current token. The
- * docblock must be placed on the line directly above the token to be
- * recognized.
- *
- * @return string|null Returns the docblock as a string if found
- */
- public function getDocblock()
- {
- $tokens = $this->tokenStream->tokens();
- $currentLineNumber = $tokens[$this->id]->getLine();
- $prevLineNumber = $currentLineNumber - 1;
- for ($i = $this->id - 1; $i; $i--) {
- if (!isset($tokens[$i])) {
- return;
- }
- if ($tokens[$i] instanceof PHP_Token_FUNCTION ||
- $tokens[$i] instanceof PHP_Token_CLASS ||
- $tokens[$i] instanceof PHP_Token_TRAIT) {
- // Some other trait, class or function, no docblock can be
- // used for the current token
- break;
- }
- $line = $tokens[$i]->getLine();
- if ($line == $currentLineNumber ||
- ($line == $prevLineNumber &&
- $tokens[$i] instanceof PHP_Token_WHITESPACE)) {
- continue;
- }
- if ($line < $currentLineNumber &&
- !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) {
- break;
- }
- return (string)$tokens[$i];
- }
- }
- /**
- * @return integer
- */
- public function getEndTokenId()
- {
- $block = 0;
- $i = $this->id;
- $tokens = $this->tokenStream->tokens();
- while ($this->endTokenId === null && isset($tokens[$i])) {
- if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY ||
- $tokens[$i] instanceof PHP_Token_CURLY_OPEN) {
- $block++;
- } elseif ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) {
- $block--;
- if ($block === 0) {
- $this->endTokenId = $i;
- }
- } elseif (($this instanceof PHP_Token_FUNCTION ||
- $this instanceof PHP_Token_NAMESPACE) &&
- $tokens[$i] instanceof PHP_Token_SEMICOLON) {
- if ($block === 0) {
- $this->endTokenId = $i;
- }
- }
- $i++;
- }
- if ($this->endTokenId === null) {
- $this->endTokenId = $this->id;
- }
- return $this->endTokenId;
- }
- /**
- * @return integer
- */
- public function getEndLine()
- {
- return $this->tokenStream[$this->getEndTokenId()]->getLine();
- }
- }
- abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope
- {
- /**
- * @return string
- */
- public function getVisibility()
- {
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_PRIVATE ||
- $tokens[$i] instanceof PHP_Token_PROTECTED ||
- $tokens[$i] instanceof PHP_Token_PUBLIC)) {
- return strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$i]))
- );
- }
- if (isset($tokens[$i]) &&
- !($tokens[$i] instanceof PHP_Token_STATIC ||
- $tokens[$i] instanceof PHP_Token_FINAL ||
- $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
- // no keywords; stop visibility search
- break;
- }
- }
- }
- /**
- * @return string
- */
- public function getKeywords()
- {
- $keywords = array();
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_PRIVATE ||
- $tokens[$i] instanceof PHP_Token_PROTECTED ||
- $tokens[$i] instanceof PHP_Token_PUBLIC)) {
- continue;
- }
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_STATIC ||
- $tokens[$i] instanceof PHP_Token_FINAL ||
- $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
- $keywords[] = strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$i]))
- );
- }
- }
- return implode(',', $keywords);
- }
- }
- abstract class PHP_Token_Includes extends PHP_Token
- {
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $type;
- /**
- * @return string
- */
- public function getName()
- {
- if ($this->name === null) {
- $this->process();
- }
- return $this->name;
- }
- /**
- * @return string
- */
- public function getType()
- {
- if ($this->type === null) {
- $this->process();
- }
- return $this->type;
- }
- private function process()
- {
- $tokens = $this->tokenStream->tokens();
- if ($tokens[$this->id+2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
- $this->name = trim($tokens[$this->id+2], "'\"");
- $this->type = strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
- );
- }
- }
- }
- class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
- {
- /**
- * @var array
- */
- protected $arguments;
- /**
- * @var integer
- */
- protected $ccn;
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $signature;
- /**
- * @return array
- */
- public function getArguments()
- {
- if ($this->arguments !== null) {
- return $this->arguments;
- }
- $this->arguments = array();
- $tokens = $this->tokenStream->tokens();
- $typeDeclaration = null;
- // Search for first token inside brackets
- $i = $this->id + 2;
- while (!$tokens[$i-1] instanceof PHP_Token_OPEN_BRACKET) {
- $i++;
- }
- while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $typeDeclaration = (string)$tokens[$i];
- } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) {
- $this->arguments[(string)$tokens[$i]] = $typeDeclaration;
- $typeDeclaration = null;
- }
- $i++;
- }
- return $this->arguments;
- }
- /**
- * @return string
- */
- public function getName()
- {
- if ($this->name !== null) {
- return $this->name;
- }
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id + 1; $i < count($tokens); $i++) {
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $this->name = (string)$tokens[$i];
- break;
- } elseif ($tokens[$i] instanceof PHP_Token_AMPERSAND &&
- $tokens[$i+1] instanceof PHP_Token_STRING) {
- $this->name = (string)$tokens[$i+1];
- break;
- } elseif ($tokens[$i] instanceof PHP_Token_OPEN_BRACKET) {
- $this->name = 'anonymous function';
- break;
- }
- }
- if ($this->name != 'anonymous function') {
- for ($i = $this->id; $i; --$i) {
- if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
- $this->name = $tokens[$i]->getName() . '\\' . $this->name;
- break;
- }
- if ($tokens[$i] instanceof PHP_Token_INTERFACE) {
- break;
- }
- }
- }
- return $this->name;
- }
- /**
- * @return integer
- */
- public function getCCN()
- {
- if ($this->ccn !== null) {
- return $this->ccn;
- }
- $this->ccn = 1;
- $end = $this->getEndTokenId();
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id; $i <= $end; $i++) {
- switch (get_class($tokens[$i])) {
- case 'PHP_Token_IF':
- case 'PHP_Token_ELSEIF':
- case 'PHP_Token_FOR':
- case 'PHP_Token_FOREACH':
- case 'PHP_Token_WHILE':
- case 'PHP_Token_CASE':
- case 'PHP_Token_CATCH':
- case 'PHP_Token_BOOLEAN_AND':
- case 'PHP_Token_LOGICAL_AND':
- case 'PHP_Token_BOOLEAN_OR':
- case 'PHP_Token_LOGICAL_OR':
- case 'PHP_Token_QUESTION_MARK':
- $this->ccn++;
- break;
- }
- }
- return $this->ccn;
- }
- /**
- * @return string
- */
- public function getSignature()
- {
- if ($this->signature !== null) {
- return $this->signature;
- }
- if ($this->getName() == 'anonymous function') {
- $this->signature = 'anonymous function';
- $i = $this->id + 1;
- } else {
- $this->signature = '';
- $i = $this->id + 2;
- }
- $tokens = $this->tokenStream->tokens();
- while (isset($tokens[$i]) &&
- !$tokens[$i] instanceof PHP_Token_OPEN_CURLY &&
- !$tokens[$i] instanceof PHP_Token_SEMICOLON) {
- $this->signature .= $tokens[$i++];
- }
- $this->signature = trim($this->signature);
- return $this->signature;
- }
- }
- class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
- {
- /**
- * @var array
- */
- protected $interfaces;
- /**
- * @return string
- */
- public function getName()
- {
- return (string)$this->tokenStream[$this->id + 2];
- }
- /**
- * @return boolean
- */
- public function hasParent()
- {
- return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS;
- }
- /**
- * @return array
- */
- public function getPackage()
- {
- $className = $this->getName();
- $docComment = $this->getDocblock();
- $result = array(
- 'namespace' => '',
- 'fullPackage' => '',
- 'category' => '',
- 'package' => '',
- 'subpackage' => ''
- );
- for ($i = $this->id; $i; --$i) {
- if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
- $result['namespace'] = $this->tokenStream[$i]->getName();
- break;
- }
- }
- if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['category'] = $matches[1];
- }
- if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['package'] = $matches[1];
- $result['fullPackage'] = $matches[1];
- }
- if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['subpackage'] = $matches[1];
- $result['fullPackage'] .= '.' . $matches[1];
- }
- if (empty($result['fullPackage'])) {
- $result['fullPackage'] = $this->arrayToName(
- explode('_', str_replace('\\', '_', $className)),
- '.'
- );
- }
- return $result;
- }
- /**
- * @param array $parts
- * @param string $join
- * @return string
- */
- protected function arrayToName(array $parts, $join = '\\')
- {
- $result = '';
- if (count($parts) > 1) {
- array_pop($parts);
- $result = join($join, $parts);
- }
- return $result;
- }
- /**
- * @return boolean|string
- */
- public function getParent()
- {
- if (!$this->hasParent()) {
- return false;
- }
- $i = $this->id + 6;
- $tokens = $this->tokenStream->tokens();
- $className = (string)$tokens[$i];
- while (isset($tokens[$i+1]) &&
- !$tokens[$i+1] instanceof PHP_Token_WHITESPACE) {
- $className .= (string)$tokens[++$i];
- }
- return $className;
- }
- /**
- * @return boolean
- */
- public function hasInterfaces()
- {
- return (isset($this->tokenStream[$this->id + 4]) &&
- $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) ||
- (isset($this->tokenStream[$this->id + 8]) &&
- $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS);
- }
- /**
- * @return array|boolean
- */
- public function getInterfaces()
- {
- if ($this->interfaces !== null) {
- return $this->interfaces;
- }
- if (!$this->hasInterfaces()) {
- return ($this->interfaces = false);
- }
- if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) {
- $i = $this->id + 3;
- } else {
- $i = $this->id + 7;
- }
- $tokens = $this->tokenStream->tokens();
- while (!$tokens[$i+1] instanceof PHP_Token_OPEN_CURLY) {
- $i++;
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $this->interfaces[] = (string)$tokens[$i];
- }
- }
- return $this->interfaces;
- }
- }
- class PHP_Token_ABSTRACT extends PHP_Token {}
- class PHP_Token_AMPERSAND extends PHP_Token {}
- class PHP_Token_AND_EQUAL extends PHP_Token {}
- class PHP_Token_ARRAY extends PHP_Token {}
- class PHP_Token_ARRAY_CAST extends PHP_Token {}
- class PHP_Token_AS extends PHP_Token {}
- class PHP_Token_AT extends PHP_Token {}
- class PHP_Token_BACKTICK extends PHP_Token {}
- class PHP_Token_BAD_CHARACTER extends PHP_Token {}
- class PHP_Token_BOOLEAN_AND extends PHP_Token {}
- class PHP_Token_BOOLEAN_OR extends PHP_Token {}
- class PHP_Token_BOOL_CAST extends PHP_Token {}
- class PHP_Token_BREAK extends PHP_Token {}
- class PHP_Token_CARET extends PHP_Token {}
- class PHP_Token_CASE extends PHP_Token {}
- class PHP_Token_CATCH extends PHP_Token {}
- class PHP_Token_CHARACTER extends PHP_Token {}
- class PHP_Token_CLASS extends PHP_Token_INTERFACE {}
- class PHP_Token_CLASS_C extends PHP_Token {}
- class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token {}
- class PHP_Token_CLONE extends PHP_Token {}
- class PHP_Token_CLOSE_BRACKET extends PHP_Token {}
- class PHP_Token_CLOSE_CURLY extends PHP_Token {}
- class PHP_Token_CLOSE_SQUARE extends PHP_Token {}
- class PHP_Token_CLOSE_TAG extends PHP_Token {}
- class PHP_Token_COLON extends PHP_Token {}
- class PHP_Token_COMMA extends PHP_Token {}
- class PHP_Token_COMMENT extends PHP_Token {}
- class PHP_Token_CONCAT_EQUAL extends PHP_Token {}
- class PHP_Token_CONST extends PHP_Token {}
- class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token {}
- class PHP_Token_CONTINUE extends PHP_Token {}
- class PHP_Token_CURLY_OPEN extends PHP_Token {}
- class PHP_Token_DEC extends PHP_Token {}
- class PHP_Token_DECLARE extends PHP_Token {}
- class PHP_Token_DEFAULT extends PHP_Token {}
- class PHP_Token_DIV extends PHP_Token {}
- class PHP_Token_DIV_EQUAL extends PHP_Token {}
- class PHP_Token_DNUMBER extends PHP_Token {}
- class PHP_Token_DO extends PHP_Token {}
- class PHP_Token_DOC_COMMENT extends PHP_Token {}
- class PHP_Token_DOLLAR extends PHP_Token {}
- class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token {}
- class PHP_Token_DOT extends PHP_Token {}
- class PHP_Token_DOUBLE_ARROW extends PHP_Token {}
- class PHP_Token_DOUBLE_CAST extends PHP_Token {}
- class PHP_Token_DOUBLE_COLON extends PHP_Token {}
- class PHP_Token_DOUBLE_QUOTES extends PHP_Token {}
- class PHP_Token_ECHO extends PHP_Token {}
- class PHP_Token_ELSE extends PHP_Token {}
- class PHP_Token_ELSEIF extends PHP_Token {}
- class PHP_Token_EMPTY extends PHP_Token {}
- class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token {}
- class PHP_Token_ENDDECLARE extends PHP_Token {}
- class PHP_Token_ENDFOR extends PHP_Token {}
- class PHP_Token_ENDFOREACH extends PHP_Token {}
- class PHP_Token_ENDIF extends PHP_Token {}
- class PHP_Token_ENDSWITCH extends PHP_Token {}
- class PHP_Token_ENDWHILE extends PHP_Token {}
- class PHP_Token_END_HEREDOC extends PHP_Token {}
- class PHP_Token_EQUAL extends PHP_Token {}
- class PHP_Token_EVAL extends PHP_Token {}
- class PHP_Token_EXCLAMATION_MARK extends PHP_Token {}
- class PHP_Token_EXIT extends PHP_Token {}
- class PHP_Token_EXTENDS extends PHP_Token {}
- class PHP_Token_FILE extends PHP_Token {}
- class PHP_Token_FINAL extends PHP_Token {}
- class PHP_Token_FOR extends PHP_Token {}
- class PHP_Token_FOREACH extends PHP_Token {}
- class PHP_Token_FUNC_C extends PHP_Token {}
- class PHP_Token_GLOBAL extends PHP_Token {}
- class PHP_Token_GT extends PHP_Token {}
- class PHP_Token_IF extends PHP_Token {}
- class PHP_Token_IMPLEMENTS extends PHP_Token {}
- class PHP_Token_INC extends PHP_Token {}
- class PHP_Token_INCLUDE extends PHP_Token_Includes {}
- class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes {}
- class PHP_Token_INLINE_HTML extends PHP_Token {}
- class PHP_Token_INSTANCEOF extends PHP_Token {}
- class PHP_Token_INT_CAST extends PHP_Token {}
- class PHP_Token_ISSET extends PHP_Token {}
- class PHP_Token_IS_EQUAL extends PHP_Token {}
- class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token {}
- class PHP_Token_IS_IDENTICAL extends PHP_Token {}
- class PHP_Token_IS_NOT_EQUAL extends PHP_Token {}
- class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token {}
- class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token {}
- class PHP_Token_LINE extends PHP_Token {}
- class PHP_Token_LIST extends PHP_Token {}
- class PHP_Token_LNUMBER extends PHP_Token {}
- class PHP_Token_LOGICAL_AND extends PHP_Token {}
- class PHP_Token_LOGICAL_OR extends PHP_Token {}
- class PHP_Token_LOGICAL_XOR extends PHP_Token {}
- class PHP_Token_LT extends PHP_Token {}
- class PHP_Token_METHOD_C extends PHP_Token {}
- class PHP_Token_MINUS extends PHP_Token {}
- class PHP_Token_MINUS_EQUAL extends PHP_Token {}
- class PHP_Token_MOD_EQUAL extends PHP_Token {}
- class PHP_Token_MULT extends PHP_Token {}
- class PHP_Token_MUL_EQUAL extends PHP_Token {}
- class PHP_Token_NEW extends PHP_Token {}
- class PHP_Token_NUM_STRING extends PHP_Token {}
- class PHP_Token_OBJECT_CAST extends PHP_Token {}
- class PHP_Token_OBJECT_OPERATOR extends PHP_Token {}
- class PHP_Token_OPEN_BRACKET extends PHP_Token {}
- class PHP_Token_OPEN_CURLY extends PHP_Token {}
- class PHP_Token_OPEN_SQUARE extends PHP_Token {}
- class PHP_Token_OPEN_TAG extends PHP_Token {}
- class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token {}
- class PHP_Token_OR_EQUAL extends PHP_Token {}
- class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token {}
- class PHP_Token_PERCENT extends PHP_Token {}
- class PHP_Token_PIPE extends PHP_Token {}
- class PHP_Token_PLUS extends PHP_Token {}
- class PHP_Token_PLUS_EQUAL extends PHP_Token {}
- class PHP_Token_PRINT extends PHP_Token {}
- class PHP_Token_PRIVATE extends PHP_Token {}
- class PHP_Token_PROTECTED extends PHP_Token {}
- class PHP_Token_PUBLIC extends PHP_Token {}
- class PHP_Token_QUESTION_MARK extends PHP_Token {}
- class PHP_Token_REQUIRE extends PHP_Token_Includes {}
- class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes {}
- class PHP_Token_RETURN extends PHP_Token {}
- class PHP_Token_SEMICOLON extends PHP_Token {}
- class PHP_Token_SL extends PHP_Token {}
- class PHP_Token_SL_EQUAL extends PHP_Token {}
- class PHP_Token_SR extends PHP_Token {}
- class PHP_Token_SR_EQUAL extends PHP_Token {}
- class PHP_Token_START_HEREDOC extends PHP_Token {}
- class PHP_Token_STATIC extends PHP_Token {}
- class PHP_Token_STRING extends PHP_Token {}
- class PHP_Token_STRING_CAST extends PHP_Token {}
- class PHP_Token_STRING_VARNAME extends PHP_Token {}
- class PHP_Token_SWITCH extends PHP_Token {}
- class PHP_Token_THROW extends PHP_Token {}
- class PHP_Token_TILDE extends PHP_Token {}
- class PHP_Token_TRY extends PHP_Token {}
- class PHP_Token_UNSET extends PHP_Token {}
- class PHP_Token_UNSET_CAST extends PHP_Token {}
- class PHP_Token_USE extends PHP_Token {}
- class PHP_Token_VAR extends PHP_Token {}
- class PHP_Token_VARIABLE extends PHP_Token {}
- class PHP_Token_WHILE extends PHP_Token {}
- class PHP_Token_WHITESPACE extends PHP_Token {}
- class PHP_Token_XOR_EQUAL extends PHP_Token {}
- // Tokens introduced in PHP 5.1
- class PHP_Token_HALT_COMPILER extends PHP_Token {}
- // Tokens introduced in PHP 5.3
- class PHP_Token_DIR extends PHP_Token {}
- class PHP_Token_GOTO extends PHP_Token {}
- class PHP_Token_NAMESPACE extends PHP_TokenWithScope
- {
- /**
- * @return string
- */
- public function getName()
- {
- $tokens = $this->tokenStream->tokens();
- $namespace = (string)$tokens[$this->id+2];
- for ($i = $this->id + 3;; $i += 2) {
- if (isset($tokens[$i]) &&
- $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
- $namespace .= '\\' . $tokens[$i+1];
- } else {
- break;
- }
- }
- return $namespace;
- }
- }
- class PHP_Token_NS_C extends PHP_Token {}
- class PHP_Token_NS_SEPARATOR extends PHP_Token {}
- // Tokens introduced in PHP 5.4
- class PHP_Token_CALLABLE extends PHP_Token {}
- class PHP_Token_INSTEADOF extends PHP_Token {}
- class PHP_Token_TRAIT extends PHP_Token_INTERFACE {}
- class PHP_Token_TRAIT_C extends PHP_Token {}
- // Tokens introduced in PHP 5.5
- class PHP_Token_FINALLY extends PHP_Token {}
- class PHP_Token_YIELD extends PHP_Token {}
- // Tokens introduced in PHP 5.6
- class PHP_Token_ELLIPSIS extends PHP_Token {}
- class PHP_Token_POW extends PHP_Token {}
- class PHP_Token_POW_EQUAL extends PHP_Token {}
- // Tokens introduced in PHP 7.0
- class PHP_Token_COALESCE extends PHP_Token {}
- class PHP_Token_SPACESHIP extends PHP_Token {}
- class PHP_Token_YIELD_FROM extends PHP_Token {}
- // Tokens introduced in HackLang / HHVM
- class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token {}
- class PHP_Token_ENUM extends PHP_Token {}
- class PHP_Token_IN extends PHP_Token {}
- class PHP_Token_JOIN extends PHP_Token {}
- class PHP_Token_LAMBDA_ARROW extends PHP_Token {}
- class PHP_Token_LAMBDA_CP extends PHP_Token {}
- class PHP_Token_LAMBDA_OP extends PHP_Token {}
- class PHP_Token_ONUMBER extends PHP_Token {}
- class PHP_Token_SHAPE extends PHP_Token {}
- class PHP_Token_TYPE extends PHP_Token {}
- class PHP_Token_TYPELIST_GT extends PHP_Token {}
- class PHP_Token_TYPELIST_LT extends PHP_Token {}
- class PHP_Token_XHP_ATTRIBUTE extends PHP_Token {}
- class PHP_Token_XHP_CATEGORY extends PHP_Token {}
- class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token {}
- class PHP_Token_XHP_CHILDREN extends PHP_Token {}
- class PHP_Token_XHP_LABEL extends PHP_Token {}
- class PHP_Token_XHP_REQUIRED extends PHP_Token {}
- class PHP_Token_XHP_TAG_GT extends PHP_Token {}
- class PHP_Token_XHP_TAG_LT extends PHP_Token {}
- class PHP_Token_XHP_TEXT extends PHP_Token {}
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown for exceptions encountered with database operations. Provides
- * information regarding which operations failed and the query (if any) it
- * failed on.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Exception extends Exception
- {
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new medium printers.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMediumPrinter
- {
- /**
- * Prints standard output messages.
- *
- * @param string $message
- */
- public function output($message);
- /**
- * Prints standard error messages.
- *
- * @param string $message
- */
- public function error($message);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Delegates database extension commands to the appropriate mode classes.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Command
- {
- /**
- * @var PHPUnit_Extensions_Database_UI_IModeFactory
- */
- protected $modeFactory;
- /**
- * @param PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory
- */
- public function __construct(PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory)
- {
- $this->modeFactory = $modeFactory;
- }
- /**
- * Executes the database extension ui.
- *
- * @param PHPUnit_Extensions_Database_UI_IMedium $medium
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function main(PHPUnit_Extensions_Database_UI_IMedium $medium, PHPUnit_Extensions_Database_UI_Context $context)
- {
- try {
- $medium->buildContext($context);
- $mode = $this->modeFactory->getMode($context->getMode());
- $mode->execute($context->getModeArguments(), $medium);
- } catch (Exception $e) {
- $medium->handleException($e);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A text medium for the database extension tool.
- *
- * This class builds the call context based on command line parameters and
- * prints output to stdout and stderr as appropriate.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Mediums_Text implements PHPUnit_Extensions_Database_UI_IMedium
- {
- /**
- * @var array
- */
- protected $arguments;
- /**
- * @var string
- */
- protected $command;
- /**
- * @param array $arguments
- */
- public function __construct(Array $arguments)
- {
- $this->arguments = $arguments;
- }
- /**
- * Builds the context for the application.
- *
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function buildContext(PHPUnit_Extensions_Database_UI_Context $context)
- {
- $arguments = $this->arguments;
- $this->command = array_shift($arguments);
- $context->setMode(array_shift($arguments));
- $context->setModeArguments($arguments);
- }
- /**
- * Handles the displaying of exceptions received from the application.
- *
- * @param Exception $e
- */
- public function handleException(Exception $e)
- {
- try {
- throw $e;
- } catch (PHPUnit_Extensions_Database_UI_InvalidModeException $invalidMode) {
- if ($invalidMode->getMode() == '') {
- $this->error('Please Specify a Command!' . PHP_EOL);
- } else {
- $this->error('Command Does Not Exist: ' . $invalidMode->getMode() . PHP_EOL);
- }
- $this->error('Valid Commands:' . PHP_EOL);
- foreach ($invalidMode->getValidModes() as $mode) {
- $this->error(' ' . $mode . PHP_EOL);
- }
- } catch (Exception $e) {
- $this->error('Unknown Error: ' . $e->getMessage() . PHP_EOL);
- }
- }
- /**
- * Prints the message to stdout.
- *
- * @param string $message
- */
- public function output($message)
- {
- echo $message;
- }
- /**
- * Prints the message to stderr
- *
- * @param string $message
- */
- public function error($message)
- {
- fputs(STDERR, $message);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An exception thrown when an invalid mode is requested from a mode factory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_InvalidModeException extends LogicException
- {
- /**
- * @var string
- */
- protected $mode;
- /**
- * @var PHPUnit_Extensions_Database_UI_IModeFactory
- */
- protected $modeFactory;
- /**
- * @param string $mode
- * @param string $msg
- * @param PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory
- */
- public function __construct($mode, $msg, PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory)
- {
- $this->mode = $mode;
- $this->modeFactory = $modeFactory;
- parent::__construct($msg);
- }
- /**
- * @return string
- */
- public function getMode()
- {
- return $this->mode;
- }
- /**
- * @return array
- */
- public function getValidModes()
- {
- return $this->modeFactory->getModeList();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new modes
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMode
- {
- /**
- * Executes the mode using the given arguments and medium.
- *
- * @param array $modeArguments
- * @param PHPUnit_Extensions_Database_UI_IMediumPrinter $medium
- */
- public function execute(array $modeArguments, PHPUnit_Extensions_Database_UI_IMediumPrinter $medium);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Holds the context of a particular database extension ui call.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Context
- {
- /**
- * @var string
- */
- protected $mode;
- /**
- * @var array
- */
- protected $modeArguments;
- /**
- * @param string $mode
- */
- public function setMode($mode)
- {
- $this->mode = $mode;
- }
- /**
- * @return string
- */
- public function getMode()
- {
- return $this->mode;
- }
- /**
- * @param array $arguments
- */
- public function setModeArguments(array $arguments)
- {
- $this->mode_arguments = $arguments;
- }
- /**
- * @return array
- */
- public function getModeArguments()
- {
- return $this->mode_arguments;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents arguments received from a medium.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Modes_ExportDataSet_Arguments
- {
- /**
- * @var array
- */
- protected $arguments = array();
- /**
- * @param array $arguments
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- list($argName, $argValue) = explode('=', $argument, 2);
- $argName = trim($argName, '-');
- if (!isset($this->arguments[$argName])) {
- $this->arguments[$argName] = array();
- }
- $this->arguments[$argName][] = $argValue;
- }
- }
- /**
- * Returns an array of arguments matching the given $argName
- *
- * @param string $argName
- * @return array
- */
- public function getArgumentArray($argName)
- {
- if ($this->argumentIsSet($argName)) {
- return $this->arguments[$argName];
- } else {
- return NULL;
- }
- }
- /**
- * Returns a single argument value.
- *
- * If $argName points to an array the first argument will be returned.
- *
- * @param string $argName
- * @return mixed
- */
- public function getSingleArgument($argName)
- {
- if ($this->argumentIsSet($argName)) {
- return reset($this->arguments[$argName]);
- } else {
- return NULL;
- }
- }
- /**
- * Returns whether an argument is set.
- *
- * @param string $argName
- * @return bool
- */
- public function argumentIsSet($argName)
- {
- return array_key_exists($argName, $this->arguments);
- }
- /**
- * Returns an array containing the names of all arguments provided.
- *
- * @return array
- */
- public function getArgumentNames()
- {
- return array_keys($this->arguments);
- }
- /**
- * Returns an array of database arguments keyed by name.
- *
- * @todo this should be moved.
- * @return array
- */
- public function getDatabases()
- {
- $databases = $this->getArgumentArray('database');
- $retDb = array();
- foreach ($databases as $db) {
- list($name, $arg) = explode(':', $db, 2);
- $retDb[$name] = $arg;
- }
- return $retDb;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The class for the export-dataset command.
- *
- * This command is used to convert existing data sets or data in the database
- * into a valid data set format.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Modes_ExportDataSet implements PHPUnit_Extensions_Database_UI_IMode
- {
- /**
- * Executes the export dataset command.
- *
- * @param array $modeArguments
- * @param PHPUnit_Extensions_Database_UI_IMediumPrinter $medium
- */
- public function execute(array $modeArguments, PHPUnit_Extensions_Database_UI_IMediumPrinter $medium)
- {
- $arguments = new PHPUnit_Extensions_Database_UI_Modes_ExportDataSet_Arguments($modeArguments);
- if (FALSE && !$arguments->areValid()) {
- throw new InvalidArgumentException("The arguments for this command are incorrect.");
- }
- $datasets = array();
- foreach ($arguments->getArgumentArray('dataset') as $argString) {
- $datasets[] = $this->getDataSetFromArgument($argString, $arguments->getDatabases());
- }
- $finalDataset = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet($datasets);
- $outputDataset = $this->getPersistorFromArgument($arguments->getSingleArgument('output'));
- $outputDataset->write($finalDataset);
- }
- /**
- * Returns the correct dataset given an argument containing a dataset spec.
- *
- * @param string $argString
- * @param array $databaseList
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected function getDataSetFromArgument($argString, $databaseList)
- {
- $dataSetSpecFactory = new PHPUnit_Extensions_Database_DataSet_Specs_Factory();
- list($type, $dataSetSpecStr) = explode(':', $argString, 2);
- $dataSetSpec = $dataSetSpecFactory->getDataSetSpecByType($type);
- if ($dataSetSpec instanceof PHPUnit_Extensions_Database_IDatabaseListConsumer) {
- $dataSetSpec->setDatabases($databaseList);
- }
- return $dataSetSpec->getDataSet($dataSetSpecStr);
- }
- /**
- * Returns the correct persistor given an argument containing a persistor spec.
- *
- * @param string $argString
- * @return PHPUnit_Extensions_Database_DataSet_IPersistable
- */
- protected function getPersistorFromArgument($argString)
- {
- $persistorFactory = new PHPUnit_Extensions_Database_DataSet_Persistors_Factory();
- list($type, $spec) = explode(':', $argString, 2);
- return $persistorFactory->getPersistorBySpec($type, $spec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new mediums.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMedium extends PHPUnit_Extensions_Database_UI_IMediumPrinter
- {
- /**
- * Builds the context for the application.
- *
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function buildContext(PHPUnit_Extensions_Database_UI_Context $context);
- /**
- * Handles the displaying of exceptions received from the application.
- *
- * @param Exception $e
- */
- public function handleException(Exception $e);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default factory for db extension modes.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_ModeFactory implements PHPUnit_Extensions_Database_UI_IModeFactory
- {
- /**
- * Generates a new mode based on a given name.
- *
- * @param string $mode
- * @return PHPUnit_Extensions_Database_UI_IMode
- */
- public function getMode($mode)
- {
- if ($mode == '') {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'A mode was not provided.', $this);
- }
- $modeMap = $this->getModeMap();
- if (isset($modeMap[$mode])) {
- $modeClass = $this->getModeClass($mode, $modeMap[$mode]);
- return new $modeClass();
- } else {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode does not exist. Attempting to load mode ' . $mode, $this);
- }
- }
- /**
- * Returns the names of valid modes this factory can create.
- *
- * @return array
- */
- public function getModeList()
- {
- return array_keys($this->getModeMap());
- }
- /**
- * Returns a map of modes to class name parts
- *
- * @return array
- */
- protected function getModeMap()
- {
- return array('export-dataset' => 'ExportDataSet');
- }
- /**
- * Given a $mode label and a $mode_name class part attempts to return the
- * class name necessary to instantiate the mode.
- *
- * @param string $mode
- * @param string $mode_name
- * @return string
- */
- protected function getModeClass($mode, $mode_name)
- {
- $modeClass = 'PHPUnit_Extensions_Database_UI_Modes_' . $mode_name;
- $modeFile = dirname(__FILE__) . '/Modes/' . $mode_name . '.php';
- if (class_exists($modeClass)) {
- return $modeClass;
- }
- if (!is_readable($modeFile)) {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode\'s file could not be loaded. Trying file ' . $modeFile, $this);
- }
- require_once ($modeFile);
- if (!class_exists($modeClass)) {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode class was not found in the file. Expecting class name ' . $modeClass, $this);
- }
- return $modeClass;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new mode factories
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IModeFactory
- {
- /**
- * Generates a new mode based on a given name.
- *
- * @param string $mode
- * @return PHPUnit_Extensions_Database_UI_IMode
- */
- public function getMode($mode);
- /**
- * Returns the names of valid modes this factory can create.
- *
- * @return array
- */
- public function getModeList();
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for classes that require a list of databases to operate.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown for exceptions encountered with database operations. Provides
- * information regarding which operations failed and the query (if any) it
- * failed on.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Exception extends RuntimeException
- {
- /**
- * @var string
- */
- protected $operation;
- /**
- * @var string
- */
- protected $preparedQuery;
- /**
- * @var array
- */
- protected $preparedArgs;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $table;
- /**
- * @var string
- */
- protected $error;
- /**
- * Creates a new dbunit operation exception
- *
- * @param string $operation
- * @param string $current_query
- * @param PHPUnit_Extensions_Database_DataSet_ITable $current_table
- * @param string $error
- */
- public function __construct($operation, $current_query, $current_args, $current_table, $error)
- {
- parent::__construct("{$operation} operation failed on query: {$current_query} using args: " . print_r($current_args, TRUE) . " [{$error}]");
- $this->operation = $operation;
- $this->preparedQuery = $current_query;
- $this->preparedArgs = $current_args;
- $this->table = $current_table;
- $this->error = $error;
- }
- public function getOperation()
- {
- return $this->operation;
- }
- public function getQuery()
- {
- return $this->preparedQuery;
- }
- public function getTable()
- {
- return $this->table;
- }
- public function getArgs()
- {
- return $this->preparedArgs;
- }
- public function getError()
- {
- return $this->error;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Updates the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Replace extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'REPLACE';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $query = "
- SELECT COUNT(*)
- FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- /**
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $insertOperation = new PHPUnit_Extensions_Database_Operation_Insert;
- $updateOperation = new PHPUnit_Extensions_Database_Operation_Update;
- $databaseDataSet = $connection->createDataSet();
- foreach ($dataSet as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $databaseTableMetaData = $databaseDataSet->getTableMetaData($table->getTableMetaData()->getTableName());
- $insertQuery = $insertOperation->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $updateQuery = $updateOperation->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $selectQuery = $this->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $insertStatement = $connection->getConnection()->prepare($insertQuery);
- $updateStatement = $connection->getConnection()->prepare($updateQuery);
- $selectStatement = $connection->getConnection()->prepare($selectQuery);
- $rowCount = $table->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $selectArgs = $this->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $selectQuery;
- $args = $selectArgs;
- try {
- $selectStatement->execute($selectArgs);
- if ($selectStatement->fetchColumn(0) > 0) {
- $updateArgs = $updateOperation->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $updateQuery;
- $args = $updateArgs;
- $updateStatement->execute($updateArgs);
- } else {
- $insertArgs = $insertOperation->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $insertQuery;
- $args = $insertArgs;
- $insertStatement->execute($insertArgs);
- }
- }
- catch (Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception(
- $this->operationName, $query, $args, $table, $e->getMessage()
- );
- }
- }
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class provides functionality for inserting rows from a dataset into a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Insert extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'INSERT';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $columnCount = count($table->getTableMetaData()->getColumns());
- if ($columnCount > 0) {
- $placeHolders = implode(', ', array_fill(0, $columnCount, '?'));
- $columns = '';
- foreach ($table->getTableMetaData()->getColumns() as $column) {
- $columns .= $connection->quoteSchemaObject($column).', ';
- }
- $columns = substr($columns, 0, -2);
- $query = "
- INSERT INTO {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ({$columns})
- VALUES
- ({$placeHolders})
- ";
- return $query;
- } else {
- return FALSE;
- }
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if (count($databaseTableMetaData->getPrimaryKeys())) {
- return TRUE;
- }
- return FALSE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Deletes the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Delete extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'DELETE';
- protected $iteratorDirection = self::ITERATOR_TYPE_REVERSE;
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $query = "
- DELETE FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface and functionality for executing database
- * operations against a connection using a specific dataSet.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- /**
- * Executes the database operation against the given $connection for the
- * given $dataSet.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- * @throws PHPUnit_Extensions_Database_Operation_Exception
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class represents a null database operation.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Null implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- /* do nothing */
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Deletes all rows from all tables in a dataset.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_DeleteAll implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getReverseIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $query = "
- DELETE FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ";
- try {
- $connection->getConnection()->query($query);
- } catch (PDOException $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception('DELETE_ALL', $query, array(), $table, $e->getMessage());
- }
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Updates the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Update extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'UPDATE';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $columns = $table->getTableMetaData()->getColumns();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $setStatement = 'SET ' . implode(', ', $this->buildPreparedColumnArray($columns, $connection));
- $query = "
- UPDATE {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$setStatement}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if (count($databaseTableMetaData->getPrimaryKeys())) {
- return TRUE;
- }
- return FALSE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides basic functionality for row based operations.
- *
- * To create a row based operation you must create two functions. The first
- * one, buildOperationQuery(), must return a query that will be used to create
- * a prepared statement. The second one, buildOperationArguments(), should
- * return an array containing arguments for each row.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_Operation_RowBased implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- const ITERATOR_TYPE_FORWARD = 0;
- const ITERATOR_TYPE_REVERSE = 1;
- protected $operationName;
- protected $iteratorDirection = self::ITERATOR_TYPE_FORWARD;
- /**
- * @return string|boolean String containing the query or FALSE if a valid query cannot be constructed
- */
- protected abstract function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection);
- protected abstract function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row);
- /**
- * Allows an operation to disable primary keys if necessary.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- return FALSE;
- }
- /**
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $databaseDataSet = $connection->createDataSet();
- $dsIterator = $this->iteratorDirection == self::ITERATOR_TYPE_REVERSE ? $dataSet->getReverseIterator() : $dataSet->getIterator();
- foreach ($dsIterator as $table) {
- $rowCount = $table->getRowCount();
- if($rowCount == 0) continue;
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $databaseTableMetaData = $databaseDataSet->getTableMetaData($table->getTableMetaData()->getTableName());
- $query = $this->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $disablePrimaryKeys = $this->disablePrimaryKeys($databaseTableMetaData, $table, $connection);
- if ($query === FALSE) {
- if ($table->getRowCount() > 0) {
- throw new PHPUnit_Extensions_Database_Operation_Exception($this->operationName, '', array(), $table, "Rows requested for insert, but no columns provided!");
- }
- continue;
- }
- if ($disablePrimaryKeys) {
- $connection->disablePrimaryKeys($databaseTableMetaData->getTableName());
- }
- $statement = $connection->getConnection()->prepare($query);
- for ($i = 0; $i < $rowCount; $i++) {
- $args = $this->buildOperationArguments($databaseTableMetaData, $table, $i);
- try {
- $statement->execute($args);
- }
- catch (Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception(
- $this->operationName, $query, $args, $table, $e->getMessage()
- );
- }
- }
- if ($disablePrimaryKeys) {
- $connection->enablePrimaryKeys($databaseTableMetaData->getTableName());
- }
- }
- }
- protected function buildPreparedColumnArray($columns, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $columnArray = array();
- foreach ($columns as $columnName) {
- $columnArray[] = "{$connection->quoteSchemaObject($columnName)} = ?";
- }
- return $columnArray;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A class factory to easily return database operations.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Factory
- {
- /**
- * Returns a null database operation
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function NONE()
- {
- return new PHPUnit_Extensions_Database_Operation_Null();
- }
- /**
- * Returns a clean insert database operation. It will remove all contents
- * from the table prior to re-inserting rows.
- *
- * @param bool $cascadeTruncates Set to true to force truncates to cascade on databases that support this.
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function CLEAN_INSERT($cascadeTruncates = FALSE)
- {
- return new PHPUnit_Extensions_Database_Operation_Composite(array(
- self::TRUNCATE($cascadeTruncates),
- self::INSERT()
- ));
- }
- /**
- * Returns an insert database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function INSERT()
- {
- return new PHPUnit_Extensions_Database_Operation_Insert();
- }
- /**
- * Returns a truncate database operation.
- *
- * @param bool $cascadeTruncates Set to true to force truncates to cascade on databases that support this.
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function TRUNCATE($cascadeTruncates = FALSE)
- {
- $truncate = new PHPUnit_Extensions_Database_Operation_Truncate();
- $truncate->setCascade($cascadeTruncates);
- return $truncate;
- }
- /**
- * Returns a delete database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function DELETE()
- {
- return new PHPUnit_Extensions_Database_Operation_Delete();
- }
- /**
- * Returns a delete_all database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function DELETE_ALL()
- {
- return new PHPUnit_Extensions_Database_Operation_DeleteAll();
- }
- /**
- * Returns an update database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function UPDATE()
- {
- return new PHPUnit_Extensions_Database_Operation_Update();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class facilitates combining database operations. To create a composite
- * operation pass an array of classes that implement
- * PHPUnit_Extensions_Database_Operation_IDatabaseOperation and they will be
- * executed in that order against all data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Composite implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- /**
- * @var array
- */
- protected $operations = array();
- /**
- * Creates a composite operation.
- *
- * @param array $operations
- */
- public function __construct(Array $operations)
- {
- foreach ($operations as $operation) {
- if ($operation instanceof PHPUnit_Extensions_Database_Operation_IDatabaseOperation) {
- $this->operations[] = $operation;
- } else {
- throw new InvalidArgumentException("Only database operation instances can be passed to a composite database operation.");
- }
- }
- }
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- try {
- foreach ($this->operations as $operation) {
- /* @var $operation PHPUnit_Extensions_Database_Operation_IDatabaseOperation */
- $operation->execute($connection, $dataSet);
- }
- } catch (PHPUnit_Extensions_Database_Operation_Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception("COMPOSITE[{$e->getOperation()}]", $e->getQuery(), $e->getArgs(), $e->getTable(), $e->getError());
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Executes a truncate against all tables in a dataset.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Truncate implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- protected $useCascade = FALSE;
- public function setCascade($cascade = TRUE)
- {
- $this->useCascade = $cascade;
- }
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getReverseIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $query = "
- {$connection->getTruncateCommand()} {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ";
- if ($this->useCascade && $connection->allowsCascading()) {
- $query .= " CASCADE";
- }
- try {
- $this->disableForeignKeyChecksForMysql($connection);
- $connection->getConnection()->query($query);
- $this->enableForeignKeyChecksForMysql($connection);
- } catch (\Exception $e) {
- $this->enableForeignKeyChecksForMysql($connection);
- if ($e instanceof PDOException) {
- throw new PHPUnit_Extensions_Database_Operation_Exception('TRUNCATE', $query, array(), $table, $e->getMessage());
- }
- throw $e;
- }
- }
- }
- private function disableForeignKeyChecksForMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if ($this->isMysql($connection)) {
- $connection->getConnection()->query('SET FOREIGN_KEY_CHECKS = 0');
- }
- }
- private function enableForeignKeyChecksForMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if ($this->isMysql($connection)) {
- $connection->getConnection()->query('SET FOREIGN_KEY_CHECKS = 1');
- }
- }
- private function isMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- return $connection->getConnection()->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql';
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestCase extension that provides functionality for testing and asserting
- * against a real database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_TestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var PHPUnit_Extensions_Database_ITester
- */
- protected $databaseTester;
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- protected function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $this->getDatabaseTester()->closeConnection($connection);
- }
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected abstract function getConnection();
- /**
- * Gets the IDatabaseTester for this testCase. If the IDatabaseTester is
- * not set yet, this method calls newDatabaseTester() to obtain a new
- * instance.
- *
- * @return PHPUnit_Extensions_Database_ITester
- */
- protected function getDatabaseTester()
- {
- if (empty($this->databaseTester)) {
- $this->databaseTester = $this->newDatabaseTester();
- }
- return $this->databaseTester;
- }
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected abstract function getDataSet();
- /**
- * Returns the database operation executed in test setup.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getSetUpOperation()
- {
- return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
- }
- /**
- * Returns the database operation executed in test cleanup.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getTearDownOperation()
- {
- return PHPUnit_Extensions_Database_Operation_Factory::NONE();
- }
- /**
- * Creates a IDatabaseTester for this testCase.
- *
- * @return PHPUnit_Extensions_Database_ITester
- */
- protected function newDatabaseTester()
- {
- return new PHPUnit_Extensions_Database_DefaultTester($this->getConnection());
- }
- /**
- * Creates a new DefaultDatabaseConnection using the given PDO connection
- * and database schema name.
- *
- * @param PDO $connection
- * @param string $schema
- * @return PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection
- */
- protected function createDefaultDBConnection(PDO $connection, $schema = '')
- {
- return new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($connection, $schema);
- }
- /**
- * Creates a new ArrayDataSet with the given array.
- * The array parameter is an associative array of tables where the key is
- * the table name and the value an array of rows. Each row is an associative
- * array by itself with keys representing the field names and the values the
- * actual data.
- * For example:
- * array(
- * "addressbook" => array(
- * array("id" => 1, "name" => "...", "address" => "..."),
- * array("id" => 2, "name" => "...", "address" => "...")
- * )
- * )
- *
- * @param array $data
- * @return PHPUnit_Extensions_Database_DataSet_ArrayDataSet
- */
- protected function createArrayDataSet(array $data)
- {
- return new PHPUnit_Extensions_Database_DataSet_ArrayDataSet($data);
- }
- /**
- * Creates a new FlatXmlDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet
- */
- protected function createFlatXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet($xmlFile);
- }
- /**
- * Creates a new XMLDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_XmlDataSet
- */
- protected function createXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_XmlDataSet($xmlFile);
- }
- /**
- * Create a a new MysqlXmlDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet
- * @since Method available since Release 1.0.0
- */
- protected function createMySQLXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet($xmlFile);
- }
- /**
- * Returns an operation factory instance that can be used to instantiate
- * new operations.
- *
- * @return PHPUnit_Extensions_Database_Operation_Factory
- */
- protected function getOperations()
- {
- return new PHPUnit_Extensions_Database_Operation_Factory();
- }
- /**
- * Performs operation returned by getSetUpOperation().
- */
- protected function setUp()
- {
- parent::setUp();
- $this->databaseTester = NULL;
- $this->getDatabaseTester()->setSetUpOperation($this->getSetUpOperation());
- $this->getDatabaseTester()->setDataSet($this->getDataSet());
- $this->getDatabaseTester()->onSetUp();
- }
- /**
- * Performs operation returned by getTearDownOperation().
- */
- protected function tearDown()
- {
- $this->getDatabaseTester()->setTearDownOperation($this->getTearDownOperation());
- $this->getDatabaseTester()->setDataSet($this->getDataSet());
- $this->getDatabaseTester()->onTearDown();
- /**
- * Destroy the tester after the test is run to keep DB connections
- * from piling up.
- */
- $this->databaseTester = NULL;
- }
- /**
- * Asserts that two given tables are equal.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
- * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
- * @param string $message
- */
- public static function assertTablesEqual(PHPUnit_Extensions_Database_DataSet_ITable $expected, PHPUnit_Extensions_Database_DataSet_ITable $actual, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_TableIsEqual($expected);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that two given datasets are equal.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
- * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
- * @param string $message
- */
- public static function assertDataSetsEqual(PHPUnit_Extensions_Database_DataSet_IDataSet $expected, PHPUnit_Extensions_Database_DataSet_IDataSet $actual, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_DataSetIsEqual($expected);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Assert that a given table has a given amount of rows
- *
- * @param string $tableName Name of the table
- * @param int $expected Expected amount of rows in the table
- * @param string $message Optional message
- */
- public function assertTableRowCount($tableName, $expected, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_TableRowCount($tableName, $expected);
- $actual = $this->getConnection()->getRowCount($tableName);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a given table contains a given row
- *
- * @param array $expectedRow Row expected to find
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table Table to look into
- * @param string $message Optional message
- */
- public function assertTableContains(array $expectedRow, PHPUnit_Extensions_Database_DataSet_ITable $table, $message = '')
- {
- self::assertThat($table->assertContainsRow($expectedRow), self::isTrue(), $message);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Can be used as a foundation for new DatabaseTesters.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_AbstractTester implements PHPUnit_Extensions_Database_ITester
- {
- /**
- * @var PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- protected $setUpOperation;
- /**
- * @var PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- protected $tearDownOperation;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $dataSet;
- /**
- * @var string
- */
- protected $schema;
- /**
- * Creates a new database tester.
- */
- public function __construct()
- {
- $this->setUpOperation = PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
- $this->tearDownOperation = PHPUnit_Extensions_Database_Operation_Factory::NONE();
- }
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $connection->close();
- }
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet()
- {
- return $this->dataSet;
- }
- /**
- * TestCases must call this method inside setUp().
- */
- public function onSetUp()
- {
- $this->getSetUpOperation()->execute($this->getConnection(), $this->getDataSet());
- }
- /**
- * TestCases must call this method inside tearDown().
- */
- public function onTearDown()
- {
- $this->getTearDownOperation()->execute($this->getConnection(), $this->getDataSet());
- }
- /**
- * Sets the test dataset to use.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function setDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $this->dataSet = $dataSet;
- }
- /**
- * Sets the schema value.
- *
- * @param string $schema
- */
- public function setSchema($schema)
- {
- $this->schema = $schema;
- }
- /**
- * Sets the DatabaseOperation to call when starting the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $setUpOperation
- */
- public function setSetUpOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $setUpOperation)
- {
- $this->setUpOperation = $setUpOperation;
- }
- /**
- * Sets the DatabaseOperation to call when ending the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $tearDownOperation
- */
- public function setTearDownOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $tearDownOperation)
- {
- $this->tearDownOperation = $tearDownOperation;
- }
- /**
- * Returns the schema value
- *
- * @return string
- */
- protected function getSchema()
- {
- return $this->schema;
- }
- /**
- * Returns the database operation that will be called when starting the test.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getSetUpOperation()
- {
- return $this->setUpOperation;
- }
- /**
- * Returns the database operation that will be called when ending the test.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getTearDownOperation()
- {
- return $this->tearDownOperation;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from an Sqlite database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Sqlite extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $columns = array();
- protected $keys = array();
- protected $truncateCommand = 'DELETE FROM';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT name
- FROM sqlite_master
- WHERE
- type='table' AND
- name <> 'sqlite_sequence'
- ORDER BY name
- ";
- $result = $this->pdo->query($query);
- $tableNames = array();
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sqlite database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $query = "PRAGMA table_info('{$tableName}')";
- $statement = $this->pdo->query($query);
- /* @var $statement PDOStatement */
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- while ($columnData = $statement->fetch(PDO::FETCH_NUM)) {
- $this->columns[$tableName][] = $columnData[1];
- if ($columnData[5] == 1) {
- $this->keys[$tableName][] = $columnData[1];
- }
- }
- }
- }
- <?php
- /**
- * Provides functionality to retrieve meta data from an Dblib (SQL Server) database.
- *
- * @package DbUnit
- * @author Tom Ford <tom@switchsystems.co.uk>
- * @copyright Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @link http://www.phpunit.de/
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Dblib extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * @var array
- */
- protected $columns = array();
- /**
- * @var array
- */
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- $query = "SELECT name
- FROM sys.tables
- ORDER BY name";
- $result = $this->pdo->query($query);
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sql server database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $query = "SELECT name
- FROM sys.columns
- WHERE object_id = OBJECT_ID('".$tableName."')
- ORDER BY column_id";
- $result = $this->pdo->query($query);
- while ($columnName = $result->fetchColumn(0)) {
- $this->columns[$tableName][] = $columnName;
- }
- $keyQuery = "SELECT COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
- FROM sys.indexes AS i INNER JOIN
- sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID
- AND i.index_id = ic.index_id
- WHERE i.is_primary_key = 1 AND OBJECT_NAME(ic.OBJECT_ID) = '".$tableName."'";
- $result = $this->pdo->query($keyQuery);
- while ($columnName = $result->fetchColumn(0)) {
- $this->keys[$tableName][] = $columnName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a MySQL database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_MySQL extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $schemaObjectQuoteChar = '`';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = 'SHOW TABLES';
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $tableNames = array();
- while (($tableName = $statement->fetchColumn(0))) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- $query = 'SHOW COLUMNS FROM ' . $this->quoteSchemaObject($tableName);
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $columnNames = array();
- while (($columnName = $statement->fetchColumn(0))) {
- $columnNames[] = $columnName;
- }
- return $columnNames;
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- $query = 'SHOW INDEX FROM ' . $this->quoteSchemaObject($tableName);
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $statement->setFetchMode(PDO::FETCH_ASSOC);
- $columnNames = array();
- while (($column = $statement->fetch())) {
- if ($column['Key_name'] == 'PRIMARY') {
- $columnNames[] = $column['Column_name'];
- }
- }
- return $columnNames;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a database with information_schema support.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_InformationSchema extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $columns = array();
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sqlite database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME
- FROM
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC,
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- WHERE
- TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND
- TC.TABLE_NAME = KCU.TABLE_NAME AND
- TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA AND
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a Firebird database.
- *
- * @package DbUnit
- * @author Matheus Degiovani (matheus@gigatron.com.br)
- * @copyright 2002-2014 Matheus Degiovani (matheus@gigatron.com.br)
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @version Release: 1.1.2
- * @link http://www.phpunit.de/
- * @since
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Firebird extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'DELETE FROM';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $query = "
- select
- RDB$RELATION_NAME as TABLE_NAME
- from RDB$RELATIONS
- where
- ((RDB$RELATION_TYPE = 0) or
- (RDB$RELATION_TYPE is null)) and
- (RDB$SYSTEM_FLAG = 0)
- order by (RDB$RELATION_NAME)
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a database table.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME, ORDINAL_POSITION
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnQuery = "
- select
- rf.RDB\$FIELD_NAME as COLUMN_NAME,
- rf.RDB\$FIELD_POSITION as ORDINAL_POSITION
- from RDB\$RELATION_FIELDS as rf
- where
- upper(RDB\$RELATION_NAME) = upper(?)
- order by
- ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME,
- KCU.ORDINAL_POSITION
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC
- ON TC.TABLE_NAME = KCU.TABLE_NAME
- WHERE
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyQuery = "
- select
- idseg.rdb\$field_name as COLUMN_NAME,
- idseg.rdb\$field_position as ORDINAL_POSITION,
- rc.rdb\$relation_name as tablename,
- rc.rdb\$constraint_name as pk_name
- from
- RDB\$RELATION_CONSTRAINTS AS rc
- left join
- rdb\$index_segments as idseg on
- (rc.rdb\$index_name = idseg.rdb\$index_name)
- where
- rc.RDB\$CONSTRAINT_TYPE = 'PRIMARY KEY'
- and upper(rc.RDB\$RELATION_NAME) = upper(?)
- order by
- rc.rdb\$constraint_name, idseg.rdb\$field_position
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- if (empty($this->schema)) {
- return 'public';
- } else {
- return $this->schema;
- }
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return false;
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object) {
- return $object; //firebird does not allow object quoting
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from an Oracle database.
- *
- * @package DbUnit
- * @author Trond Hansen <trond@xait.no>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.2.3
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Oci extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * @var array
- */
- protected $columns = array();
- /**
- * @var array
- */
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- $query = "SELECT table_name
- FROM cat
- WHERE table_type='TABLE'
- ORDER BY table_name";
- $result = $this->pdo->query($query);
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a oracle database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $ownerQuery = '';
- $conOwnerQuery = '';
- $tableParts = $this->splitTableName($tableName);
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- if (!empty($tableParts['schema']))
- {
- $ownerQuery = " AND OWNER = '{$tableParts['schema']}'";
- $conOwnerQuery = " AND a.owner = '{$tableParts['schema']}'";
- }
- $query = "SELECT DISTINCT COLUMN_NAME
- FROM USER_TAB_COLUMNS
- WHERE TABLE_NAME='".$tableParts['table']."'
- $ownerQuery
- ORDER BY COLUMN_NAME";
- $result = $this->pdo->query($query);
- while ($columnName = $result->fetchColumn(0)) {
- $this->columns[$tableName][] = $columnName;
- }
- $keyQuery = "SELECT b.column_name
- FROM user_constraints a, user_cons_columns b
- WHERE a.constraint_type='P'
- AND a.constraint_name=b.constraint_name
- $conOwnerQuery
- AND a.table_name = '".$tableParts['table']."' ";
- $result = $this->pdo->query($keyQuery);
- while ($columnName = $result->fetchColumn(0)) {
- $this->keys[$tableName][] = $columnName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a PostgreSQL database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_PgSQL extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a database table.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME, ORDINAL_POSITION
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME,
- KCU.ORDINAL_POSITION
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC
- ON TC.TABLE_NAME = KCU.TABLE_NAME AND
- TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
- WHERE
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- if (empty($this->schema)) {
- return 'public';
- } else {
- return $this->schema;
- }
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return TRUE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a Microsoft SQL Server database.
- *
- * @package DbUnit
- * @author Nils Adermann <naderman@naderman.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_SqlSrv extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "SELECT name
- FROM sysobjects
- WHERE type='U'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $tableNames = array();
- while (($tableName = $statement->fetchColumn(0))) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- $query = "SELECT c.name
- FROM syscolumns c
- LEFT JOIN sysobjects o ON c.id = o.id
- WHERE o.name = '$tableName'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $columnNames = array();
- while (($columnName = $statement->fetchColumn(0))) {
- $columnNames[] = $columnName;
- }
- return $columnNames;
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- $query = "EXEC sp_statistics '$tableName'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $statement->setFetchMode(PDO::FETCH_ASSOC);
- $columnNames = array();
- while (($column = $statement->fetch())) {
- if ($column['TYPE'] == 1) {
- $columnNames[] = $column['COLUMN_NAME'];
- }
- }
- return $columnNames;
- }
- /**
- * Allow overwriting identities for the given table.
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- try {
- $query = "SET IDENTITY_INSERT $tableName ON";
- $this->pdo->exec($query);
- }
- catch (PDOException $e) {
- // ignore the error here - can happen if primary key is not an identity
- }
- }
- /**
- * Reenable auto creation of identities for the given table.
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- try {
- $query = "SET IDENTITY_INSERT $tableName OFF";
- $this->pdo->exec($query);
- }
- catch (PDOException $e) {
- // ignore the error here - can happen if primary key is not an identity
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_Table extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new database table object.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->setTableMetaData($tableMetaData);
- $pdoStatement = $databaseConnection->getConnection()->prepare(PHPUnit_Extensions_Database_DB_DataSet::buildTableSelect($tableMetaData, $databaseConnection));
- $pdoStatement->execute();
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_FilteredDataSet extends PHPUnit_Extensions_Database_DB_DataSet
- {
- /**
- * @var Array
- */
- protected $tableNames;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection, Array $tableNames)
- {
- parent::__construct($databaseConnection);
- $this->tableNames = $tableNames;
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return $this->tableNames;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for communicating with a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DB_IDatabaseConnection
- {
- /**
- * Close this connection.
- */
- public function close();
- /**
- * Creates a dataset containing the specified table names. If no table
- * names are specified then it will created a dataset over the entire
- * database.
- *
- * @param array $tableNames
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function createDataSet(Array $tableNames = NULL);
- /**
- * Creates a table with the result of the specified SQL statement.
- *
- * @param string $resultName
- * @param string $sql
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function createQueryTable($resultName, $sql);
- /**
- * Returns a PDO Connection
- *
- * @return PDO
- */
- public function getConnection();
- /**
- * Returns a database metadata object that can be used to retrieve table
- * meta data from the database.
- *
- * @return PHPUnit_Extensions_Database_DB_IMetaData
- */
- public function getMetaData();
- /**
- * Returns the number of rows in the given table. You can specify an
- * optional where clause to return a subset of the table.
- *
- * @param string $tableName
- * @param string $whereClause
- * @param int
- */
- public function getRowCount($tableName, $whereClause = NULL);
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema();
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object);
- /**
- * Returns the command used to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand();
- /**
- * Returns true if the connection allows cascading
- *
- * @return bool
- */
- public function allowsCascading();
- /**
- * Disables primary keys if connection does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName);
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class loads a table metadata object with database metadata.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_TableMetaData extends PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData
- {
- public function __construct($tableName, PHPUnit_Extensions_Database_DB_IMetaData $databaseMetaData)
- {
- $this->tableName = $tableName;
- $this->columns = $databaseMetaData->getTableColumns($tableName);
- $this->primaryKeys = $databaseMetaData->getTablePrimaryKeys($tableName);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic constructor for all meta data classes and a factory for
- * generating the appropriate meta data class.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DB_MetaData implements PHPUnit_Extensions_Database_DB_IMetaData
- {
- protected static $metaDataClassMap = array(
- 'pgsql' => 'PHPUnit_Extensions_Database_DB_MetaData_PgSQL',
- 'mysql' => 'PHPUnit_Extensions_Database_DB_MetaData_MySQL',
- 'oci' => 'PHPUnit_Extensions_Database_DB_MetaData_Oci',
- 'sqlite' => 'PHPUnit_Extensions_Database_DB_MetaData_Sqlite',
- 'sqlite2'=> 'PHPUnit_Extensions_Database_DB_MetaData_Sqlite',
- 'sqlsrv' => 'PHPUnit_Extensions_Database_DB_MetaData_SqlSrv',
- 'firebird' => 'PHPUnit_Extensions_Database_DB_MetaData_Firebird',
- 'dblib' => 'PHPUnit_Extensions_Database_DB_MetaData_Dblib'
- );
- /**
- * The PDO connection used to retreive database meta data
- *
- * @var PDO
- */
- protected $pdo;
- /**
- * The default schema name for the meta data object.
- *
- * @var string
- */
- protected $schema;
- /**
- * The character used to quote schema objects.
- */
- protected $schemaObjectQuoteChar = '"';
- /**
- * The command used to perform a TRUNCATE operation.
- */
- protected $truncateCommand = 'TRUNCATE';
- /**
- * Creates a new database meta data object using the given pdo connection
- * and schema name.
- *
- * @param PDO $pdo
- * @param string $schema
- */
- public final function __construct(PDO $pdo, $schema = '')
- {
- $this->pdo = $pdo;
- $this->schema = $schema;
- }
- /**
- * Creates a meta data object based on the driver of given $pdo object and
- * $schema name.
- *
- * @param PDO $pdo
- * @param string $schema
- * @return PHPUnit_Extensions_Database_DB_MetaData
- */
- public static function createMetaData(PDO $pdo, $schema = '')
- {
- $driverName = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
- if (isset(self::$metaDataClassMap[$driverName])) {
- $className = self::$metaDataClassMap[$driverName];
- if ($className instanceof ReflectionClass) {
- return $className->newInstance($pdo, $schema);
- } else {
- return self::registerClassWithDriver($className, $driverName)->newInstance($pdo, $schema);
- }
- } else {
- throw new PHPUnit_Extensions_Database_Exception("Could not find a meta data driver for {$driverName} pdo driver.");
- }
- }
- /**
- * Validates and registers the given $className with the given $pdoDriver.
- * It should be noted that this function will not attempt to include /
- * require the file. The $pdoDriver can be determined by the value of the
- * PDO::ATTR_DRIVER_NAME attribute for a pdo object.
- *
- * A reflection of the $className is returned.
- *
- * @param string $className
- * @param string $pdoDriver
- * @return ReflectionClass
- */
- public static function registerClassWithDriver($className, $pdoDriver)
- {
- if (!class_exists($className)) {
- throw new PHPUnit_Extensions_Database_Exception("Specified class for {$pdoDriver} driver ({$className}) does not exist.");
- }
- $reflection = new ReflectionClass($className);
- if ($reflection->isSubclassOf('PHPUnit_Extensions_Database_DB_MetaData')) {
- return self::$metaDataClassMap[$pdoDriver] = $reflection;
- } else {
- throw new PHPUnit_Extensions_Database_Exception("Specified class for {$pdoDriver} driver ({$className}) does not extend PHPUnit_Extensions_Database_DB_MetaData.");
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- return $this->schema;
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object)
- {
- $parts = explode('.', $object);
- $quotedParts = array();
- foreach ($parts as $part) {
- $quotedParts[] = $this->schemaObjectQuoteChar .
- str_replace($this->schemaObjectQuoteChar, $this->schemaObjectQuoteChar.$this->schemaObjectQuoteChar, $part).
- $this->schemaObjectQuoteChar;
- }
- return implode('.', $quotedParts);
- }
- /**
- * Seperates the schema and the table from a fully qualified table name.
- *
- * Returns an associative array containing the 'schema' and the 'table'.
- *
- * @param string $fullTableName
- * @return array
- */
- public function splitTableName($fullTableName)
- {
- if (($dot = strpos($fullTableName, '.')) !== FALSE) {
- return array(
- 'schema' => substr($fullTableName, 0, $dot),
- 'table' => substr($fullTableName, $dot + 1)
- );
- } else {
- return array(
- 'schema' => NULL,
- 'table' => $fullTableName
- );
- }
- }
- /**
- * Returns the command for the database to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand()
- {
- return $this->truncateCommand;
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return FALSE;
- }
- /**
- * Disables primary keys if the rdbms does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- return;
- }
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- return;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for communicating with a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection implements PHPUnit_Extensions_Database_DB_IDatabaseConnection
- {
- /**
- * @var PDO
- */
- protected $connection;
- /**
- * The metadata object used to retrieve table meta data from the database.
- *
- * @var PHPUnit_Extensions_Database_DB_IMetaData
- */
- protected $metaData;
- /**
- * Creates a new database connection
- *
- * @param PDO $connection
- * @param string $schema - The name of the database schema you will be testing against.
- */
- public function __construct(PDO $connection, $schema = '')
- {
- $this->connection = $connection;
- $this->metaData = PHPUnit_Extensions_Database_DB_MetaData::createMetaData($connection, $schema);
- $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- }
- /**
- * Close this connection.
- */
- public function close()
- {
- unset($this->connection);
- }
- /**
- * Returns a database metadata object that can be used to retrieve table
- * meta data from the database.
- *
- * @return PHPUnit_Extensions_Database_DB_IMetaData
- */
- public function getMetaData()
- {
- return $this->metaData;
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- return $this->getMetaData()->getSchema();
- }
- /**
- * Creates a dataset containing the specified table names. If no table
- * names are specified then it will created a dataset over the entire
- * database.
- *
- * @param array $tableNames
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- * @todo Implement the filtered data set.
- */
- public function createDataSet(array $tableNames = NULL)
- {
- if (empty($tableNames)) {
- return new PHPUnit_Extensions_Database_DB_DataSet($this);
- } else {
- return new PHPUnit_Extensions_Database_DB_FilteredDataSet($this, $tableNames);
- }
- }
- /**
- * Creates a table with the result of the specified SQL statement.
- *
- * @param string $resultName
- * @param string $sql
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function createQueryTable($resultName, $sql)
- {
- return new PHPUnit_Extensions_Database_DataSet_QueryTable($resultName, $sql, $this);
- }
- /**
- * Returns this connection database configuration
- *
- * @return PHPUnit_Extensions_Database_Database_DatabaseConfig
- */
- public function getConfig()
- {
- }
- /**
- * Returns a PDO Connection
- *
- * @return PDO
- */
- public function getConnection()
- {
- return $this->connection;
- }
- /**
- * Returns the number of rows in the given table. You can specify an
- * optional where clause to return a subset of the table.
- *
- * @param string $tableName
- * @param string $whereClause
- * @return int
- */
- public function getRowCount($tableName, $whereClause = NULL)
- {
- $query = "SELECT COUNT(*) FROM ".$this->quoteSchemaObject($tableName);
- if (isset($whereClause)) {
- $query .= " WHERE {$whereClause}";
- }
- return (int) $this->connection->query($query)->fetchColumn();
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object)
- {
- return $this->getMetaData()->quoteSchemaObject($object);
- }
- /**
- * Returns the command used to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand()
- {
- return $this->getMetaData()->getTruncateCommand();
- }
- /**
- * Returns true if the connection allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return $this->getMetaData()->allowsCascading();
- }
- /**
- * Disables primary keys if connection does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- $this->getMetaData()->disablePrimaryKeys($tableName);
- }
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- $this->getMetaData()->enablePrimaryKeys($tableName);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for retreiving metadata from a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DB_IMetaData
- {
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames();
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName);
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName);
- /**
- * Returns the name of the default schema.
- *
- * @return string
- */
- public function getSchema();
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object);
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading();
- /**
- * Disables primary keys if rdbms does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName);
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides iterative access to tables from a database instance.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_TableIterator implements PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * An array of tablenames.
- *
- * @var Array
- */
- protected $tableNames;
- /**
- * If this property is true then the tables will be iterated in reverse
- * order.
- *
- * @var bool
- */
- protected $reverse;
- /**
- * The database dataset that this iterator iterates over.
- *
- * @var PHPUnit_Extensions_Database_DB_DataSet
- */
- protected $dataSet;
- public function __construct($tableNames, PHPUnit_Extensions_Database_DB_DataSet $dataSet, $reverse = FALSE)
- {
- $this->tableNames = $tableNames;
- $this->dataSet = $dataSet;
- $this->reverse = $reverse;
- $this->rewind();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- $tableName = current($this->tableNames);
- return $this->dataSet->getTable($tableName);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- if ($this->reverse) {
- prev($this->tableNames);
- } else {
- next($this->tableNames);
- }
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- if ($this->reverse) {
- end($this->tableNames);
- } else {
- reset($this->tableNames);
- }
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return (current($this->tableNames) !== FALSE);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_DataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables = array();
- /**
- * The database connection this dataset is using.
- *
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->databaseConnection = $databaseConnection;
- }
- /**
- * Creates the query necessary to pull all of the data from a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @return unknown
- */
- public static function buildTableSelect(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection = NULL)
- {
- if ($tableMetaData->getTableName() == '') {
- $e = new Exception("Empty Table Name");
- echo $e->getTraceAsString();
- throw $e;
- }
- $columns = $tableMetaData->getColumns();
- if ($databaseConnection) {
- $columns = array_map(array($databaseConnection, 'quoteSchemaObject'), $columns);
- }
- $columnList = implode(', ', $columns);
- if ($databaseConnection) {
- $tableName = $databaseConnection->quoteSchemaObject($tableMetaData->getTableName());
- } else {
- $tableName = $tableMetaData->getTableName();
- }
- $primaryKeys = $tableMetaData->getPrimaryKeys();
- if ($databaseConnection) {
- $primaryKeys = array_map(array($databaseConnection, 'quoteSchemaObject'), $primaryKeys);
- }
- if (count($primaryKeys)) {
- $orderBy = 'ORDER BY ' . implode(' ASC, ', $primaryKeys) . ' ASC';
- } else {
- $orderBy = '';
- }
- return "SELECT {$columnList} FROM {$tableName} {$orderBy}";
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DB_TableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DB_TableIterator($this->getTableNames(), $this, $reverse);
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function getTable($tableName)
- {
- if (!in_array($tableName, $this->getTableNames())) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- if (empty($this->tables[$tableName])) {
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DB_Table($this->getTableMetaData($tableName), $this->databaseConnection);
- }
- return $this->tables[$tableName];
- }
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData
- */
- public function getTableMetaData($tableName)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $this->databaseConnection->getMetaData()->getTableColumns($tableName), $this->databaseConnection->getMetaData()->getTablePrimaryKeys($tableName));
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return $this->databaseConnection->getMetaData()->getTableNames();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database result set as a DBUnit
- * table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @deprecated The PHPUnit_Extension_Database_DataSet_QueryTable should be used instead
- * @see PHPUnit_Extension_Database_DataSet_QueryTable
- * @see PHPUnit_Extension_Database_DataSet_QueryDataSet
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_ResultSetTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new result set table.
- *
- * @param string $tableName
- * @param PDOStatement $pdoStatement
- */
- public function __construct($tableName, PDOStatement $pdoStatement)
- {
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- if (count($this->data)) {
- $columns = array_keys($this->data[0]);
- } else {
- $columns = array();
- }
- $this->setTableMetaData(new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns));
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This is the default implementation of the database tester. It receives its
- * connection object from the constructor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DefaultTester extends PHPUnit_Extensions_Database_AbstractTester
- {
- /**
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $connection;
- /**
- * Creates a new default database tester using the given connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- parent::__construct();
- $this->connection = $connection;
- }
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- public function getConnection()
- {
- return $this->connection;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two dbunit tables are equal.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_TableIsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $value;
- /**
- * @var string
- */
- protected $failure_reason;
- /**
- * Creates a new constraint.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $value
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (!$other instanceof PHPUnit_Extensions_Database_DataSet_ITable) {
- throw new InvalidArgumentException(
- 'PHPUnit_Extensions_Database_DataSet_ITable expected'
- );
- }
- return $this->value->matches($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $other->__toString() . ' ' . $this->toString();
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is equal to expected %s', $this->value->__toString()
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two dbunit datasets are equal.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_DataSetIsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $value;
- /**
- * @var string
- */
- protected $failure_reason;
- /**
- * Creates a new constraint.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $value
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (!$other instanceof PHPUnit_Extensions_Database_DataSet_IDataSet) {
- throw new InvalidArgumentException(
- 'PHPUnit_Extensions_Database_DataSet_IDataSet expected'
- );
- }
- return $this->value->matches($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $other->__toString() . ' ' . $this->toString();
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is equal to expected %s', $this->value->__toString()
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts the row count in a table
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_TableRowCount extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $value;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Creates a new constraint.
- *
- * @param $tableName
- * @param $value
- */
- public function __construct($tableName, $value)
- {
- parent::__construct();
- $this->tableName = $tableName;
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other == $this->value;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf('is equal to expected row count %d', $this->value);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This is the interface for DatabaseTester objects. These objects are used to
- * add database testing to existing test cases using composition instead of
- * extension.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_ITester
- {
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection);
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- public function getConnection();
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet();
- /**
- * TestCases must call this method inside setUp().
- */
- public function onSetUp();
- /**
- * TestCases must call this method inside tearDown().
- */
- public function onTearDown();
- /**
- * Sets the test dataset to use.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function setDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet);
- /**
- * Sets the schema value.
- *
- * @param string $schema
- */
- public function setSchema($schema);
- /**
- * Sets the DatabaseOperation to call when starting the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $setUpOperation
- */
- public function setSetUpOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $setUpOperation);
- /**
- * Sets the DatabaseOperation to call when stopping the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $tearDownOperation
- */
- public function setTearDownOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $tearDownOperation);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Data set implementation for the output of mysqldump --xml.
- *
- * @package DbUnit
- * @author Matthew Turland <tobias382@gmail.com>
- * @copyright 2010-2014 Matthew Turland <tobias382@gmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(array &$tableColumns, array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'mysqldump') {
- throw new PHPUnit_Extensions_Database_Exception('The root element of a MySQL XML data set file must be called <mysqldump>');
- }
- foreach ($this->xmlFileContents->xpath('./database/table_data') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<table_data> elements must include a name attribute');
- }
- $tableName = (string)$tableElement['name'];
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- }
- if (!isset($tableValues[$tableName])) {
- $tableValues[$tableName] = array();
- }
- foreach ($tableElement->xpath('./row') as $rowElement) {
- $rowValues = array();
- foreach ($rowElement->xpath('./field') as $columnElement) {
- if (empty($columnElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<field> element name attributes cannot be empty');
- }
- $columnName = (string)$columnElement['name'];
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- }
- foreach ($tableColumns[$tableName] as $columnName) {
- $fields = $rowElement->xpath('./field[@name="' . $columnName . '"]');
- $column = $fields[0];
- $attr = $column->attributes('http://www.w3.org/2001/XMLSchema-instance');
- if (isset($attr['type']) && (string) $attr['type'] === 'xs:hexBinary') {
- $columnValue = pack('H*',(string)$column);
- } else {
- $null = isset($column['nil']) || isset($attr[0]);
- $columnValue = $null ? NULL : (string)$column;
- }
- $rowValues[$columnName] = $columnValue;
- }
- $tableValues[$tableName][] = $rowValues;
- }
- }
- foreach ($this->xmlFileContents->xpath('./database/table_structure') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<table_structure> elements must include a name attribute');
- }
- $tableName = (string) $tableElement['name'];
- foreach ($tableElement->xpath('./field') as $fieldElement) {
- if (empty($fieldElement['Field'])) {
- throw new PHPUnit_Extensions_Database_Exception('<field> elements must include a Field attribute');
- }
- $columnName = (string) $fieldElement['Field'];
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml;
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_QueryDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables = array();
- /**
- * The database connection this dataset is using.
- *
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->databaseConnection = $databaseConnection;
- }
- public function addTable($tableName, $query = NULL)
- {
- if ($query === NULL) {
- $query = 'SELECT * FROM ' . $tableName;
- }
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_QueryTable($tableName, $query, $this->databaseConnection);
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DB_TableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function getTable($tableName)
- {
- if (!isset($this->tables[$tableName])) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- return $this->tables[$tableName];
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return array_keys($this->tables);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates YamlDataSets.
- *
- * You can incrementally add YAML files as tables to your datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_YamlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IYamlParser
- */
- protected $parser;
- /**
- * Creates a new YAML dataset
- *
- * @param string $yamlFile
- * @param PHPUnit_Extensions_Database_DataSet_IYamlParser $parser
- */
- public function __construct($yamlFile, $parser = NULL)
- {
- if ($parser == NULL) {
- $parser = new PHPUnit_Extensions_Database_DataSet_SymfonyYamlParser();
- }
- $this->parser = $parser;
- $this->addYamlFile($yamlFile);
- }
- /**
- * Adds a new yaml file to the dataset.
- * @param string $yamlFile
- */
- public function addYamlFile($yamlFile)
- {
- $data = $this->parser->parseYaml($yamlFile);
- foreach ($data as $tableName => $rows) {
- if (!isset($rows)) {
- $rows = array();
- }
- if (!is_array($rows)) {
- continue;
- }
- if (!array_key_exists($tableName, $this->tables)) {
- $columns = $this->getColumns($rows);
- $tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData(
- $tableName, $columns
- );
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_DefaultTable(
- $tableMetaData
- );
- }
- foreach ($rows as $row) {
- $this->tables[$tableName]->addRow($row);
- }
- }
- }
- /**
- * Creates a unique list of columns from all the rows in a table.
- * If the table is defined another time in the Yaml, and if the Yaml
- * parser could return the multiple occerrences, then this would be
- * insufficient unless we grouped all the occurences of the table
- * into onwe row set. sfYaml, however, does not provide multiple tables
- * with the same name, it only supplies the last table.
- *
- * @params all the rows in a table.
- */
- private function getColumns($rows) {
- $columns = array();
- foreach ($rows as $row) {
- $columns = array_merge($columns, array_keys($row));
- }
- return array_values(array_unique($columns));
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator(
- $this->tables, $reverse
- );
- }
- /**
- * Saves a given $dataset to $filename in YAML format
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- * @param string $filename
- */
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_Yaml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(
- __METHOD__ . ' called with an unwritable file.'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implements the basic functionality of data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractDataSet implements PHPUnit_Extensions_Database_DataSet_IDataSet
- {
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected abstract function createIterator($reverse = FALSE);
- /**
- * Returns an array of table names contained in the dataset.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- foreach ($this->getIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $tableNames[] = $table->getTableMetaData()->getTableName();
- }
- return $tableNames;
- }
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData($tableName)
- {
- return $this->getTable($tableName)->getTableMetaData();
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable($tableName)
- {
- foreach ($this->getIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- if ($table->getTableMetaData()->getTableName() == $tableName) {
- return $table;
- }
- }
- }
- /**
- * Returns an iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getIterator()
- {
- return $this->createIterator();
- }
- /**
- * Returns a reverse iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getReverseIterator()
- {
- return $this->createIterator(TRUE);
- }
- /**
- * Asserts that the given data set matches this data set.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_IDataSet $other)
- {
- $thisTableNames = $this->getTableNames();
- $otherTableNames = $other->getTableNames();
- sort($thisTableNames);
- sort($otherTableNames);
- if ($thisTableNames != $otherTableNames) {
- return FALSE;
- }
- foreach ($thisTableNames as $tableName) {
- $table = $this->getTable($tableName);
- if (!$table->matches($other->getTable($tableName))) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function __toString()
- {
- $iterator = $this->getIterator();
- $dataSetString = '';
- foreach ($iterator as $table) {
- $dataSetString .= $table->__toString();
- }
- return $dataSetString;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides an interface for creating data sets from data set spec strings.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates a data set from a data set spec string.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet($dataSetSpec);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A table decorator that allows filtering out table columns from results.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_TableFilter extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * The table meta data being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $originalTable;
- /**
- * Creates a new table filter using the original table
- *
- * @param $originalTable PHPUnit_Extensions_Database_DataSet_ITable
- * @param $excludeColumns Array @deprecated, use the set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $originalTable, Array $excludeColumns = array())
- {
- $this->originalTable = $originalTable;
- $this->setTableMetaData(new PHPUnit_Extensions_Database_DataSet_TableMetaDataFilter($originalTable->getTableMetaData()));
- $this->addExcludeColumns($excludeColumns);
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return $this->originalTable->getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- if (in_array($column, $this->getTableMetaData()->getColumns())) {
- return $this->originalTable->getValue($row, $column);
- } else {
- throw new InvalidArgumentException("The given row ({$row}) and column ({$column}) do not exist in table {$this->getTableMetaData()->getTableName()}");
- }
- }
- /**
- * Sets the columns to include in the table.
- * @param Array $includeColumns
- */
- public function addIncludeColumns(Array $includeColumns)
- {
- $this->tableMetaData->addIncludeColumns($includeColumns);
- }
- /**
- * Clears the included columns.
- */
- public function clearIncludeColumns()
- {
- $this->tableMetaData->clearIncludeColumns();
- }
- /**
- * Sets the columns to exclude from the table.
- * @param Array $excludeColumns
- */
- public function addExcludeColumns(Array $excludeColumns)
- {
- $this->tableMetaData->addExcludeColumns($excludeColumns);
- }
- /**
- * Clears the included columns.
- */
- public function clearExcludeColumns()
- {
- $this->tableMetaData->clearExcludeColumns();
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(Array $row)
- {
- $this->loadData();
- return parent::assertContainsRow($row);
- }
- /**
- * Loads data into local data table if it's not already loaded
- */
- protected function loadData()
- {
- if ($this->data === NULL) {
- $data = array();
- for($row = 0;$row < $this->originalTable->getRowCount();$row++) {
- $tRow = array();
- foreach($this->getTableMetaData()->getColumns() as $col) {
- $tRow[$col] = $this->getValue($row, $col);
- }
- $data[$row] = $tRow;
- }
- $this->data = $data;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides basic functionality for table meta data.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData implements PHPUnit_Extensions_Database_DataSet_ITableMetaData
- {
- /**
- * The names of all columns in the table.
- *
- * @var Array
- */
- protected $columns;
- /**
- * The names of all the primary keys in the table.
- *
- * @var Array
- */
- protected $primaryKeys;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns()
- {
- return $this->columns;
- }
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys()
- {
- return $this->primaryKeys;
- }
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName()
- {
- return $this->tableName;
- }
- /**
- * Asserts that the given tableMetaData matches this tableMetaData.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITableMetaData $other)
- {
- if ($this->getTableName() != $other->getTableName() ||
- $this->getColumns() != $other->getColumns()) {
- return FALSE;
- }
- return TRUE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates Composite Datasets
- *
- * Allows for creating datasets from multiple sources (csv, query, xml, etc.)
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_CompositeDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- protected $motherDataSet;
- /**
- * Creates a new Composite dataset
- *
- * You can pass in any data set that implements PHPUnit_Extensions_Database_DataSet_IDataSet
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct(Array $dataSets = array())
- {
- $this->motherDataset = new PHPUnit_Extensions_Database_DataSet_DefaultDataSet();
- foreach ($dataSets as $dataSet)
- {
- $this->addDataSet($dataSet);
- }
- }
- /**
- * Adds a new data set to the composite.
- *
- * The dataset may not define tables that already exist in the composite.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function addDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getTableNames() as $tableName)
- {
- if (!in_array($tableName, $this->getTableNames())) {
- $this->motherDataset->addTable($dataSet->getTable($tableName));
- } else {
- $other = $dataSet->getTable($tableName);
- $table = $this->getTable($tableName);
- if (!$table->getTableMetaData()->matches($other->getTableMetaData()))
- {
- throw new InvalidArgumentException("There is already a table named $tableName with different table definition");
- }
- $table->addTableRows($dataSet->getTable($tableName));
- }
- }
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- if ($reverse) {
- return $this->motherDataset->getReverseIterator();
- } else {
- return $this->motherDataset->getIterator();
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default table iterator
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTableIterator implements PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * An array of tables in the iterator.
- *
- * @var Array
- */
- protected $tables;
- /**
- * If this property is true then the tables will be iterated in reverse
- * order.
- *
- * @var bool
- */
- protected $reverse;
- /**
- * Creates a new default table iterator object.
- *
- * @param array $tables
- * @param bool $reverse
- */
- public function __construct(Array $tables, $reverse = FALSE)
- {
- $this->tables = $tables;
- $this->reverse = $reverse;
- $this->rewind();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- return current($this->tables);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- if ($this->reverse) {
- prev($this->tables);
- } else {
- next($this->tables);
- }
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- if ($this->reverse) {
- end($this->tables);
- } else {
- reset($this->tables);
- }
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return ($this->current() !== FALSE);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A dataset decorator that allows filtering out tables and table columns from
- * results.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DataSetFilter extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * The dataset being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $originalDataSet;
- /**
- * The tables to exclude from the data set.
- * @var Array
- */
- protected $excludeTables = array();
- /**
- * The tables to exclude from the data set.
- * @var Array
- */
- protected $includeTables = array();
- /**
- * The columns to exclude from the data set.
- * @var Array
- */
- protected $excludeColumns = array();
- /**
- * The columns to exclude from the data set.
- * @var Array
- */
- protected $includeColumns = array();
- /**
- * Creates a new filtered data set.
- *
- * The $exclude tables should be an associative array using table names as
- * the key and an array of column names to exclude for the value. If you
- * would like to exclude a full table set the value of the table's entry
- * to the special string '*'.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $originalDataSet
- * @param Array $excludeTables @deprecated use set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $originalDataSet, array $excludeTables = array())
- {
- $this->originalDataSet = $originalDataSet;
- $tables = array();
- foreach ($excludeTables as $tableName => $values) {
- if (is_array($values)) {
- $this->setExcludeColumnsForTable($tableName, $values);
- } elseif ($values == '*') {
- $tables[] = $tableName;
- } else {
- $this->setExcludeColumnsForTable($tableName, (array)$values);
- }
- }
- $this->addExcludeTables($tables);
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- $original_tables = $this->originalDataSet->getIterator($reverse);
- $new_tables = array();
- foreach ($original_tables as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $tableName = $table->getTableMetaData()->getTableName();
- if ((!in_array($tableName, $this->includeTables) && !empty($this->includeTables)) ||
- in_array($tableName, $this->excludeTables)
- ) {
- continue;
- } elseif (!empty($this->excludeColumns[$tableName]) || !empty($this->includeColumns[$tableName])) {
- $new_table = new PHPUnit_Extensions_Database_DataSet_TableFilter($table);
- if (!empty($this->includeColumns[$tableName])) {
- $new_table->addIncludeColumns($this->includeColumns[$tableName]);
- }
- if (!empty($this->excludeColumns[$tableName])) {
- $new_table->addExcludeColumns($this->excludeColumns[$tableName]);
- }
- $new_tables[] = $new_table;
- } else {
- $new_tables[] = $table;
- }
- }
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($new_tables);
- }
- /**
- * Adds tables to be included in the data set.
- * @param array $tables
- */
- public function addIncludeTables(Array $tables)
- {
- $this->includeTables = array_unique(array_merge($this->includeTables, $tables));
- }
- /**
- * Adds tables to be included in the data set.
- * @param array $tables
- */
- public function addExcludeTables(Array $tables)
- {
- $this->excludeTables = array_unique(array_merge($this->excludeTables, $tables));
- }
- /**
- * Adds columns to include in the data set for the given table.
- * @param string $table
- * @param Array $columns
- */
- public function setIncludeColumnsForTable($table, Array $columns)
- {
- $this->includeColumns[$table] = $columns;
- }
- /**
- * Adds columns to include in the data set for the given table.
- * @param string $table
- * @param Array $columns
- */
- public function setExcludeColumnsForTable($table, Array $columns)
- {
- $this->excludeColumns[$table] = $columns;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for parsing YAML files.
- *
- * @package DbUnit
- * @author Yash Parghi <yash@yashparghi.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.1
- */
- interface PHPUnit_Extensions_Database_DataSet_IYamlParser {
- /**
- * @param string $yamlFile
- * @return array parsed YAML
- */
- public function parseYaml($yamlFile);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_XmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(Array &$tableColumns, Array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'dataset') {
- throw new PHPUnit_Extensions_Database_Exception("The root element of an xml data set file must be called <dataset>");
- }
- foreach ($this->xmlFileContents->xpath('/dataset/table') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception("Table elements must include a name attribute specifying the table name.");
- }
- $tableName = (string)$tableElement['name'];
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- }
- if (!isset($tableValues[$tableName])) {
- $tableValues[$tableName] = array();
- }
- $tableInstanceColumns = array();
- foreach ($tableElement->xpath('./column') as $columnElement) {
- $columnName = (string)$columnElement;
- if (empty($columnName)) {
- throw new PHPUnit_Extensions_Database_Exception("Missing <column> elements for table $tableName. Add one or more <column> elements to the <table> element.");
- }
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- $tableInstanceColumns[] = $columnName;
- }
-
- foreach ($tableElement->xpath('./row') as $rowElement) {
- $rowValues = array();
- $index = 0;
- $numOfTableInstanceColumns = count($tableInstanceColumns);
- foreach ($rowElement->children() as $columnValue) {
-
- if ($index >= $numOfTableInstanceColumns) {
- throw new PHPUnit_Extensions_Database_Exception("Row contains more values than the number of columns defined for table $tableName.");
- }
- switch ($columnValue->getName()) {
- case 'value':
- $rowValues[$tableInstanceColumns[$index]] = (string)$columnValue;
- $index++;
- break;
- case 'null':
- $rowValues[$tableInstanceColumns[$index]] = NULL;
- $index++;
- break;
- default:
- throw new PHPUnit_Extensions_Database_Exception("Unknown element ".$columnValue->getName()." in a row element.");
- }
- }
- $tableValues[$tableName][] = $rowValues;
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_Xml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables;
- /**
- * Creates a new dataset using the given tables.
- *
- * @param array $tables
- */
- public function __construct(Array $tables = array())
- {
- $this->tables = $tables;
- }
- /**
- * Adds a table to the dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- public function addTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $this->tables[] = $table;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default YAML parser, using Symfony/Yaml.
- *
- * @package DbUnit
- * @author Yash Parghi <yash@yashparghi.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.1
- */
- class PHPUnit_Extensions_Database_DataSet_SymfonyYamlParser implements PHPUnit_Extensions_Database_DataSet_IYamlParser {
- public function parseYaml($yamlFile) {
- return Symfony\Component\Yaml\Yaml::parse(file_get_contents($yamlFile));
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_IDataSet extends IteratorAggregate
- {
- /**
- * Returns an array of table names contained in the dataset.
- *
- * @return array
- */
- public function getTableNames();
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData($tableName);
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable($tableName);
- /**
- * Returns a reverse iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getReverseIterator();
- /**
- * Asserts that the given data set matches this data set.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_IDataSet $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for returning table meta data.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITableMetaData
- {
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns();
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys();
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName();
- /**
- * Asserts that the given tableMetaData matches this tableMetaData.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITableMetaData $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An abstract implementation of a dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_Persistors_Abstract implements PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->saveDataSet($dataset);
- }
- /**
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function saveDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->startDataSet($dataset);
- foreach ($dataset as $table) {
- $this->saveTable($table);
- }
- $this->endDataSet($dataset);
- }
- /**
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function saveTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $rowCount = $table->getRowCount();
- $this->startTable($table);
- for ($i = 0; $i < $rowCount; $i++) {
- $this->row($table->getRow($i), $table);
- }
- $this->endTable($table);
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- abstract protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- abstract protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table);
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table);
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A XML dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Xml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- fwrite($this->fh, "<dataset>\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, "</dataset>\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t<table name=\"{$table->getTableMetaData()->getTableName()}\">\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- fwrite($this->fh, "\t\t<column>{$columnName}</column>\n");
- }
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t</table>\n");
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t\t<row>\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- if (isset($row[$columnName])) {
- fwrite($this->fh, "\t\t\t<value>" . htmlspecialchars($row[$columnName]) . "</value>\n");
- } else {
- fwrite($this->fh, "\t\t\t<null />\n");
- }
- }
- fwrite($this->fh, "\t\t</row>\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Flat XML dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- fwrite($this->fh, "<dataset>\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, "</dataset>\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- if ($table->getRowCount() == 0) {
- fwrite($this->fh, "\t<{$table->getTableMetaData()->getTableName()} />\n");
- }
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- //do nothing
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t<{$table->getTableMetaData()->getTableName()}\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- if (isset($row[$columnName])) {
- fwrite($this->fh, "\t\t{$columnName}=\"". htmlspecialchars($row[$columnName]) . "\"\n");
- }
- }
- fwrite($this->fh, "\t/>\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A yaml dataset persistor
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Yaml implements PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Writes the dataset to a yaml file
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $phpArr = array();
- $emptyTables = array();
- foreach ($dataset as $table) {
- $tableName = $table->getTableMetaData()->getTableName();
- $rowCount = $table->getRowCount();
- if (!$rowCount) {
- $emptyTables[] = $tableName;
- continue;
- }
- $phpArr[$tableName] = array();
- for ($i = 0; $i < $rowCount; $i++) {
- $phpArr[$tableName][] = $table->getRow($i);
- }
- }
- $emptyTablesAsString = '';
- if (count($emptyTables)) {
- $emptyTablesAsString = implode(":\n", $emptyTables) . ":\n\n";
- }
- file_put_contents(
- $this->filename,
- Symfony\Component\Yaml\Yaml::dump($phpArr, 3) . $emptyTablesAsString
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A MySQL XML dataset persistor.
- *
- * @package DbUnit
- * @author Matthew Turland <tobias382@gmail.com>
- * @copyright 2010-2014 Matthew Turland <tobias382@gmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var string
- */
- protected $database;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Sets the name of the database.
- *
- * @param string $database
- */
- public function setDatabase($database)
- {
- $this->database = $database;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, '<?xml version="1.0" encoding="UTF-8"?>' . "\n");
- fwrite($this->fh, '<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' . "\n");
- fwrite($this->fh, '<database name="' . $this->database . '">' . "\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, '</database>' . "\n");
- fwrite($this->fh, '</mysqldump>' . "\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '<table_data name="' . $table->getTableMetaData()->getTableName() . '">' . "\n");
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '</table_data>' . "\n");
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '<row>' . "\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- fwrite($this->fh, "\t\t" . '<field name="' . $columnName . '"');
- if (isset($row[$columnName])) {
- fwrite($this->fh, '>' . htmlspecialchars($row[$columnName]) . '</field>' . "\n");
- } else {
- fwrite($this->fh, ' xsi:nil="true" />' . "\n");
- }
- }
- fwrite($this->fh, "\t" . '</row>' . "\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates the appropriate Persistor based on a given type and spec.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Factory
- {
- /**
- * Returns the persistor.
- *
- * @param string $type
- * @param string $spec
- * @return PHPUnit_Extensions_Database_DataSet_IPersistable
- */
- public function getPersistorBySpec($type, $spec)
- {
- switch (strtolower($type)) {
- case 'xml':
- $xmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_Xml();
- $xmlPersistor->setFileName($spec);
- return $xmlPersistor;
- case 'flatxml':
- $flatXmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml();
- $flatXmlPersistor->setFileName($spec);
- return $flatXmlPersistor;
- case 'yaml':
- $yamlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_Yaml();
- $yamlPersistor->setFileName($spec);
- return $yamlPersistor;
- case 'mysqlxml':
- $mysqlXmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml();
- $mysqlXmlPersistor->setFileName($spec);
- return $mysqlXmlPersistor;
- default:
- throw new PHPUnit_Extensions_Database_Exception("I don't know what you want from me. PERSISTOR");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates CsvDataSets.
- *
- * You can incrementally add CSV files as tables to your datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_CsvDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * @var string
- */
- protected $delimiter = ',';
- /**
- * @var string
- */
- protected $enclosure = '"';
- /**
- * @var string
- */
- protected $escape = '"';
- /**
- * Creates a new CSV dataset
- *
- * You can pass in the parameters for how csv files will be read.
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct($delimiter = ',', $enclosure = '"', $escape = '"')
- {
- $this->delimiter = $delimiter;
- $this->enclosure = $enclosure;
- $this->escape = $escape;
- }
- /**
- * Adds a table to the dataset
- *
- * The table will be given the passed name. $csvFile should be a path to
- * a valid csv file (based on the arguments passed to the constructor.)
- *
- * @param string $tableName
- * @param string $csvFile
- */
- public function addTable($tableName, $csvFile)
- {
- if (!is_file($csvFile)) {
- throw new InvalidArgumentException("Could not find csv file: {$csvFile}");
- }
- if (!is_readable($csvFile)) {
- throw new InvalidArgumentException("Could not read csv file: {$csvFile}");
- }
- $fh = fopen($csvFile, 'r');
- $columns = $this->getCsvRow($fh);
- if ($columns === FALSE)
- {
- throw new InvalidArgumentException("Could not determine the headers from the given file {$csvFile}");
- }
- $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
- $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);
- while (($row = $this->getCsvRow($fh)) !== FALSE)
- {
- $table->addRow(array_combine($columns, $row));
- }
- $this->tables[$tableName] = $table;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- /**
- * Returns a row from the csv file in an indexed array.
- *
- * @param resource $fh
- * @return array
- */
- protected function getCsvRow($fh)
- {
- if (version_compare(PHP_VERSION, '5.3.0', '>')) {
- return fgetcsv($fh, NULL, $this->delimiter, $this->enclosure, $this->escape);
- } else {
- return fgetcsv($fh, NULL, $this->delimiter, $this->enclosure);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default table iterator
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementTableIterator implements OuterIterator, PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected $innerIterator;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement table iterator object.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableIterator $innerIterator
- * @param array $fullReplacements
- * @param array $subStrReplacements
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableIterator $innerIterator, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->innerIterator = $innerIterator;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- return new PHPUnit_Extensions_Database_DataSet_ReplacementTable($this->innerIterator->current(), $this->fullReplacements, $this->subStrReplacements);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- $this->innerIterator->next();
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- $this->innerIterator->rewind();
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return $this->innerIterator->valid();
- }
- public function getInnerIterator()
- {
- return $this->innerIterator;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Allows for replacing arbitrary values or portions of values with new data.
- *
- * A usage for this is replacing all values == '[NULL'] with a true NULL value
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $dataSet;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement dataset
- *
- * You can pass in any data set that implements PHPUnit_Extensions_Database_DataSet_IDataSet
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->dataSet = $dataSet;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- $innerIterator = $reverse ? $this->dataSet->getReverseIterator() : $this->dataSet->getIterator();
- return new PHPUnit_Extensions_Database_DataSet_ReplacementTableIterator($innerIterator, $this->fullReplacements, $this->subStrReplacements);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implements the basic functionality of data sets using a PHP array.
- *
- * @package DbUnit
- * @author Richard Brinkman <richardbrinkman@hotmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Database_DataSet_ArrayDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * Constructor to build a new ArrayDataSet with the given array.
- * The array parameter is an associative array of tables where the key is
- * the table name and the value an array of rows. Each row is an associative
- * array by itself with keys representing the field names and the values the
- * actual data.
- * For example:
- * array(
- * "addressbook" => array(
- * array("id" => 1, "name" => "...", "address" => "..."),
- * array("id" => 2, "name" => "...", "address" => "...")
- * )
- * )
- *
- * @param array $data
- */
- public function __construct(array $data)
- {
- foreach ($data AS $tableName => $rows) {
- $columns = array();
- if (isset($rows[0])) {
- $columns = array_keys($rows[0]);
- }
- $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
- $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);
- foreach ($rows AS $row) {
- $table->addRow($row);
- }
- $this->tables[$tableName] = $table;
- }
- }
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- public function getTable($tableName)
- {
- if (!isset($this->tables[$tableName])) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- return $this->tables[$tableName];
- }
- }
- ?><?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides default table functionality.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new table object using the given $tableMetaData
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData)
- {
- $this->setTableMetaData($tableMetaData);
- $this->data = array();
- }
- /**
- * Adds a row to the table with optional values.
- *
- * @param array $values
- */
- public function addRow($values = array())
- {
- $this->data[] = array_replace(
- array_fill_keys($this->getTableMetaData()->getColumns(), NULL),
- $values
- );
- }
- /**
- * Adds the rows in the passed table to the current table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- public function addTableRows(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $tableColumns = $this->getTableMetaData()->getColumns();
- $rowCount = $table->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $newRow = array();
- foreach ($tableColumns as $columnName) {
- $newRow[$columnName] = $table->getValue($i, $columnName);
- }
- $this->addRow($newRow);
- }
- }
- /**
- * Sets the specified column of the specied row to the specified value.
- *
- * @param int $row
- * @param string $column
- * @param mixed $value
- */
- public function setValue($row, $column, $value)
- {
- if (isset($this->data[$row])) {
- $this->data[$row][$column] = $value;
- } else {
- throw new InvalidArgumentException("The row given does not exist.");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITableIterator extends Iterator
- {
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable();
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData();
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(Array &$tableColumns, Array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'dataset') {
- throw new PHPUnit_Extensions_Database_Exception("The root element of a flat xml data set file must be called <dataset>");
- }
- foreach ($this->xmlFileContents->children() as $row) {
- $tableName = $row->getName();
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- $tableValues[$tableName] = array();
- }
- $values = array();
- foreach ($row->attributes() as $name => $value) {
- if (!in_array($name, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $name;
- }
- $values[$name] = $value;
- }
- if (count($values)) {
- $tableValues[$tableName][] = $values;
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- } catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for persisting datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- /**
- * Writes the given dataset
- *
- * The previous dataset will be overwritten.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables;
- /**
- * @var SimpleXmlElement
- */
- protected $xmlFileContents;
- /**
- * Creates a new dataset using the given tables.
- *
- * @param array $tables
- */
- public function __construct($xmlFile)
- {
- if (!is_file($xmlFile)) {
- throw new InvalidArgumentException(
- "Could not find xml file: {$xmlFile}"
- );
- }
- $libxmlErrorReporting = libxml_use_internal_errors(TRUE);
- $this->xmlFileContents = simplexml_load_file($xmlFile, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE);
- if (!$this->xmlFileContents) {
- $message = '';
- foreach (libxml_get_errors() as $error) {
- $message .= print_r($error, true);
- }
- throw new RuntimeException($message);
- }
- libxml_clear_errors();
- libxml_use_internal_errors($libxmlErrorReporting);
- $tableColumns = array();
- $tableValues = array();
- $this->getTableInfo($tableColumns, $tableValues);
- $this->createTables($tableColumns, $tableValues);
- }
- /**
- * Reads the simple xml object and creates the appropriate tables and meta
- * data for this dataset.
- */
- protected abstract function getTableInfo(Array &$tableColumns, Array &$tableValues);
- protected function createTables(Array &$tableColumns, Array &$tableValues)
- {
- foreach ($tableValues as $tableName => $values) {
- $table = $this->getOrCreateTable($tableName, $tableColumns[$tableName]);
- foreach ($values as $value) {
- $table->addRow($value);
- }
- }
- }
- /**
- * Returns the table with the matching name. If the table does not exist
- * an empty one is created.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected function getOrCreateTable($tableName, $tableColumns)
- {
- if (empty($this->tables[$tableName])) {
- $tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $tableColumns);
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_DefaultTable($tableMetaData);
- }
- return $this->tables[$tableName];
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TableMetaData decorator that allows filtering columns from another
- * metaData object.
- *
- * The if a whitelist (include) filter is specified, then only those columns
- * will be included.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_TableMetaDataFilter extends PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData
- {
- /**
- * The table meta data being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- protected $originalMetaData;
- /**
- * The columns to exclude from the meta data.
- * @var Array
- */
- protected $excludeColumns = array();
- /**
- * The columns to include from the meta data.
- * @var Array
- */
- protected $includeColumns = array();
- /**
- * Creates a new filtered table meta data object filtering out
- * $excludeColumns.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $originalMetaData
- * @param array $excludeColumns - Deprecated. Use the set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $originalMetaData, Array $excludeColumns = array())
- {
- $this->originalMetaData = $originalMetaData;
- $this->addExcludeColumns($excludeColumns);
- }
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns()
- {
- if (!empty($this->includeColumns)) {
- return array_values(array_intersect($this->originalMetaData->getColumns(), $this->includeColumns));
- }
- elseif (!empty($this->excludeColumns)) {
- return array_values(array_diff($this->originalMetaData->getColumns(), $this->excludeColumns));
- }
- else {
- return $this->originalMetaData->getColumns();
- }
- }
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys()
- {
- return $this->originalMetaData->getPrimaryKeys();
- }
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName()
- {
- return $this->originalMetaData->getTableName();
- }
- /**
- * Sets the columns to include in the table.
- * @param Array $includeColumns
- */
- public function addIncludeColumns(Array $includeColumns)
- {
- $this->includeColumns = array_unique(array_merge($this->includeColumns, $includeColumns));
- }
- /**
- * Clears the included columns.
- */
- public function clearIncludeColumns()
- {
- $this->includeColumns = array();
- }
- /**
- * Sets the columns to exclude from the table.
- * @param Array $excludeColumns
- */
- public function addExcludeColumns(Array $excludeColumns)
- {
- $this->excludeColumns = array_unique(array_merge($this->excludeColumns, $excludeColumns));
- }
- /**
- * Clears the excluded columns.
- */
- public function clearExcludeColumns()
- {
- $this->excludeColumns = array();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Allows for replacing arbitrary strings in your data sets with other values.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- * @todo When setTableMetaData() is taken out of the AbstractTable this class should extend AbstractTable.
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementTable implements PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $table;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement table
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- * @param array $fullReplacements
- * @param array $subStrReplacements
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $table, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->table = $table;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->table->getTableMetaData();
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return $this->table->getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- return $this->getReplacedValue($this->table->getValue($row, $column));
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- $row = $this->table->getRow($row);
- return array_map(array($this, 'getReplacedValue'), $row);
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $thisMetaData = $this->getTableMetaData();
- $otherMetaData = $other->getTableMetaData();
- if (!$thisMetaData->matches($otherMetaData) ||
- $this->getRowCount() != $other->getRowCount()) {
- return FALSE;
- }
- $columns = $thisMetaData->getColumns();
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- foreach ($columns as $columnName) {
- $thisValue = $this->getValue($i, $columnName);
- $otherValue = $other->getValue($i, $columnName);
- if (is_numeric($thisValue) && is_numeric($otherValue)) {
- if ($thisValue != $otherValue) {
- return FALSE;
- }
- } elseif ($thisValue !== $otherValue) {
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- public function __toString()
- {
- $columns = $this->getTableMetaData()->getColumns();
- $lineSeperator = str_repeat('+----------------------', count($columns)) . "+\n";
- $lineLength = strlen($lineSeperator) - 1;
- $tableString = $lineSeperator;
- $tableString .= '| ' . str_pad($this->getTableMetaData()->getTableName(), $lineLength - 4, ' ', STR_PAD_RIGHT) . " |\n";
- $tableString .= $lineSeperator;
- $tableString .= $this->rowToString($columns);
- $tableString .= $lineSeperator;
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $values = array();
- foreach ($columns as $columnName) {
- $values[] = $this->getValue($i, $columnName);
- }
- $tableString .= $this->rowToString($values);
- $tableString .= $lineSeperator;
- }
- return "\n" . $tableString . "\n";
- }
- protected function rowToString(Array $row)
- {
- $rowString = '';
- foreach ($row as $value) {
- if (is_null($value)) {
- $value = 'NULL';
- }
- $rowString .= '| ' . str_pad(substr($value, 0, 20), 20, ' ', STR_PAD_BOTH) . ' ';
- }
- return $rowString . "|\n";
- }
- protected function getReplacedValue($value)
- {
- if (is_scalar($value) && array_key_exists((string)$value, $this->fullReplacements)) {
- return $this->fullReplacements[$value];
- }
- else if (count($this->subStrReplacements) && isset($value)) {
- return str_replace(array_keys($this->subStrReplacements), array_values($this->subStrReplacements), $value);
- }
- else {
- return $value;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates DefaultDataSets based off of a spec string.
- *
- * This spec class requires a list of databases to be set to the object before
- * it can return a list of databases.
- *
- * The format of the spec string is as follows:
- *
- * <db label>:<schema>:<table name>:<sql>
- *
- * The db label should be equal to one of the keys in the array of databases
- * passed to setDatabases().
- *
- * The schema should be the primary schema you will be running the sql query
- * against.
- *
- * The table name should be set to what you would like the table name in the
- * dataset to be.
- *
- * The sql is the query you want to use to generate the table columns and data.
- * The column names in the table will be identical to the column aliases in the
- * query.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_DbQuery implements PHPUnit_Extensions_Database_DataSet_ISpec, PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * @var array
- */
- protected $databases = array();
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases)
- {
- $this->databases = $databases;
- }
- /**
- * Creates a Default Data Set with a query table from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_DefaultDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- list($dbLabel, $schema, $table, $sql) = explode(':', $dataSetSpec, 4);
- $databaseInfo = $this->databases[$dbLabel];
- $pdoRflc = new ReflectionClass('PDO');
- $pdo = $pdoRflc->newInstanceArgs(explode('|', $databaseInfo));
- $dbConnection = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($pdo, $schema);
- $table = $dbConnection->createQueryTable($table, $sql);
- return new PHPUnit_Extensions_Database_DataSet_DefaultDataSet(array($table));
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a XML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a xml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Xml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates XML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_XmlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_XmlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a FlatXML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a flat xml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_FlatXml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates Flat XML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a YAML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a yaml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Yaml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates YAML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_YamlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_YamlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for data set spec factories.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_Specs_IFactory
- {
- /**
- * Returns the data set
- *
- * @param string $type
- * @return PHPUnit_Extensions_Database_DataSet_ISpec
- */
- public function getDataSetSpecByType($type);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates CsvDataSets based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <csv options>|table1:filename.csv,table2:filename2.csv
- *
- * The first portion of the spec including the pipe symbol '|' is optional.
- * If the pipe option is included than it may be preceded by up to four
- * characters specifying values for the following arguments in order:
- * delimiter (defaults to ',',) enclosure (defaults to '"',) escape (defaults to '"',).
- *
- * Any additional characters in the csv options will be discarded.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Csv implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates CSV Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_CsvDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- $csvDataSetArgs = $this->getCsvOptions($dataSetSpec);
- $csvDataSetRfl = new ReflectionClass('PHPUnit_Extensions_Database_DataSet_CsvDataSet');
- $csvDataSet = $csvDataSetRfl->newInstanceArgs($csvDataSetArgs);
- foreach ($this->getTableFileMap($dataSetSpec) as $tableName => $file) {
- $csvDataSet->addTable($tableName, $file);
- }
- return $csvDataSet;
- }
- /**
- * Returns CSV options.
- *
- * Returns an array containing the options that will be passed to the
- * PHPUnit_Extensions_Database_DataSet_CsvDataSet constructor. The options
- * are determined by the given $dataSetSpec.
- *
- * @param string $dataSetSpec
- * @return array
- */
- protected function getCsvOptions($dataSetSpec)
- {
- list($csvOptStr, ) = explode('|', $dataSetSpec, 2);
- return str_split($csvOptStr);
- }
- /**
- * Returns map of tables to files.
- *
- * Returns an associative array containing a mapping of tables (the key)
- * to files (the values.) The tables and files are determined by the given
- * $dataSetSpec
- *
- * @param string $dataSetSpec
- * @return array
- */
- protected function getTableFileMap($dataSetSpec)
- {
- $tables = array();
- foreach (explode(',', $dataSetSpec) as $csvfile) {
- list($tableName, $file) = explode(':', $csvfile, 2);
- $tables[$tableName] = $file;
- }
- return $tables;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a database dataset based off of a spec string.
- *
- * This spec class requires a list of databases to be set to the object before
- * it can return a list of databases.
- *
- * The format of the spec string is as follows:
- *
- * <db label>:<schema>:<tables>
- *
- * The db label should be equal to one of the keys in the array of databases
- * passed to setDatabases().
- *
- * The schema should be the primary schema you will be choosing tables from.
- *
- * The tables should be a comma delimited list of all tables you would like to
- * pull data from.
- *
- * The sql is the query you want to use to generate the table columns and data.
- * The column names in the table will be identical to the column aliases in the
- * query.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_DbTable implements PHPUnit_Extensions_Database_DataSet_ISpec, PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * @var array
- */
- protected $databases = array();
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases)
- {
- $this->databases = $databases;
- }
- /**
- * Creates a DB Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- list($dbLabel, $schema, $tables) = explode(':', $dataSetSpec, 3);
- $databaseInfo = $this->databases[$dbLabel];
- $pdoRflc = new ReflectionClass('PDO');
- $pdo = $pdoRflc->newInstanceArgs(explode('|', $databaseInfo));
- $dbConnection = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($pdo, $schema);
- return !empty($tables) ? $dbConnection->createDataSet(explode(',', $tables)) : $dbConnection->createDataSet();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates the appropriate DataSet Spec based on a given type.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Factory implements PHPUnit_Extensions_Database_DataSet_Specs_IFactory
- {
- /**
- * Returns the data set
- *
- * @param string $type
- * @return PHPUnit_Extensions_Database_DataSet_ISpec
- */
- public function getDataSetSpecByType($type)
- {
- switch ($type) {
- case 'xml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Xml();
- case 'flatxml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_FlatXml();
- case 'csv':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Csv();
- case 'yaml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Yaml();
- case 'dbtable':
- return new PHPUnit_Extensions_Database_DataSet_Specs_DbTable();
- case 'dbquery':
- return new PHPUnit_Extensions_Database_DataSet_Specs_DbQuery();
- default:
- throw new PHPUnit_Extensions_Database_Exception("I don't know what you want from me.");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_QueryTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * @var string
- */
- protected $query;
- /**
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Creates a new database query table object.
- *
- * @param string $table_name
- * @param string $query
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct($tableName, $query, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->query = $query;
- $this->databaseConnection = $databaseConnection;
- $this->tableName = $tableName;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- $this->createTableMetaData();
- return parent::getTableMetaData();
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(Array $row)
- {
- $this->loadData();
- return parent::assertContainsRow($row);
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- $this->loadData();
- return parent::getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- $this->loadData();
- return parent::getValue($row, $column);
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- $this->loadData();
- return parent::getRow($row);
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $this->loadData();
- return parent::matches($other);
- }
- protected function loadData()
- {
- if ($this->data === NULL) {
- $pdoStatement = $this->databaseConnection->getConnection()->query($this->query);
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- }
- }
- protected function createTableMetaData()
- {
- if ($this->tableMetaData === NULL)
- {
- $this->loadData();
- // if some rows are in the table
- $columns = array();
- if (isset($this->data[0]))
- // get column names from data
- $columns = array_keys($this->data[0]);
- else {
- // if no rows found, get column names from database
- $pdoStatement = $this->databaseConnection->getConnection()->prepare("SELECT column_name FROM information_schema.COLUMNS WHERE table_schema=:schema AND table_name=:table");
- $pdoStatement->execute(array(
- "table" => $this->tableName,
- "schema" => $this->databaseConnection->getSchema()
- ));
- $columns = $pdoStatement->fetchAll(PDO::FETCH_COLUMN, 0);
- }
- // create metadata
- $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $columns);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic functionality for dbunit tables
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_AbstractTable implements PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- protected $tableMetaData;
- /**
- * A 2-dimensional array containing the data for this table.
- *
- * @var array
- */
- protected $data;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable|null
- */
- private $other;
- /**
- * Sets the metadata for this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @deprecated
- */
- protected function setTableMetaData(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData)
- {
- $this->tableMetaData = $tableMetaData;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->tableMetaData;
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return count($this->data);
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- * @todo reorganize this function to throw the exception first.
- */
- public function getValue($row, $column)
- {
- if (isset($this->data[$row][$column])) {
- $value = $this->data[$row][$column];
- return ($value instanceof SimpleXMLElement) ? (string) $value : $value;
- } else {
- if (!in_array($column, $this->getTableMetaData()->getColumns()) || $this->getRowCount() <= $row) {
- throw new InvalidArgumentException("The given row ({$row}) and column ({$column}) do not exist in table {$this->getTableMetaData()->getTableName()}");
- } else {
- return NULL;
- }
- }
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- if (isset($this->data[$row])) {
- return $this->data[$row];
- } else {
- if ($this->getRowCount() <= $row) {
- throw new InvalidArgumentException("The given row ({$row}) does not exist in table {$this->getTableMetaData()->getTableName()}");
- } else {
- return NULL;
- }
- }
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $thisMetaData = $this->getTableMetaData();
- $otherMetaData = $other->getTableMetaData();
- if (!$thisMetaData->matches($otherMetaData) ||
- $this->getRowCount() != $other->getRowCount()) {
- return FALSE;
- }
- $columns = $thisMetaData->getColumns();
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- foreach ($columns as $columnName) {
- $thisValue = $this->getValue($i, $columnName);
- $otherValue = $other->getValue($i, $columnName);
- if (is_numeric($thisValue) && is_numeric($otherValue)) {
- if ($thisValue != $otherValue) {
- $this->other = $other;
- return FALSE;
- }
- } elseif ($thisValue !== $otherValue) {
- $this->other = $other;
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(array $row)
- {
- return in_array($row, $this->data);
- }
- public function __toString()
- {
- $columns = $this->getTableMetaData()->getColumns();
- $lineSeperator = str_repeat('+----------------------', count($columns)) . "+\n";
- $lineLength = strlen($lineSeperator) - 1;
- $tableString = $lineSeperator;
- $tableString .= '| ' . str_pad($this->getTableMetaData()->getTableName(), $lineLength - 4, ' ', STR_PAD_RIGHT) . " |\n";
- $tableString .= $lineSeperator;
- $tableString .= $this->rowToString($columns);
- $tableString .= $lineSeperator;
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $values = array();
- foreach ($columns as $columnName) {
- if ($this->other) {
- try {
- if ($this->getValue($i, $columnName) != $this->other->getValue($i, $columnName)) {
- $values[] = sprintf(
- '%s != actual %s',
- var_export($this->getValue($i, $columnName), TRUE),
- var_export($this->other->getValue($i, $columnName), TRUE)
- );
- } else {
- $values[] = $this->getValue($i, $columnName);
- }
- } catch (\InvalidArgumentException $ex) {
- $values[] = $this->getValue($i, $columnName) . ': no row';
- }
- } else {
- $values[] = $this->getValue($i, $columnName);
- }
- }
- $tableString .= $this->rowToString($values) . $lineSeperator;
- }
- return ($this->other ? '(table diff enabled)' : '') . "\n" . $tableString . "\n";
- }
- protected function rowToString(Array $row)
- {
- $rowString = '';
- foreach ($row as $value) {
- if (is_null($value)) {
- $value = 'NULL';
- }
- $rowString .= '| ' . str_pad(substr($value, 0, 20), 20, ' ', STR_PAD_BOTH) . ' ';
- }
- return $rowString . "|\n";
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData();
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount();
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column);
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row);
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of table meta data
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData extends PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData
- {
- /**
- * Creates a new default table meta data object.
- *
- * @param string $tableName
- * @param array $columns
- * @param array $primaryKeys
- */
- public function __construct($tableName, Array $columns, Array $primaryKeys = array())
- {
- $this->tableName = $tableName;
- $this->columns = $columns;
- $this->primaryKeys = array();
- foreach ($primaryKeys as $columnName) {
- if (!in_array($columnName, $this->columns)) {
- throw new InvalidArgumentException("Primary key column passed that is not in the column list.");
- } else {
- $this->primaryKeys[] = $columnName;
- }
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_Invoker package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- declare(ticks = 1);
- /**
- * Utility class for invoking callables with a timeout.
- *
- * @since Class available since Release 1.0.0
- */
- class PHP_Invoker
- {
- /**
- * @var int
- */
- protected $timeout;
- /**
- * Invokes a callable and raises an exception when the execution does not
- * finish before the specified timeout.
- *
- * @param callable $callable
- * @param array $arguments
- * @param int $timeout in seconds
- * @return mixed
- * @throws InvalidArgumentException
- */
- public function invoke($callable, array $arguments, $timeout)
- {
- if (!is_callable($callable)) {
- throw new InvalidArgumentException;
- }
- if (!is_integer($timeout)) {
- throw new InvalidArgumentException;
- }
- pcntl_signal(SIGALRM, array($this, 'callback'), TRUE);
- pcntl_alarm($timeout);
- $this->timeout = $timeout;
- try {
- $result = call_user_func_array($callable, $arguments);
- }
- catch (Exception $e) {
- pcntl_alarm(0);
- throw $e;
- }
- pcntl_alarm(0);
- return $result;
- }
- /**
- * Invoked by pcntl_signal() when a SIGALRM occurs.
- */
- public function callback()
- {
- throw new PHP_Invoker_TimeoutException(
- sprintf(
- 'Execution aborted after %s',
- PHP_Timer::secondsToTimeString($this->timeout)
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_Invoker package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 1.0.0
- */
- class PHP_Invoker_TimeoutException extends RuntimeException
- {
- }
- PHPUnit_MockObject
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Main matcher which defines a full expectation using method, parameter and
- * invocation matchers.
- * This matcher encapsulates all the other matchers and allows the builder to
- * set the specific matchers when the appropriate methods are called (once(),
- * where() etc.).
- *
- * All properties are public so that they can easily be accessed by the builder.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Invocation
- */
- public $invocationMatcher;
- /**
- * @var mixed
- */
- public $afterMatchBuilderId = null;
- /**
- * @var bool
- */
- public $afterMatchBuilderIsInvoked = false;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_MethodName
- */
- public $methodNameMatcher = null;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Parameters
- */
- public $parametersMatcher = null;
- /**
- * @var PHPUnit_Framework_MockObject_Stub
- */
- public $stub = null;
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
- */
- public function __construct(PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
- {
- $this->invocationMatcher = $invocationMatcher;
- }
- /**
- * @return string
- */
- public function toString()
- {
- $list = array();
- if ($this->invocationMatcher !== null) {
- $list[] = $this->invocationMatcher->toString();
- }
- if ($this->methodNameMatcher !== null) {
- $list[] = 'where ' . $this->methodNameMatcher->toString();
- }
- if ($this->parametersMatcher !== null) {
- $list[] = 'and ' . $this->parametersMatcher->toString();
- }
- if ($this->afterMatchBuilderId !== null) {
- $list[] = 'after ' . $this->afterMatchBuilderId;
- }
- if ($this->stub !== null) {
- $list[] = 'will ' . $this->stub->toString();
- }
- return implode(' ', $list);
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- if ($this->afterMatchBuilderId !== null) {
- $builder = $invocation->object
- ->__phpunit_getInvocationMocker()
- ->lookupId($this->afterMatchBuilderId);
- if (!$builder) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'No builder found for match builder identification <%s>',
- $this->afterMatchBuilderId
- )
- );
- }
- $matcher = $builder->getMatcher();
- if ($matcher && $matcher->invocationMatcher->hasBeenInvoked()) {
- $this->afterMatchBuilderIsInvoked = true;
- }
- }
- $this->invocationMatcher->invoked($invocation);
- try {
- if ($this->parametersMatcher !== null &&
- !$this->parametersMatcher->matches($invocation)) {
- $this->parametersMatcher->verify();
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- $e->getMessage()
- ),
- $e->getComparisonFailure()
- );
- }
- if ($this->stub) {
- return $this->stub->invoke($invocation);
- }
- return;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if ($this->afterMatchBuilderId !== null) {
- $builder = $invocation->object
- ->__phpunit_getInvocationMocker()
- ->lookupId($this->afterMatchBuilderId);
- if (!$builder) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'No builder found for match builder identification <%s>',
- $this->afterMatchBuilderId
- )
- );
- }
- $matcher = $builder->getMatcher();
- if (!$matcher) {
- return false;
- }
- if (!$matcher->invocationMatcher->hasBeenInvoked()) {
- return false;
- }
- }
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- if (!$this->invocationMatcher->matches($invocation)) {
- return false;
- }
- try {
- if (!$this->methodNameMatcher->matches($invocation)) {
- return false;
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- $e->getMessage()
- ),
- $e->getComparisonFailure()
- );
- }
- return true;
- }
- /**
- * @throws PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- try {
- $this->invocationMatcher->verify();
- if ($this->parametersMatcher === null) {
- $this->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
- }
- $invocationIsAny = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount';
- $invocationIsNever = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' && $this->invocationMatcher->isNever();
- if (!$invocationIsAny && !$invocationIsNever) {
- $this->parametersMatcher->verify();
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s.\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- PHPUnit_Framework_TestFailure::exceptionToString($e)
- )
- );
- }
- }
- /**
- * @since Method available since Release 1.2.4
- */
- public function hasMatchers()
- {
- if ($this->invocationMatcher !== null &&
- !$this->invocationMatcher instanceof PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount) {
- return true;
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which must verify a given expectation.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which can be invoked.
- *
- * The invocation will be taken from a mock object and passed to an object
- * of this class.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Invokable extends PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Invokes the invocation object $invocation so that it can be checked for
- * expectations or matched against stubs.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation object passed from mock object.
- * @return object
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
- /**
- * Checks if the invocation matches.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation object passed from mock object.
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implementation of the Builder pattern for Mock objects.
- *
- * @since File available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_MockBuilder
- {
- /**
- * @var PHPUnit_Framework_TestCase
- */
- private $testCase;
- /**
- * @var string
- */
- private $type;
- /**
- * @var array
- */
- private $methods = array();
- /**
- * @var string
- */
- private $mockClassName = '';
- /**
- * @var array
- */
- private $constructorArgs = array();
- /**
- * @var bool
- */
- private $originalConstructor = true;
- /**
- * @var bool
- */
- private $originalClone = true;
- /**
- * @var bool
- */
- private $autoload = true;
- /**
- * @var bool
- */
- private $cloneArguments = false;
- /**
- * @var bool
- */
- private $callOriginalMethods = false;
- /**
- * @var object
- */
- private $proxyTarget = null;
- /**
- * @param PHPUnit_Framework_TestCase $testCase
- * @param array|string $type
- */
- public function __construct(PHPUnit_Framework_TestCase $testCase, $type)
- {
- $this->testCase = $testCase;
- $this->type = $type;
- }
- /**
- * Creates a mock object using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMock()
- {
- return $this->testCase->getMock(
- $this->type,
- $this->methods,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->cloneArguments,
- $this->callOriginalMethods,
- $this->proxyTarget
- );
- }
- /**
- * Creates a mock object for an abstract class using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMockForAbstractClass()
- {
- return $this->testCase->getMockForAbstractClass(
- $this->type,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->methods,
- $this->cloneArguments
- );
- }
- /**
- * Creates a mock object for a trait using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMockForTrait()
- {
- return $this->testCase->getMockForTrait(
- $this->type,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->methods,
- $this->cloneArguments
- );
- }
- /**
- * Specifies the subset of methods to mock. Default is to mock all of them.
- *
- * @param array|null $methods
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setMethods($methods)
- {
- $this->methods = $methods;
- return $this;
- }
- /**
- * Specifies the arguments for the constructor.
- *
- * @param array $args
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setConstructorArgs(array $args)
- {
- $this->constructorArgs = $args;
- return $this;
- }
- /**
- * Specifies the name for the mock class.
- *
- * @param string $name
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setMockClassName($name)
- {
- $this->mockClassName = $name;
- return $this;
- }
- /**
- * Disables the invocation of the original constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableOriginalConstructor()
- {
- $this->originalConstructor = false;
- return $this;
- }
- /**
- * Enables the invocation of the original constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableOriginalConstructor()
- {
- $this->originalConstructor = true;
- return $this;
- }
- /**
- * Disables the invocation of the original clone constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableOriginalClone()
- {
- $this->originalClone = false;
- return $this;
- }
- /**
- * Enables the invocation of the original clone constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableOriginalClone()
- {
- $this->originalClone = true;
- return $this;
- }
- /**
- * Disables the use of class autoloading while creating the mock object.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableAutoload()
- {
- $this->autoload = false;
- return $this;
- }
- /**
- * Enables the use of class autoloading while creating the mock object.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableAutoload()
- {
- $this->autoload = true;
- return $this;
- }
- /**
- * Disables the cloning of arguments passed to mocked methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function disableArgumentCloning()
- {
- $this->cloneArguments = false;
- return $this;
- }
- /**
- * Enables the cloning of arguments passed to mocked methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableArgumentCloning()
- {
- $this->cloneArguments = true;
- return $this;
- }
- /**
- * Enables the invocation of the original methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function enableProxyingToOriginalMethods()
- {
- $this->callOriginalMethods = true;
- return $this;
- }
- /**
- * Disables the invocation of the original methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function disableProxyingToOriginalMethods()
- {
- $this->callOriginalMethods = false;
- $this->proxyTarget = null;
- return $this;
- }
- /**
- * Sets the proxy target.
- *
- * @param object $object
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function setProxyTarget($object)
- {
- $this->proxyTarget = $object;
- return $this;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for exceptions used by PHPUnit_MockObject.
- *
- * @since Interface available since Release 2.0.6
- */
- interface PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.6
- */
- class PHPUnit_Framework_MockObject_BadMethodCallException extends BadMethodCallException implements PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 2.0.6
- */
- class PHPUnit_Framework_MockObject_RuntimeException extends RuntimeException implements PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for invocations.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Invocation
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for all mock objects which are generated by
- * PHPUnit_Framework_MockObject_MockBuilder.
- *
- * @method PHPUnit_Framework_MockObject_Builder_InvocationMocker method($constraint)
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_MockObject /*extends PHPUnit_Framework_MockObject_Verifiable*/
- {
- /**
- * Registers a new expectation in the mock object and returns the match
- * object which can be infused with further details.
- *
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
- /**
- * @return PHPUnit_Framework_MockObject_InvocationMocker
- * @since Method available since Release 2.0.0
- */
- public function __phpunit_setOriginalObject($originalObject);
- /**
- * @return PHPUnit_Framework_MockObject_InvocationMocker
- */
- public function __phpunit_getInvocationMocker();
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function __phpunit_verify();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Mocker for invocations which are sent from
- * PHPUnit_Framework_MockObject_MockObject objects.
- *
- * Keeps track of all expectations and stubs as well as registering
- * identifications for builders.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_InvocationMocker implements PHPUnit_Framework_MockObject_Stub_MatcherCollection, PHPUnit_Framework_MockObject_Invokable, PHPUnit_Framework_MockObject_Builder_Namespace
- {
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Invocation[]
- */
- protected $matchers = array();
- /**
- * @var PHPUnit_Framework_MockObject_Builder_Match[]
- */
- protected $builderMap = array();
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- */
- public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- $this->matchers[] = $matcher;
- }
- /**
- * @since Method available since Release 1.1.0
- */
- public function hasMatchers()
- {
- foreach ($this->matchers as $matcher) {
- if ($matcher->hasMatchers()) {
- return true;
- }
- }
- return false;
- }
- /**
- * @param mixed $id
- * @return bool|null
- */
- public function lookupId($id)
- {
- if (isset($this->builderMap[$id])) {
- return $this->builderMap[$id];
- }
- return;
- }
- /**
- * @param mixed $id
- * @param PHPUnit_Framework_MockObject_Builder_Match $builder
- * @throws PHPUnit_Framework_Exception
- */
- public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder)
- {
- if (isset($this->builderMap[$id])) {
- throw new PHPUnit_Framework_Exception(
- 'Match builder with id <' . $id . '> is already registered.'
- );
- }
- $this->builderMap[$id] = $builder;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- return new PHPUnit_Framework_MockObject_Builder_InvocationMocker(
- $this,
- $matcher
- );
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return mixed
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $exception = null;
- $hasReturnValue = false;
- if (strtolower($invocation->methodName) == '__tostring') {
- $returnValue = '';
- } else {
- $returnValue = null;
- }
- foreach ($this->matchers as $match) {
- try {
- if ($match->matches($invocation)) {
- $value = $match->invoked($invocation);
- if (!$hasReturnValue) {
- $returnValue = $value;
- $hasReturnValue = true;
- }
- }
- } catch (Exception $e) {
- $exception = $e;
- }
- }
- if ($exception !== null) {
- throw $exception;
- }
- return $returnValue;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- foreach ($this->matchers as $matcher) {
- if (!$matcher->matches($invocation)) {
- return false;
- }
- }
- return true;
- }
- /**
- * @return bool
- */
- public function verify()
- {
- foreach ($this->matchers as $matcher) {
- $matcher->verify();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for a specific method name in the invocations.
- *
- * Checks the method name all incoming invocations, the name is checked against
- * the defined constraint $constraint. If the constraint is met it will return
- * true in matches().
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_MethodName extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @param PHPUnit_Framework_Constraint|string
- * @throws PHPUnit_Framework_Constraint
- */
- public function __construct($constraint)
- {
- if (!$constraint instanceof PHPUnit_Framework_Constraint) {
- if (!is_string($constraint)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint,
- 0,
- 10,
- false,
- true
- );
- }
- $this->constraint = $constraint;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'method name ' . $this->constraint->toString();
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return $this->constraint->evaluate($invocation->methodName, '', true);
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least one
- * time.
- *
- * If the number of invocations is 0 it will throw an exception in verify.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at least once';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count < 1) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at least once but it never occured.'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which allows any parameters to a method.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_AnyParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'with any parameters';
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for specific parameters in the invocations.
- *
- * Checks the parameters of all incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_Parameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $parameters = array();
- /**
- * @var PHPUnit_Framework_MockObject_Invocation
- */
- protected $invocation;
- /**
- * @param array $parameters
- */
- public function __construct(array $parameters)
- {
- foreach ($parameters as $parameter) {
- if (!($parameter instanceof PHPUnit_Framework_Constraint)) {
- $parameter = new PHPUnit_Framework_Constraint_IsEqual(
- $parameter
- );
- }
- $this->parameters[] = $parameter;
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $text = 'with parameter';
- foreach ($this->parameters as $index => $parameter) {
- if ($index > 0) {
- $text .= ' and';
- }
- $text .= ' ' . $index . ' ' . $parameter->toString();
- }
- return $text;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->invocation = $invocation;
- return $this->verify();
- }
- /**
- * Checks if the invocation $invocation matches the current rules. If it
- * does the matcher will get the invoked() method called which should check
- * if an expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->invocation === null) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Mocked method does not exist.'
- );
- }
- if (count($this->invocation->parameters) < count($this->parameters)) {
- $message = 'Parameter count for invocation %s is too low.';
- // The user called `->with($this->anything())`, but may have meant
- // `->withAnyParameters()`.
- //
- // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199
- if (count($this->parameters) === 1 &&
- get_class($this->parameters[0]) === 'PHPUnit_Framework_Constraint_IsAnything') {
- $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.";
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf($message, $this->invocation->toString())
- );
- }
- foreach ($this->parameters as $i => $parameter) {
- $parameter->evaluate(
- $this->invocation->parameters[$i],
- sprintf(
- 'Parameter %s for invocation %s does not match expected ' .
- 'value.',
- $i,
- $this->invocation->toString()
- )
- );
- }
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked zero or more
- * times. This matcher will always match.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked zero or more times';
- }
- /**
- */
- public function verify()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least
- * N times.
- *
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var int
- */
- private $requiredInvocations;
- /**
- * @param int $requiredInvocations
- */
- public function __construct($requiredInvocations)
- {
- $this->requiredInvocations = $requiredInvocations;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at least ' . $this->requiredInvocations . ' times';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count < $this->requiredInvocations) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at least ' . $this->requiredInvocations .
- ' times but it occured ' . $count . ' time(s).'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which matches an invocation based on its
- * method name, argument, order or call count.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Matcher_Invocation extends PHPUnit_Framework_SelfDescribing, PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Registers the invocation $invocation in the object as being invoked.
- * This will only occur after matches() returns true which means the
- * current invocation is the correct one.
- *
- * The matcher can store information from the invocation which can later
- * be checked in verify(), or it can check the values directly and throw
- * and exception if an expectation is not met.
- *
- * If the matcher is a stub it will also have a return value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation);
- /**
- * Checks if the invocation $invocation matches the current rules. If it does
- * the matcher will get the invoked() method called which should check if an
- * expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for sets of specific parameters in the invocations.
- *
- * Checks the parameters of the incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * It takes a list of match groups and and increases a call index after each invocation.
- * So the first invocation uses the first group of constraints, the second the next and so on.
- */
- class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var array
- */
- private $_parameterGroups = array();
- /**
- * @var array
- */
- private $_invocations = array();
- /**
- * @param array $parameterGroups
- */
- public function __construct(array $parameterGroups)
- {
- foreach ($parameterGroups as $index => $parameters) {
- foreach ($parameters as $parameter) {
- if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
- $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
- }
- $this->_parameterGroups[$index][] = $parameter;
- }
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $text = 'with consecutive parameters';
- return $text;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->_invocations[] = $invocation;
- $callIndex = count($this->_invocations) - 1;
- $this->verifyInvocation($invocation, $callIndex);
- return false;
- }
- public function verify()
- {
- foreach ($this->_invocations as $callIndex => $invocation) {
- $this->verifyInvocation($invocation, $callIndex);
- }
- }
- /**
- * Verify a single invocation
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @param int $callIndex
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
- {
- if (isset($this->_parameterGroups[$callIndex])) {
- $parameters = $this->_parameterGroups[$callIndex];
- } else {
- // no parameter assertion for this call index
- return;
- }
- if ($invocation === null) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Mocked method does not exist.'
- );
- }
- if (count($invocation->parameters) < count($parameters)) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'Parameter count for invocation %s is too low.',
- $invocation->toString()
- )
- );
- }
- foreach ($parameters as $i => $parameter) {
- $parameter->evaluate(
- $invocation->parameters[$i],
- sprintf(
- 'Parameter %s for invocation #%d %s does not match expected ' .
- 'value.',
- $i,
- $callIndex,
- $invocation->toString()
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method was invoked at a certain index.
- *
- * If the expected index number does not match the current invocation index it
- * will not match which means it skips all method and parameter matching. Only
- * once the index is reached will the method and parameter start matching and
- * verifying.
- *
- * If the index is never reached it will throw an exception in index.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var int
- */
- protected $sequenceIndex;
- /**
- * @var int
- */
- protected $currentIndex = -1;
- /**
- * @param int $sequenceIndex
- */
- public function __construct($sequenceIndex)
- {
- $this->sequenceIndex = $sequenceIndex;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at sequence index ' . $this->sequenceIndex;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->currentIndex++;
- return $this->currentIndex == $this->sequenceIndex;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->currentIndex < $this->sequenceIndex) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'The expected invocation at index %s was never reached.',
- $this->sequenceIndex
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked a certain amount
- * of times.
- * If the number of invocations exceeds the value it will immediately throw an
- * exception,
- * If the number is less it will later be checked in verify() and also throw an
- * exception.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var int
- */
- protected $expectedCount;
- /**
- * @param int $expectedCount
- */
- public function __construct($expectedCount)
- {
- $this->expectedCount = $expectedCount;
- }
- /**
- * @return bool
- */
- public function isNever()
- {
- return $this->expectedCount == 0;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked ' . $this->expectedCount . ' time(s)';
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- parent::invoked($invocation);
- $count = $this->getInvocationCount();
- if ($count > $this->expectedCount) {
- $message = $invocation->toString() . ' ';
- switch ($this->expectedCount) {
- case 0: {
- $message .= 'was not expected to be called.';
- }
- break;
- case 1: {
- $message .= 'was not expected to be called more than once.';
- }
- break;
- default: {
- $message .= sprintf(
- 'was not expected to be called more than %d times.',
- $this->expectedCount
- );
- }
- }
- throw new PHPUnit_Framework_ExpectationFailedException($message);
- }
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count !== $this->expectedCount) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'Method was expected to be called %d times, ' .
- 'actually called %d times.',
- $this->expectedCount,
- $count
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least
- * N times.
- *
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var int
- */
- private $allowedInvocations;
- /**
- * @param int $allowedInvocations
- */
- public function __construct($allowedInvocations)
- {
- $this->allowedInvocations = $allowedInvocations;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at most ' . $this->allowedInvocations . ' times';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count > $this->allowedInvocations) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at most ' . $this->allowedInvocations .
- ' times but it occured ' . $count . ' time(s).'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Records invocations and provides convenience methods for checking them later
- * on.
- * This abstract class can be implemented by matchers which needs to check the
- * number of times an invocation has occured.
- *
- * @since Class available since Release 1.0.0
- * @abstract
- */
- abstract class PHPUnit_Framework_MockObject_Matcher_InvokedRecorder implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var PHPUnit_Framework_MockObject_Invocation[]
- */
- protected $invocations = array();
- /**
- * @return int
- */
- public function getInvocationCount()
- {
- return count($this->invocations);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Invocation[]
- */
- public function getInvocations()
- {
- return $this->invocations;
- }
- /**
- * @return bool
- */
- public function hasBeenInvoked()
- {
- return count($this->invocations) > 0;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->invocations[] = $invocation;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which does not care about previous state from earlier
- * invocations.
- *
- * This abstract class can be implemented by matchers which does not care about
- * state but only the current run-time value of the invocation itself.
- *
- * @since Class available since Release 1.0.0
- * @abstract
- */
- abstract class PHPUnit_Framework_MockObject_Matcher_StatelessInvocation implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * Registers the invocation $invocation in the object as being invoked.
- * This will only occur after matches() returns true which means the
- * current invocation is the correct one.
- *
- * The matcher can store information from the invocation which can later
- * be checked in verify(), or it can check the values directly and throw
- * and exception if an expectation is not met.
- *
- * If the matcher is a stub it will also have a return value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- }
- /**
- * Checks if the invocation $invocation matches the current rules. If it does
- * the matcher will get the invoked() method called which should check if an
- * expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- */
- public function verify()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use Doctrine\Instantiator\Instantiator;
- use Doctrine\Instantiator\Exception\InvalidArgumentException as InstantiatorInvalidArgumentException;
- use Doctrine\Instantiator\Exception\UnexpectedValueException as InstantiatorUnexpectedValueException;
- if (!function_exists('trait_exists')) {
- function trait_exists($traitname, $autoload = true)
- {
- return false;
- }
- }
- /**
- * Mock Object Code Generator
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Generator
- {
- /**
- * @var array
- */
- private static $cache = array();
- /**
- * @var array
- */
- protected $blacklistedMethodNames = array(
- '__CLASS__' => true,
- '__DIR__' => true,
- '__FILE__' => true,
- '__FUNCTION__' => true,
- '__LINE__' => true,
- '__METHOD__' => true,
- '__NAMESPACE__' => true,
- '__TRAIT__' => true,
- '__clone' => true,
- '__halt_compiler' => true,
- 'abstract' => true,
- 'and' => true,
- 'array' => true,
- 'as' => true,
- 'break' => true,
- 'callable' => true,
- 'case' => true,
- 'catch' => true,
- 'class' => true,
- 'clone' => true,
- 'const' => true,
- 'continue' => true,
- 'declare' => true,
- 'default' => true,
- 'die' => true,
- 'do' => true,
- 'echo' => true,
- 'else' => true,
- 'elseif' => true,
- 'empty' => true,
- 'enddeclare' => true,
- 'endfor' => true,
- 'endforeach' => true,
- 'endif' => true,
- 'endswitch' => true,
- 'endwhile' => true,
- 'eval' => true,
- 'exit' => true,
- 'expects' => true,
- 'extends' => true,
- 'final' => true,
- 'for' => true,
- 'foreach' => true,
- 'function' => true,
- 'global' => true,
- 'goto' => true,
- 'if' => true,
- 'implements' => true,
- 'include' => true,
- 'include_once' => true,
- 'instanceof' => true,
- 'insteadof' => true,
- 'interface' => true,
- 'isset' => true,
- 'list' => true,
- 'namespace' => true,
- 'new' => true,
- 'or' => true,
- 'print' => true,
- 'private' => true,
- 'protected' => true,
- 'public' => true,
- 'require' => true,
- 'require_once' => true,
- 'return' => true,
- 'static' => true,
- 'switch' => true,
- 'throw' => true,
- 'trait' => true,
- 'try' => true,
- 'unset' => true,
- 'use' => true,
- 'var' => true,
- 'while' => true,
- 'xor' => true
- );
- /**
- * Returns a mock object for the specified class.
- *
- * @param array|string $type
- * @param array $methods
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param bool $cloneArguments
- * @param bool $callOriginalMethods
- * @param object $proxyTarget
- * @return object
- * @throws InvalidArgumentException
- * @throws PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @since Method available since Release 1.0.0
- */
- public function getMock($type, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = true, $callOriginalMethods = false, $proxyTarget = null)
- {
- if (!is_array($type) && !is_string($type)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'array or string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'string');
- }
- if (!is_array($methods) && !is_null($methods)) {
- throw new InvalidArgumentException;
- }
- if ($type === 'Traversable' || $type === '\\Traversable') {
- $type = 'Iterator';
- }
- if (is_array($type)) {
- $type = array_unique(array_map(
- function ($type) {
- if ($type === 'Traversable' ||
- $type === '\\Traversable' ||
- $type === '\\Iterator') {
- return 'Iterator';
- }
- return $type;
- },
- $type
- ));
- }
- if (null !== $methods) {
- foreach ($methods as $method) {
- if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', $method)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Cannot stub or mock method with invalid name "%s"',
- $method
- )
- );
- }
- }
- if ($methods != array_unique($methods)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Cannot stub or mock using a method list that contains duplicates: "%s"',
- implode(', ', $methods)
- )
- );
- }
- }
- if ($mockClassName != '' && class_exists($mockClassName, false)) {
- $reflect = new ReflectionClass($mockClassName);
- if (!$reflect->implementsInterface('PHPUnit_Framework_MockObject_MockObject')) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Class "%s" already exists.',
- $mockClassName
- )
- );
- }
- }
- $mock = $this->generate(
- $type,
- $methods,
- $mockClassName,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- return $this->getObject(
- $mock['code'],
- $mock['mockClassName'],
- $type,
- $callOriginalConstructor,
- $callAutoload,
- $arguments,
- $callOriginalMethods,
- $proxyTarget
- );
- }
- /**
- * @param string $code
- * @param string $className
- * @param array|string $type
- * @param bool $callOriginalConstructor
- * @param bool $callAutoload
- * @param array $arguments
- * @param bool $callOriginalMethods
- * @param object $proxyTarget
- * @return object
- */
- protected function getObject($code, $className, $type = '', $callOriginalConstructor = false, $callAutoload = false, array $arguments = array(), $callOriginalMethods = false, $proxyTarget = null)
- {
- $this->evalClass($code, $className);
- if ($callOriginalConstructor &&
- is_string($type) &&
- !interface_exists($type, $callAutoload)) {
- if (count($arguments) == 0) {
- $object = new $className;
- } else {
- $class = new ReflectionClass($className);
- $object = $class->newInstanceArgs($arguments);
- }
- } else {
- try {
- $instantiator = new Instantiator;
- $object = $instantiator->instantiate($className);
- } catch (InstantiatorUnexpectedValueException $exception) {
- if ($exception->getPrevious()) {
- $exception = $exception->getPrevious();
- }
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- $exception->getMessage()
- );
- } catch (InstantiatorInvalidArgumentException $exception) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- $exception->getMessage()
- );
- }
- }
- if ($callOriginalMethods) {
- if (!is_object($proxyTarget)) {
- if (count($arguments) == 0) {
- $proxyTarget = new $type;
- } else {
- $class = new ReflectionClass($type);
- $proxyTarget = $class->newInstanceArgs($arguments);
- }
- }
- $object->__phpunit_setOriginalObject($proxyTarget);
- }
- return $object;
- }
- /**
- * @param string $code
- * @param string $className
- */
- protected function evalClass($code, $className)
- {
- if (!class_exists($className, false)) {
- eval($code);
- }
- }
- /**
- * Returns a mock object for the specified abstract class with all abstract
- * methods of the class mocked. Concrete methods to mock can be specified with
- * the last parameter
- *
- * @param string $originalClassName
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param array $mockedMethods
- * @param bool $cloneArguments
- * @return object
- * @since Method available since Release 1.0.0
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = true)
- {
- if (!is_string($originalClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (class_exists($originalClassName, $callAutoload) ||
- interface_exists($originalClassName, $callAutoload)) {
- $reflector = new ReflectionClass($originalClassName);
- $methods = $mockedMethods;
- foreach ($reflector->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
- if (!in_array($method->getName(), $methods)) {
- $methods[] = $method->getName();
- }
- }
- if (empty($methods)) {
- $methods = null;
- }
- return $this->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- } else {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf('Class "%s" does not exist.', $originalClassName)
- );
- }
- }
- /**
- * Returns a mock object for the specified trait with all abstract methods
- * of the trait mocked. Concrete methods to mock can be specified with the
- * `$mockedMethods` parameter.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param array $mockedMethods
- * @param bool $cloneArguments
- * @return object
- * @since Method available since Release 1.2.3
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForTrait($traitName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = true)
- {
- if (!is_string($traitName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (!trait_exists($traitName, $callAutoload)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Trait "%s" does not exist.',
- $traitName
- )
- );
- }
- $className = $this->generateClassName(
- $traitName,
- '',
- 'Trait_'
- );
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'trait_class.tpl'
- );
- $classTemplate->setVar(
- array(
- 'prologue' => 'abstract ',
- 'class_name' => $className['className'],
- 'trait_name' => $traitName
- )
- );
- $this->evalClass(
- $classTemplate->render(),
- $className['className']
- );
- return $this->getMockForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments);
- }
- /**
- * Returns an object for the specified trait.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $traitClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @return object
- * @since Method available since Release 1.1.0
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true)
- {
- if (!is_string($traitName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($traitClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (!trait_exists($traitName, $callAutoload)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Trait "%s" does not exist.',
- $traitName
- )
- );
- }
- $className = $this->generateClassName(
- $traitName,
- $traitClassName,
- 'Trait_'
- );
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'trait_class.tpl'
- );
- $classTemplate->setVar(
- array(
- 'prologue' => '',
- 'class_name' => $className['className'],
- 'trait_name' => $traitName
- )
- );
- return $this->getObject(
- $classTemplate->render(),
- $className['className']
- );
- }
- /**
- * @param array|string $type
- * @param array $methods
- * @param string $mockClassName
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param bool $cloneArguments
- * @param bool $callOriginalMethods
- * @return array
- */
- public function generate($type, array $methods = null, $mockClassName = '', $callOriginalClone = true, $callAutoload = true, $cloneArguments = true, $callOriginalMethods = false)
- {
- if (is_array($type)) {
- sort($type);
- }
- if ($mockClassName == '') {
- $key = md5(
- is_array($type) ? implode('_', $type) : $type .
- serialize($methods) .
- serialize($callOriginalClone) .
- serialize($cloneArguments) .
- serialize($callOriginalMethods)
- );
- if (isset(self::$cache[$key])) {
- return self::$cache[$key];
- }
- }
- $mock = $this->generateMock(
- $type,
- $methods,
- $mockClassName,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- if (isset($key)) {
- self::$cache[$key] = $mock;
- }
- return $mock;
- }
- /**
- * @param string $wsdlFile
- * @param string $className
- * @param array $methods
- * @param array $options
- * @return string
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- */
- public function generateClassFromWsdl($wsdlFile, $className, array $methods = array(), array $options = array())
- {
- if (!extension_loaded('soap')) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- 'The SOAP extension is required to generate a mock object from WSDL.'
- );
- }
- $options = array_merge($options, array('cache_wsdl' => WSDL_CACHE_NONE));
- $client = new SoapClient($wsdlFile, $options);
- $_methods = array_unique($client->__getFunctions());
- unset($client);
- sort($_methods);
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' . DIRECTORY_SEPARATOR;
- $methodTemplate = new Text_Template($templateDir . 'wsdl_method.tpl');
- $methodsBuffer = '';
- foreach ($_methods as $method) {
- $nameStart = strpos($method, ' ') + 1;
- $nameEnd = strpos($method, '(');
- $name = substr($method, $nameStart, $nameEnd - $nameStart);
- if (empty($methods) || in_array($name, $methods)) {
- $args = explode(
- ',',
- substr(
- $method,
- $nameEnd + 1,
- strpos($method, ')') - $nameEnd - 1
- )
- );
- $numArgs = count($args);
- for ($i = 0; $i < $numArgs; $i++) {
- $args[$i] = substr($args[$i], strpos($args[$i], '$'));
- }
- $methodTemplate->setVar(
- array(
- 'method_name' => $name,
- 'arguments' => implode(', ', $args)
- )
- );
- $methodsBuffer .= $methodTemplate->render();
- }
- }
- $optionsBuffer = 'array(';
- foreach ($options as $key => $value) {
- $optionsBuffer .= $key . ' => ' . $value;
- }
- $optionsBuffer .= ')';
- $classTemplate = new Text_Template($templateDir . 'wsdl_class.tpl');
- $namespace = '';
- if (strpos($className, '\\') !== false) {
- $parts = explode('\\', $className);
- $className = array_pop($parts);
- $namespace = 'namespace ' . implode('\\', $parts) . ';' . "\n\n";
- }
- $classTemplate->setVar(
- array(
- 'namespace' => $namespace,
- 'class_name' => $className,
- 'wsdl' => $wsdlFile,
- 'options' => $optionsBuffer,
- 'methods' => $methodsBuffer
- )
- );
- return $classTemplate->render();
- }
- /**
- * @param array|string $type
- * @param array|null $methods
- * @param string $mockClassName
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param bool $cloneArguments
- * @param bool $callOriginalMethods
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- protected function generateMock($type, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods)
- {
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'mocked_class.tpl'
- );
- $additionalInterfaces = array();
- $cloneTemplate = '';
- $isClass = false;
- $isInterface = false;
- $mockClassName = $this->generateClassName(
- $type,
- $mockClassName,
- 'Mock_'
- );
- if (is_array($type)) {
- foreach ($type as $_type) {
- if (!interface_exists($_type, $callAutoload)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Interface "%s" does not exist.',
- $_type
- )
- );
- }
- $additionalInterfaces[] = $_type;
- foreach ($this->getClassMethods($_type) as $method) {
- if (in_array($method, $methods)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Duplicate method "%s" not allowed.',
- $method
- )
- );
- }
- $methods[] = $method;
- }
- }
- }
- if (class_exists($mockClassName['fullClassName'], $callAutoload)) {
- $isClass = true;
- } else {
- if (interface_exists($mockClassName['fullClassName'], $callAutoload)) {
- $isInterface = true;
- }
- }
- if (!class_exists($mockClassName['fullClassName'], $callAutoload) &&
- !interface_exists($mockClassName['fullClassName'], $callAutoload)) {
- $prologue = 'class ' . $mockClassName['originalClassName'] . "\n{\n}\n\n";
- if (!empty($mockClassName['namespaceName'])) {
- $prologue = 'namespace ' . $mockClassName['namespaceName'] .
- " {\n\n" . $prologue . "}\n\n" .
- "namespace {\n\n";
- $epilogue = "\n\n}";
- }
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- } else {
- $class = new ReflectionClass($mockClassName['fullClassName']);
- if ($class->isFinal()) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Class "%s" is declared "final" and cannot be mocked.',
- $mockClassName['fullClassName']
- )
- );
- }
- if ($class->hasMethod('__clone')) {
- $cloneMethod = $class->getMethod('__clone');
- if (!$cloneMethod->isFinal()) {
- if ($callOriginalClone && !$isInterface) {
- $cloneTemplate = new Text_Template(
- $templateDir . 'unmocked_clone.tpl'
- );
- } else {
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- }
- }
- } else {
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- }
- }
- if (is_object($cloneTemplate)) {
- $cloneTemplate = $cloneTemplate->render();
- }
- if (is_array($methods) && empty($methods) &&
- ($isClass || $isInterface)) {
- $methods = $this->getClassMethods($mockClassName['fullClassName']);
- }
- if (!is_array($methods)) {
- $methods = array();
- }
- $mockedMethods = '';
- if (isset($class)) {
- // https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103
- if ($isInterface && $class->implementsInterface('Traversable') &&
- !$class->implementsInterface('Iterator') &&
- !$class->implementsInterface('IteratorAggregate')) {
- $additionalInterfaces[] = 'Iterator';
- $methods = array_merge($methods, $this->getClassMethods('Iterator'));
- }
- foreach ($methods as $methodName) {
- try {
- $method = $class->getMethod($methodName);
- if ($this->canMockMethod($method)) {
- $mockedMethods .= $this->generateMockedMethodDefinitionFromExisting(
- $templateDir,
- $method,
- $cloneArguments,
- $callOriginalMethods
- );
- }
- } catch (ReflectionException $e) {
- $mockedMethods .= $this->generateMockedMethodDefinition(
- $templateDir,
- $mockClassName['fullClassName'],
- $methodName,
- $cloneArguments
- );
- }
- }
- } else {
- foreach ($methods as $methodName) {
- $mockedMethods .= $this->generateMockedMethodDefinition(
- $templateDir,
- $mockClassName['fullClassName'],
- $methodName,
- $cloneArguments
- );
- }
- }
- $method = '';
- if (!in_array('method', $methods)) {
- $methodTemplate = new Text_Template(
- $templateDir . 'mocked_class_method.tpl'
- );
- $method = $methodTemplate->render();
- }
- $classTemplate->setVar(
- array(
- 'prologue' => isset($prologue) ? $prologue : '',
- 'epilogue' => isset($epilogue) ? $epilogue : '',
- 'class_declaration' => $this->generateMockClassDeclaration(
- $mockClassName,
- $isInterface,
- $additionalInterfaces
- ),
- 'clone' => $cloneTemplate,
- 'mock_class_name' => $mockClassName['className'],
- 'mocked_methods' => $mockedMethods,
- 'method' => $method
- )
- );
- return array(
- 'code' => $classTemplate->render(),
- 'mockClassName' => $mockClassName['className']
- );
- }
- /**
- * @param array|string $type
- * @param string $className
- * @param string $prefix
- * @return array
- */
- protected function generateClassName($type, $className, $prefix)
- {
- if (is_array($type)) {
- $type = implode('_', $type);
- }
- if ($type[0] == '\\') {
- $type = substr($type, 1);
- }
- $classNameParts = explode('\\', $type);
- if (count($classNameParts) > 1) {
- $type = array_pop($classNameParts);
- $namespaceName = implode('\\', $classNameParts);
- $fullClassName = $namespaceName . '\\' . $type;
- } else {
- $namespaceName = '';
- $fullClassName = $type;
- }
- if ($className == '') {
- do {
- $className = $prefix . $type . '_' .
- substr(md5(microtime()), 0, 8);
- } while (class_exists($className, false));
- }
- return array(
- 'className' => $className,
- 'originalClassName' => $type,
- 'fullClassName' => $fullClassName,
- 'namespaceName' => $namespaceName
- );
- }
- /**
- * @param array $mockClassName
- * @param bool $isInterface
- * @param array $additionalInterfaces
- * @return array
- */
- protected function generateMockClassDeclaration(array $mockClassName, $isInterface, array $additionalInterfaces = array())
- {
- $buffer = 'class ';
- $additionalInterfaces[] = 'PHPUnit_Framework_MockObject_MockObject';
- $interfaces = implode(', ', $additionalInterfaces);
- if ($isInterface) {
- $buffer .= sprintf(
- '%s implements %s',
- $mockClassName['className'],
- $interfaces
- );
- if (!in_array($mockClassName['originalClassName'], $additionalInterfaces)) {
- $buffer .= ', ';
- if (!empty($mockClassName['namespaceName'])) {
- $buffer .= $mockClassName['namespaceName'] . '\\';
- }
- $buffer .= $mockClassName['originalClassName'];
- }
- } else {
- $buffer .= sprintf(
- '%s extends %s%s implements %s',
- $mockClassName['className'],
- !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '',
- $mockClassName['originalClassName'],
- $interfaces
- );
- }
- return $buffer;
- }
- /**
- * @param string $templateDir
- * @param ReflectionMethod $method
- * @param bool $cloneArguments
- * @param bool $callOriginalMethods
- * @return string
- */
- protected function generateMockedMethodDefinitionFromExisting($templateDir, ReflectionMethod $method, $cloneArguments, $callOriginalMethods)
- {
- if ($method->isPrivate()) {
- $modifier = 'private';
- } elseif ($method->isProtected()) {
- $modifier = 'protected';
- } else {
- $modifier = 'public';
- }
- if ($method->isStatic()) {
- $modifier .= ' static';
- }
- if ($method->returnsReference()) {
- $reference = '&';
- } else {
- $reference = '';
- }
- return $this->generateMockedMethodDefinition(
- $templateDir,
- $method->getDeclaringClass()->getName(),
- $method->getName(),
- $cloneArguments,
- $modifier,
- $this->getMethodParameters($method),
- $this->getMethodParameters($method, true),
- $reference,
- $callOriginalMethods,
- $method->isStatic()
- );
- }
- /**
- * @param string $templateDir
- * @param string $className
- * @param string $methodName
- * @param bool $cloneArguments
- * @param string $modifier
- * @param string $arguments_decl
- * @param string $arguments_call
- * @param string $reference
- * @param bool $callOriginalMethods
- * @param bool $static
- * @return string
- */
- protected function generateMockedMethodDefinition($templateDir, $className, $methodName, $cloneArguments = true, $modifier = 'public', $arguments_decl = '', $arguments_call = '', $reference = '', $callOriginalMethods = false, $static = false)
- {
- if ($static) {
- $templateFile = 'mocked_static_method.tpl';
- } else {
- $templateFile = sprintf(
- '%s_method.tpl',
- $callOriginalMethods ? 'proxied' : 'mocked'
- );
- }
- $template = new Text_Template($templateDir . $templateFile);
- $template->setVar(
- array(
- 'arguments_decl' => $arguments_decl,
- 'arguments_call' => $arguments_call,
- 'arguments_count' => !empty($arguments_call) ? count(explode(',', $arguments_call)) : 0,
- 'class_name' => $className,
- 'method_name' => $methodName,
- 'modifier' => $modifier,
- 'reference' => $reference,
- 'clone_arguments' => $cloneArguments ? 'TRUE' : 'FALSE'
- )
- );
- return $template->render();
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- */
- protected function canMockMethod(ReflectionMethod $method)
- {
- if ($method->isConstructor() ||
- $method->isFinal() ||
- $method->isPrivate() ||
- isset($this->blacklistedMethodNames[$method->getName()])) {
- return false;
- }
- return true;
- }
- /**
- * Returns the parameters of a function or method.
- *
- * @param ReflectionMethod $method
- * @param bool $forCall
- * @return string
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @since Method available since Release 2.0.0
- */
- protected function getMethodParameters(ReflectionMethod $method, $forCall = false)
- {
- $parameters = array();
- foreach ($method->getParameters() as $i => $parameter) {
- $name = '$' . $parameter->getName();
- /* Note: PHP extensions may use empty names for reference arguments
- * or "..." for methods taking a variable number of arguments.
- */
- if ($name === '$' || $name === '$...') {
- $name = '$arg' . $i;
- }
- if ($this->isVariadic($parameter)) {
- if ($forCall) {
- continue;
- } else {
- $name = '...' . $name;
- }
- }
- $default = '';
- $reference = '';
- $typeDeclaration = '';
- if (!$forCall) {
- if ($this->hasType($parameter)) {
- $typeDeclaration = (string) $parameter->getType() . ' ';
- } elseif ($parameter->isArray()) {
- $typeDeclaration = 'array ';
- } elseif ((defined('HHVM_VERSION') || version_compare(PHP_VERSION, '5.4.0', '>='))
- && $parameter->isCallable()) {
- $typeDeclaration = 'callable ';
- } else {
- try {
- $class = $parameter->getClass();
- } catch (ReflectionException $e) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Cannot mock %s::%s() because a class or ' .
- 'interface used in the signature is not loaded',
- $method->getDeclaringClass()->getName(),
- $method->getName()
- ),
- 0,
- $e
- );
- }
- if ($class !== null) {
- $typeDeclaration = $class->getName() . ' ';
- }
- }
- if (!$this->isVariadic($parameter)) {
- if ($parameter->isDefaultValueAvailable()) {
- $value = $parameter->getDefaultValue();
- $default = ' = ' . var_export($value, true);
- } elseif ($parameter->isOptional()) {
- $default = ' = null';
- }
- }
- }
- if ($parameter->isPassedByReference()) {
- $reference = '&';
- }
- $parameters[] = $typeDeclaration . $reference . $name . $default;
- }
- return implode(', ', $parameters);
- }
- /**
- * @param ReflectionParameter $parameter
- * @return bool
- * @since Method available since Release 2.2.1
- */
- private function isVariadic(ReflectionParameter $parameter)
- {
- return method_exists('ReflectionParameter', 'isVariadic') && $parameter->isVariadic();
- }
- /**
- * @param ReflectionParameter $parameter
- * @return bool
- * @since Method available since Release 2.3.4
- */
- private function hasType(ReflectionParameter $parameter)
- {
- return method_exists('ReflectionParameter', 'hasType') && $parameter->hasType();
- }
- /**
- * @param string $className
- * @return array
- * @since Method available since Release 2.3.2
- */
- private function getClassMethods($className)
- {
- $class = new ReflectionClass($className);
- $methods = array();
- foreach ($class->getMethods() as $method) {
- if ($method->isPublic() || $method->isAbstract()) {
- $methods[] = $method->getName();
- }
- }
- return $methods;
- }
- }
- public function {method_name}({arguments})
- {
- }
- public function __clone()
- {
- $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
- parent::__clone();
- }
- {prologue}{class_declaration}
- {
- private $__phpunit_invocationMocker;
- private $__phpunit_originalObject;
- {clone}{mocked_methods}
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- return $this->__phpunit_getInvocationMocker()->expects($matcher);
- }
- {method}
- public function __phpunit_setOriginalObject($originalObject)
- {
- $this->__phpunit_originalObject = $originalObject;
- }
- public function __phpunit_getInvocationMocker()
- {
- if ($this->__phpunit_invocationMocker === NULL) {
- $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
- }
- return $this->__phpunit_invocationMocker;
- }
- public function __phpunit_hasMatchers()
- {
- return $this->__phpunit_getInvocationMocker()->hasMatchers();
- }
- public function __phpunit_verify()
- {
- $this->__phpunit_getInvocationMocker()->verify();
- $this->__phpunit_invocationMocker = NULL;
- }
- }{epilogue}
- public function __clone()
- {
- $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- $arguments = array({arguments_call});
- $count = func_num_args();
- if ($count > {arguments_count}) {
- $_arguments = func_get_args();
- for ($i = {arguments_count}; $i < $count; $i++) {
- $arguments[] = $_arguments[$i];
- }
- }
- $this->__phpunit_getInvocationMocker()->invoke(
- new PHPUnit_Framework_MockObject_Invocation_Object(
- '{class_name}', '{method_name}', $arguments, $this, {clone_arguments}
- )
- );
- return call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $arguments);
- }
- {namespace}class {class_name} extends \SoapClient
- {
- public function __construct($wsdl, array $options)
- {
- parent::__construct('{wsdl}', $options);
- }
- {methods}}
- {prologue}class {class_name}
- {
- use {trait_name};
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- $arguments = array({arguments_call});
- $count = func_num_args();
- if ($count > {arguments_count}) {
- $_arguments = func_get_args();
- for ($i = {arguments_count}; $i < $count; $i++) {
- $arguments[] = $_arguments[$i];
- }
- }
- $result = $this->__phpunit_getInvocationMocker()->invoke(
- new PHPUnit_Framework_MockObject_Invocation_Object(
- '{class_name}', '{method_name}', $arguments, $this, {clone_arguments}
- )
- );
- return $result;
- }
- public function method()
- {
- $any = new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount;
- $expects = $this->expects($any);
- return call_user_func_array(array($expects, 'method'), func_get_args());
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- throw new PHPUnit_Framework_MockObject_BadMethodCallException;
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for invocation order matches.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Match extends PHPUnit_Framework_MockObject_Builder_Stub
- {
- /**
- * Defines the expectation which must occur before the current is valid.
- *
- * @param string $id The identification of the expectation that should
- * occur before this one.
- * @return PHPUnit_Framework_MockObject_Builder_Stub
- */
- public function after($id);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for unique identifiers.
- *
- * Defines the interface for recording unique identifiers. The identifiers
- * can be used to define the invocation order of expectations. The expectation
- * is recorded using id() and then defined in order using
- * PHPUnit_Framework_MockObject_Builder_Match::after().
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Identity
- {
- /**
- * Sets the identification of the expectation to $id.
- *
- * @note The identifier is unique per mock object.
- * @param string $id Unique identifiation of expectation.
- */
- public function id($id);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder for mocked or stubbed invocations.
- *
- * Provides methods for building expectations without having to resort to
- * instantiating the various matchers manually. These methods also form a
- * more natural way of reading the expectation. This class should be together
- * with the test case PHPUnit_Framework_MockObject_TestCase.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Builder_InvocationMocker implements PHPUnit_Framework_MockObject_Builder_MethodNameMatch
- {
- /**
- * @var PHPUnit_Framework_MockObject_Stub_MatcherCollection
- */
- protected $collection;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher
- */
- protected $matcher;
- /**
- * @param PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
- */
- public function __construct(PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection, PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
- {
- $this->collection = $collection;
- $this->matcher = new PHPUnit_Framework_MockObject_Matcher(
- $invocationMatcher
- );
- $this->collection->addMatcher($this->matcher);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Matcher
- */
- public function getMatcher()
- {
- return $this->matcher;
- }
- /**
- * @param mixed $id
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function id($id)
- {
- $this->collection->registerId($id, $this);
- return $this;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Stub $stub
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function will(PHPUnit_Framework_MockObject_Stub $stub)
- {
- $this->matcher->stub = $stub;
- return $this;
- }
- /**
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturn($value)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_Return(
- $value
- );
- return $this->will($stub);
- }
- /**
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnMap(array $valueMap)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnValueMap(
- $valueMap
- );
- return $this->will($stub);
- }
- /**
- * @param mixed $argumentIndex
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnArgument($argumentIndex)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnArgument(
- $argumentIndex
- );
- return $this->will($stub);
- }
- /**
- * @param callable $callback
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnCallback($callback)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnCallback(
- $callback
- );
- return $this->will($stub);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnSelf()
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnSelf();
- return $this->will($stub);
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnOnConsecutiveCalls()
- {
- $args = func_get_args();
- $stub = new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args);
- return $this->will($stub);
- }
- /**
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willThrowException(Exception $exception)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_Exception($exception);
- return $this->will($stub);
- }
- /**
- * @param mixed $id
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function after($id)
- {
- $this->matcher->afterMatchBuilderId = $id;
- return $this;
- }
- /**
- * Validate that a parameters matcher can be defined, throw exceptions otherwise.
- *
- * @throws PHPUnit_Framework_Exception
- */
- private function canDefineParameters()
- {
- if ($this->matcher->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'Method name matcher is not defined, cannot define parameter ' .
- ' matcher without one'
- );
- }
- if ($this->matcher->parametersMatcher !== null) {
- throw new PHPUnit_Framework_Exception(
- 'Parameter matcher is already defined, cannot redefine'
- );
- }
- }
- /**
- * @param mixed $argument, ...
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function with()
- {
- $args = func_get_args();
- $this->canDefineParameters();
- $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_Parameters($args);
- return $this;
- }
- /**
- * @param mixed ...$argument
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function withConsecutive()
- {
- $args = func_get_args();
- $this->canDefineParameters();
- $this->matcher->parametersMatcher =
- new PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters($args);
- return $this;
- }
- /**
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function withAnyParameters()
- {
- $this->canDefineParameters();
- $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
- return $this;
- }
- /**
- * @param PHPUnit_Framework_Constraint|string $constraint
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function method($constraint)
- {
- if ($this->matcher->methodNameMatcher !== null) {
- throw new PHPUnit_Framework_Exception(
- 'Method name matcher is already defined, cannot redefine'
- );
- }
- $this->matcher->methodNameMatcher = new PHPUnit_Framework_MockObject_Matcher_MethodName($constraint);
- return $this;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for parameter matchers.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_ParametersMatch extends PHPUnit_Framework_MockObject_Builder_Match
- {
- /**
- * Sets the parameters to match for, each parameter to this funtion will
- * be part of match. To perform specific matches or constraints create a
- * new PHPUnit_Framework_Constraint and use it for the parameter.
- * If the parameter value is not a constraint it will use the
- * PHPUnit_Framework_Constraint_IsEqual for the value.
- *
- * Some examples:
- * <code>
- * // match first parameter with value 2
- * $b->with(2);
- * // match first parameter with value 'smock' and second identical to 42
- * $b->with('smock', new PHPUnit_Framework_Constraint_IsEqual(42));
- * </code>
- *
- * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
- */
- public function with();
- /**
- * Sets a matcher which allows any kind of parameters.
- *
- * Some examples:
- * <code>
- * // match any number of parameters
- * $b->withAnyParamers();
- * </code>
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyParameters
- */
- public function withAnyParameters();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for builders which can register builders with a given identification.
- *
- * This interface relates to PHPUnit_Framework_MockObject_Builder_Identity.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Namespace
- {
- /**
- * Looks up the match builder with identification $id and returns it.
- *
- * @param string $id The identifiction of the match builder.
- * @return PHPUnit_Framework_MockObject_Builder_Match
- */
- public function lookupId($id);
- /**
- * Registers the match builder $builder with the identification $id. The
- * builder can later be looked up using lookupId() to figure out if it
- * has been invoked.
- *
- * @param string $id
- * The identification of the match builder.
- * @param PHPUnit_Framework_MockObject_Builder_Match $builder
- * The builder which is being registered.
- */
- public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for matcher of method names.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_MethodNameMatch extends PHPUnit_Framework_MockObject_Builder_ParametersMatch
- {
- /**
- * Adds a new method name match and returns the parameter match object for
- * further matching possibilities.
- *
- * @param PHPUnit_Framework_Constraint $name
- * Constraint for matching method, if a string is passed it will use
- * the PHPUnit_Framework_Constraint_IsEqual.
- * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
- */
- public function method($name);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for stubs which are actions replacing an invocation.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Stub extends PHPUnit_Framework_MockObject_Builder_Identity
- {
- /**
- * Stubs the matching method with the stub object $stub. Any invocations of
- * the matched method will now be handled by the stub instead.
- *
- * @param PHPUnit_Framework_MockObject_Stub $stub The stub object.
- * @return PHPUnit_Framework_MockObject_Builder_Identity
- */
- public function will(PHPUnit_Framework_MockObject_Stub $stub);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a non-static invocation.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Invocation_Object extends PHPUnit_Framework_MockObject_Invocation_Static
- {
- /**
- * @var object
- */
- public $object;
- /**
- * @param string $className
- * @param string $methodname
- * @param array $parameters
- * @param object $object
- * @param object $cloneObjects
- */
- public function __construct($className, $methodName, array $parameters, $object, $cloneObjects = false)
- {
- parent::__construct($className, $methodName, $parameters, $cloneObjects);
- $this->object = $object;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Represents a static invocation.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Invocation_Static implements PHPUnit_Framework_MockObject_Invocation, PHPUnit_Framework_SelfDescribing
- {
- /**
- * @var array
- */
- protected static $uncloneableExtensions = array(
- 'mysqli' => true,
- 'SQLite' => true,
- 'sqlite3' => true,
- 'tidy' => true,
- 'xmlwriter' => true,
- 'xsl' => true
- );
- /**
- * @var array
- */
- protected static $uncloneableClasses = array(
- 'Closure',
- 'COMPersistHelper',
- 'IteratorIterator',
- 'RecursiveIteratorIterator',
- 'SplFileObject',
- 'PDORow',
- 'ZipArchive'
- );
- /**
- * @var string
- */
- public $className;
- /**
- * @var string
- */
- public $methodName;
- /**
- * @var array
- */
- public $parameters;
- /**
- * @param string $className
- * @param string $methodname
- * @param array $parameters
- * @param bool $cloneObjects
- */
- public function __construct($className, $methodName, array $parameters, $cloneObjects = false)
- {
- $this->className = $className;
- $this->methodName = $methodName;
- $this->parameters = $parameters;
- if (!$cloneObjects) {
- return;
- }
- foreach ($this->parameters as $key => $value) {
- if (is_object($value)) {
- $this->parameters[$key] = $this->cloneObject($value);
- }
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $exporter = new Exporter;
- return sprintf(
- '%s::%s(%s)',
- $this->className,
- $this->methodName,
- implode(
- ', ',
- array_map(
- array($exporter, 'shortenedExport'),
- $this->parameters
- )
- )
- );
- }
- /**
- * @param object $original
- * @return object
- */
- protected function cloneObject($original)
- {
- $cloneable = null;
- $object = new ReflectionObject($original);
- // Check the blacklist before asking PHP reflection to work around
- // https://bugs.php.net/bug.php?id=53967
- if ($object->isInternal() &&
- isset(self::$uncloneableExtensions[$object->getExtensionName()])) {
- $cloneable = false;
- }
- if ($cloneable === null) {
- foreach (self::$uncloneableClasses as $class) {
- if ($original instanceof $class) {
- $cloneable = false;
- break;
- }
- }
- }
- if ($cloneable === null && method_exists($object, 'isCloneable')) {
- $cloneable = $object->isCloneable();
- }
- if ($cloneable === null && $object->hasMethod('__clone')) {
- $method = $object->getMethod('__clone');
- $cloneable = $method->isPublic();
- }
- if ($cloneable === null) {
- $cloneable = true;
- }
- if ($cloneable) {
- try {
- return clone $original;
- } catch (Exception $e) {
- return $original;
- }
- } else {
- return $original;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An object that stubs the process of a normal method for a mock object.
- *
- * The stub object will replace the code for the stubbed method and return a
- * specific value instead of the original value.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Stub extends PHPUnit_Framework_SelfDescribing
- {
- /**
- * Fakes the processing of the invocation $invocation by returning a
- * specific value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation which was mocked and matched by the current method
- * and argument matchers.
- * @return mixed
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by raising a user-defined exception.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_Exception implements PHPUnit_Framework_MockObject_Stub
- {
- protected $exception;
- public function __construct(Exception $exception)
- {
- $this->exception = $exception;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- throw $this->exception;
- }
- public function toString()
- {
- return sprintf(
- 'raise user-specified exception %s',
- PHPUnit_Util_Type::export($this->exception)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined value.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_Return implements PHPUnit_Framework_MockObject_Stub
- {
- protected $value;
- public function __construct($value)
- {
- $this->value = $value;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return $this->value;
- }
- public function toString()
- {
- return sprintf(
- 'return user-specified value %s',
- PHPUnit_Util_Type::export($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning the current object.
- *
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnSelf implements PHPUnit_Framework_MockObject_Stub
- {
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if (!$invocation instanceof PHPUnit_Framework_MockObject_Invocation_Object) {
- throw new PHPUnit_Framework_Exception(
- 'The current object can only be returned when mocking an ' .
- 'object, not a static class.'
- );
- }
- return $invocation->object;
- }
- public function toString()
- {
- return 'return the current object';
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a value from a map.
- *
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnValueMap implements PHPUnit_Framework_MockObject_Stub
- {
- protected $valueMap;
- public function __construct(array $valueMap)
- {
- $this->valueMap = $valueMap;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $parameterCount = count($invocation->parameters);
- foreach ($this->valueMap as $map) {
- if (!is_array($map) || $parameterCount != count($map) - 1) {
- continue;
- }
- $return = array_pop($map);
- if ($invocation->parameters === $map) {
- return $return;
- }
- }
- return;
- }
- public function toString()
- {
- return 'return value from a map';
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined stack of values.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls implements PHPUnit_Framework_MockObject_Stub
- {
- protected $stack;
- protected $value;
- public function __construct($stack)
- {
- $this->stack = $stack;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->value = array_shift($this->stack);
- if ($this->value instanceof PHPUnit_Framework_MockObject_Stub) {
- $this->value = $this->value->invoke($invocation);
- }
- return $this->value;
- }
- public function toString()
- {
- return sprintf(
- 'return user-specified value %s',
- PHPUnit_Util_Type::export($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined value.
- *
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Stub_MatcherCollection
- {
- /**
- * Adds a new matcher to the collection which can be used as an expectation
- * or a stub.
- *
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * Matcher for invocations to mock objects.
- */
- public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnCallback implements PHPUnit_Framework_MockObject_Stub
- {
- protected $callback;
- public function __construct($callback)
- {
- $this->callback = $callback;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return call_user_func_array($this->callback, $invocation->parameters);
- }
- public function toString()
- {
- if (is_array($this->callback)) {
- if (is_object($this->callback[0])) {
- $class = get_class($this->callback[0]);
- $type = '->';
- } else {
- $class = $this->callback[0];
- $type = '::';
- }
- return sprintf(
- 'return result of user defined callback %s%s%s() with the ' .
- 'passed arguments',
- $class,
- $type,
- $this->callback[1]
- );
- } else {
- return 'return result of user defined callback ' . $this->callback .
- ' with the passed arguments';
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning an argument that was passed to the mocked method.
- *
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnArgument extends PHPUnit_Framework_MockObject_Stub_Return
- {
- protected $argumentIndex;
- public function __construct($argumentIndex)
- {
- $this->argumentIndex = $argumentIndex;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if (isset($invocation->parameters[$this->argumentIndex])) {
- return $invocation->parameters[$this->argumentIndex];
- } else {
- return;
- }
- }
- public function toString()
- {
- return sprintf('return argument #%d', $this->argumentIndex);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Marker interface for PHPUnit exceptions.
- *
- * @since Interface available since Release 4.0.0
- */
- interface PHPUnit_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Test can be run and collect its results.
- *
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_Test extends Countable
- {
- /**
- * Runs a test and collects its result in a TestResult instance.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for all PHPUnit Framework exceptions.
- *
- * Ensures that exceptions thrown during a test run do not leave stray
- * references behind.
- *
- * Every Exception contains a stack trace. Each stack frame contains the 'args'
- * of the called function. The function arguments can contain references to
- * instantiated objects. The references prevent the objects from being
- * destructed (until test results are eventually printed), so memory cannot be
- * freed up.
- *
- * With enabled process isolation, test results are serialized in the child
- * process and unserialized in the parent process. The stack trace of Exceptions
- * may contain objects that cannot be serialized or unserialized (e.g., PDO
- * connections). Unserializing user-space objects from the child process into
- * the parent would break the intended encapsulation of process isolation.
- *
- * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions
- *
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Exception extends RuntimeException implements PHPUnit_Exception
- {
- /**
- * @var array
- */
- protected $serializableTrace;
- public function __construct($message = '', $code = 0, Exception $previous = null)
- {
- parent::__construct($message, $code, $previous);
- $this->serializableTrace = $this->getTrace();
- foreach ($this->serializableTrace as $i => $call) {
- unset($this->serializableTrace[$i]['args']);
- }
- }
- /**
- * Returns the serializable trace (without 'args').
- *
- * @return array
- */
- public function getSerializableTrace()
- {
- return $this->serializableTrace;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $string = PHPUnit_Framework_TestFailure::exceptionToString($this);
- if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) {
- $string .= "\n" . $trace;
- }
- return $string;
- }
- public function __sleep()
- {
- return array_keys(get_object_vars($this));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test that printed output.
- *
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A set of assert methods.
- *
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Framework_Assert
- {
- /**
- * @var int
- */
- private static $count = 0;
- /**
- * Asserts that an array has a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertArrayHasKey($key, $array, $message = '')
- {
- if (!(is_integer($key) || is_string($key))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'integer or string'
- );
- }
- if (!(is_array($array) || $array instanceof ArrayAccess)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_ArrayHasKey($key);
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that an array has a specified subset.
- *
- * @param array|ArrayAccess $subset
- * @param array|ArrayAccess $array
- * @param bool $strict Check for object identity
- * @param string $message
- * @since Method available since Release 4.4.0
- */
- public static function assertArraySubset($subset, $array, $strict = false, $message = '')
- {
- if (!is_array($subset)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'array or ArrayAccess'
- );
- }
- if (!is_array($array)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_ArraySubset($subset, $strict);
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that an array does not have a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertArrayNotHasKey($key, $array, $message = '')
- {
- if (!(is_integer($key) || is_string($key))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'integer or string'
- );
- }
- if (!(is_array($array) || $array instanceof ArrayAccess)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ArrayHasKey($key)
- );
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that a haystack contains a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- public static function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- if (is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable) {
- $constraint = new PHPUnit_Framework_Constraint_TraversableContains(
- $needle,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- } elseif (is_string($haystack)) {
- $constraint = new PHPUnit_Framework_Constraint_StringContains(
- $needle,
- $ignoreCase
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array, traversable or string'
- );
- }
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- self::assertContains(
- $needle,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message,
- $ignoreCase,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- }
- /**
- * Asserts that a haystack does not contain a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- public static function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- if (is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable) {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_TraversableContains(
- $needle,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- )
- );
- } elseif (is_string($haystack)) {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringContains(
- $needle,
- $ignoreCase
- )
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array, traversable or string'
- );
- }
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- self::assertNotContains(
- $needle,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message,
- $ignoreCase,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- }
- /**
- * Asserts that a haystack contains only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- if ($isNativeType == null) {
- $isNativeType = PHPUnit_Util_Type::isType($type);
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $type,
- $isNativeType
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack contains only instances of a given classname
- *
- * @param string $classname
- * @param array|Traversable $haystack
- * @param string $message
- */
- public static function assertContainsOnlyInstancesOf($classname, $haystack, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $classname,
- false
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains only values of a given type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- self::assertContainsOnly(
- $type,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $isNativeType,
- $message
- );
- }
- /**
- * Asserts that a haystack does not contain only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- if ($isNativeType == null) {
- $isNativeType = PHPUnit_Util_Type::isType($type);
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $type,
- $isNativeType
- )
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain only values of a given
- * type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- self::assertNotContainsOnly(
- $type,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $isNativeType,
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param int $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- public static function assertCount($expectedCount, $haystack, $message = '')
- {
- if (!is_int($expectedCount)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- if (!$haystack instanceof Countable &&
- !$haystack instanceof Traversable &&
- !is_array($haystack)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_Count($expectedCount),
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param int $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertCount(
- $expectedCount,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param int $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- public static function assertNotCount($expectedCount, $haystack, $message = '')
- {
- if (!is_int($expectedCount)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- if (!$haystack instanceof Countable &&
- !$haystack instanceof Traversable &&
- !is_array($haystack)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_Count($expectedCount)
- );
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param int $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertNotCount(
- $expectedCount,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that two variables are equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- public static function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $expected,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a variable is equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- public static function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- self::assertEquals(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that two variables are not equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 2.3.0
- */
- public static function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsEqual(
- $expected,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- )
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a variable is not equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- public static function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- self::assertNotEquals(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that a variable is empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertEmpty($actual, $message = '')
- {
- self::assertThat($actual, self::isEmpty(), $message);
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertEmpty(
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotEmpty($actual, $message = '')
- {
- self::assertThat($actual, self::logicalNot(self::isEmpty()), $message);
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is not empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertNotEmpty(
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is greater than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertGreaterThan($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::greaterThan($expected), $message);
- }
- /**
- * Asserts that an attribute is greater than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertGreaterThan(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertGreaterThanOrEqual($expected, $actual, $message = '')
- {
- self::assertThat(
- $actual,
- self::greaterThanOrEqual($expected),
- $message
- );
- }
- /**
- * Asserts that an attribute is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertGreaterThanOrEqual(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is smaller than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertLessThan($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::lessThan($expected), $message);
- }
- /**
- * Asserts that an attribute is smaller than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertLessThan(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertLessThanOrEqual($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::lessThanOrEqual($expected), $message);
- }
- /**
- * Asserts that an attribute is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertLessThanOrEqual(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that the contents of one file is equal to the contents of another
- * file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.2.14
- */
- public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expected, $message);
- self::assertFileExists($actual, $message);
- self::assertEquals(
- file_get_contents($expected),
- file_get_contents($actual),
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of one file is not equal to the contents of
- * another file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.2.14
- */
- public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expected, $message);
- self::assertFileExists($actual, $message);
- self::assertNotEquals(
- file_get_contents($expected),
- file_get_contents($actual),
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of a string is equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.3.0
- */
- public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expectedFile, $message);
- self::assertEquals(
- file_get_contents($expectedFile),
- $actualString,
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of a string is not equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.3.0
- */
- public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expectedFile, $message);
- self::assertNotEquals(
- file_get_contents($expectedFile),
- $actualString,
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that a file exists.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertFileExists($filename, $message = '')
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_FileExists;
- self::assertThat($filename, $constraint, $message);
- }
- /**
- * Asserts that a file does not exist.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertFileNotExists($filename, $message = '')
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_FileExists
- );
- self::assertThat($filename, $constraint, $message);
- }
- /**
- * Asserts that a condition is true.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertTrue($condition, $message = '')
- {
- self::assertThat($condition, self::isTrue(), $message);
- }
- /**
- * Asserts that a condition is not true.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotTrue($condition, $message = '')
- {
- self::assertThat($condition, self::logicalNot(self::isTrue()), $message);
- }
- /**
- * Asserts that a condition is false.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertFalse($condition, $message = '')
- {
- self::assertThat($condition, self::isFalse(), $message);
- }
- /**
- * Asserts that a condition is not false.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotFalse($condition, $message = '')
- {
- self::assertThat($condition, self::logicalNot(self::isFalse()), $message);
- }
- /**
- * Asserts that a variable is not null.
- *
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNotNull($actual, $message = '')
- {
- self::assertThat($actual, self::logicalNot(self::isNull()), $message);
- }
- /**
- * Asserts that a variable is null.
- *
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNull($actual, $message = '')
- {
- self::assertThat($actual, self::isNull(), $message);
- }
- /**
- * Asserts that a class has a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassHasAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_ClassHasAttribute(
- $attributeName
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class does not have a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassNotHasAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ClassHasAttribute($attributeName)
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class has a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassHasStaticAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class does not have a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- )
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that an object has a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertObjectHasAttribute($attributeName, $object, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
- }
- $constraint = new PHPUnit_Framework_Constraint_ObjectHasAttribute(
- $attributeName
- );
- self::assertThat($object, $constraint, $message);
- }
- /**
- * Asserts that an object does not have a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertObjectNotHasAttribute($attributeName, $object, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ObjectHasAttribute($attributeName)
- );
- self::assertThat($object, $constraint, $message);
- }
- /**
- * Asserts that two variables have the same type and value.
- * Used on objects, it asserts that two variables reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- public static function assertSame($expected, $actual, $message = '')
- {
- if (is_bool($expected) && is_bool($actual)) {
- self::assertEquals($expected, $actual, $message);
- } else {
- $constraint = new PHPUnit_Framework_Constraint_IsIdentical(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- }
- /**
- * Asserts that a variable and an attribute of an object have the same type
- * and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertSame(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that two variables do not have the same type and value.
- * Used on objects, it asserts that two variables do not reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNotSame($expected, $actual, $message = '')
- {
- if (is_bool($expected) && is_bool($actual)) {
- self::assertNotEquals($expected, $actual, $message);
- } else {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsIdentical($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- }
- /**
- * Asserts that a variable and an attribute of an object do not have the
- * same type and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertNotSame(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertInstanceOf($expected, $actual, $message = '')
- {
- if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertInstanceOf(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertNotInstanceOf($expected, $actual, $message = '')
- {
- if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsInstanceOf($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertNotInstanceOf(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertInternalType($expected, $actual, $message = '')
- {
- if (!is_string($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsType(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertInternalType(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertNotInternalType($expected, $actual, $message = '')
- {
- if (!is_string($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsType($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertNotInternalType(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a string matches a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- */
- public static function assertRegExp($pattern, $string, $message = '')
- {
- if (!is_string($pattern)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_PCREMatch($pattern);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- * @since Method available since Release 2.1.0
- */
- public static function assertNotRegExp($pattern, $string, $message = '')
- {
- if (!is_string($pattern)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_PCREMatch($pattern)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- public static function assertSameSize($expected, $actual, $message = '')
- {
- if (!$expected instanceof Countable &&
- !$expected instanceof Traversable &&
- !is_array($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable');
- }
- if (!$actual instanceof Countable &&
- !$actual instanceof Traversable &&
- !is_array($actual)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- self::assertThat(
- $actual,
- new PHPUnit_Framework_Constraint_SameSize($expected),
- $message
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is not the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- public static function assertNotSameSize($expected, $actual, $message = '')
- {
- if (!$expected instanceof Countable &&
- !$expected instanceof Traversable &&
- !is_array($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable');
- }
- if (!$actual instanceof Countable &&
- !$actual instanceof Traversable &&
- !is_array($actual)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_SameSize($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a string matches a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringMatchesFormat($format, $string, $message = '')
- {
- if (!is_string($format)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringMatches($format);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringNotMatchesFormat($format, $string, $message = '')
- {
- if (!is_string($format)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringMatches($format)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string matches a given format file.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringMatchesFormatFile($formatFile, $string, $message = '')
- {
- self::assertFileExists($formatFile, $message);
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringMatches(
- file_get_contents($formatFile)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
- {
- self::assertFileExists($formatFile, $message);
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringMatches(
- file_get_contents($formatFile)
- )
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string starts with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringStartsWith($prefix, $string, $message = '')
- {
- if (!is_string($prefix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringStartsWith(
- $prefix
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string starts not with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringStartsNotWith($prefix, $string, $message = '')
- {
- if (!is_string($prefix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringStartsWith($prefix)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string ends with a given suffix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringEndsWith($suffix, $string, $message = '')
- {
- if (!is_string($suffix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string ends not with a given suffix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringEndsNotWith($suffix, $string, $message = '')
- {
- if (!is_string($suffix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringEndsWith($suffix)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that two XML files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile);
- self::assertFileExists($actualFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->load($actualFile);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile);
- self::assertFileExists($actualFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->load($actualFile);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- self::assertFileExists($expectedFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- self::assertFileExists($expectedFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->loadXML($expectedXml);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->loadXML($expectedXml);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that a hierarchy of DOMElements matches.
- *
- * @param DOMElement $expectedElement
- * @param DOMElement $actualElement
- * @param bool $checkAttributes
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '')
- {
- $expectedElement = clone $expectedElement;
- $actualElement = clone $actualElement;
- self::assertEquals(
- $expectedElement->tagName,
- $actualElement->tagName,
- $message
- );
- if ($checkAttributes) {
- self::assertEquals(
- $expectedElement->attributes->length,
- $actualElement->attributes->length,
- sprintf(
- '%s%sNumber of attributes on node "%s" does not match',
- $message,
- !empty($message) ? "\n" : '',
- $expectedElement->tagName
- )
- );
- for ($i = 0; $i < $expectedElement->attributes->length; $i++) {
- $expectedAttribute = $expectedElement->attributes->item($i);
- $actualAttribute = $actualElement->attributes->getNamedItem(
- $expectedAttribute->name
- );
- if (!$actualAttribute) {
- self::fail(
- sprintf(
- '%s%sCould not find attribute "%s" on node "%s"',
- $message,
- !empty($message) ? "\n" : '',
- $expectedAttribute->name,
- $expectedElement->tagName
- )
- );
- }
- }
- }
- PHPUnit_Util_XML::removeCharacterDataNodes($expectedElement);
- PHPUnit_Util_XML::removeCharacterDataNodes($actualElement);
- self::assertEquals(
- $expectedElement->childNodes->length,
- $actualElement->childNodes->length,
- sprintf(
- '%s%sNumber of child nodes of "%s" differs',
- $message,
- !empty($message) ? "\n" : '',
- $expectedElement->tagName
- )
- );
- for ($i = 0; $i < $expectedElement->childNodes->length; $i++) {
- self::assertEqualXMLStructure(
- $expectedElement->childNodes->item($i),
- $actualElement->childNodes->item($i),
- $checkAttributes,
- $message
- );
- }
- }
- /**
- * Assert the presence, absence, or count of elements in a document matching
- * the CSS $selector, regardless of the contents of those elements.
- *
- * The first argument, $selector, is the CSS selector used to match
- * the elements in the $actual document.
- *
- * The second argument, $count, can be either boolean or numeric.
- * When boolean, it asserts for presence of elements matching the selector
- * (true) or absence of elements (false).
- * When numeric, it asserts the count of elements.
- *
- * assertSelectCount("#binder", true, $xml); // any?
- * assertSelectCount(".binder", 3, $xml); // exactly 3?
- *
- * @param array $selector
- * @param int|bool|array $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- * @deprecated
- * @codeCoverageIgnore
- */
- public static function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- self::assertSelectEquals(
- $selector,
- true,
- $count,
- $actual,
- $message,
- $isHtml
- );
- }
- /**
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml); // 3?
- *
- * @param array $selector
- * @param string $pattern
- * @param int|bool|array $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- * @deprecated
- * @codeCoverageIgnore
- */
- public static function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- self::assertSelectEquals(
- $selector,
- "regexp:$pattern",
- $count,
- $actual,
- $message,
- $isHtml
- );
- }
- /**
- * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any?
- * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none?
- *
- * @param array $selector
- * @param string $content
- * @param int|bool|array $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- * @deprecated
- * @codeCoverageIgnore
- */
- public static function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $tags = PHPUnit_Util_XML::cssSelect(
- $selector,
- $content,
- $actual,
- $isHtml
- );
- // assert specific number of elements
- if (is_numeric($count)) {
- $counted = $tags ? count($tags) : 0;
- self::assertEquals($count, $counted, $message);
- } // assert any elements exist if true, assert no elements exist if false
- elseif (is_bool($count)) {
- $any = count($tags) > 0 && $tags[0] instanceof DOMNode;
- if ($count) {
- self::assertTrue($any, $message);
- } else {
- self::assertFalse($any, $message);
- }
- } // check for range number of elements
- elseif (is_array($count) &&
- (isset($count['>']) || isset($count['<']) ||
- isset($count['>=']) || isset($count['<=']))) {
- $counted = $tags ? count($tags) : 0;
- if (isset($count['>'])) {
- self::assertTrue($counted > $count['>'], $message);
- }
- if (isset($count['>='])) {
- self::assertTrue($counted >= $count['>='], $message);
- }
- if (isset($count['<'])) {
- self::assertTrue($counted < $count['<'], $message);
- }
- if (isset($count['<='])) {
- self::assertTrue($counted <= $count['<='], $message);
- }
- } else {
- throw new PHPUnit_Framework_Exception;
- }
- }
- /**
- * Evaluate an HTML or XML string and assert its structure and/or contents.
- *
- * The first argument ($matcher) is an associative array that specifies the
- * match criteria for the assertion:
- *
- * - `id` : the node with the given id attribute must match the
- * corresponding value.
- * - `tag` : the node type must match the corresponding value.
- * - `attributes` : a hash. The node's attributes must match the
- * corresponding values in the hash.
- * - `content` : The text content must match the given value.
- * - `parent` : a hash. The node's parent must match the
- * corresponding hash.
- * - `child` : a hash. At least one of the node's immediate children
- * must meet the criteria described by the hash.
- * - `ancestor` : a hash. At least one of the node's ancestors must
- * meet the criteria described by the hash.
- * - `descendant` : a hash. At least one of the node's descendants must
- * meet the criteria described by the hash.
- * - `children` : a hash, for counting children of a node.
- * Accepts the keys:
- * - `count` : a number which must equal the number of children
- * that match
- * - `less_than` : the number of matching children must be greater
- * than this number
- * - `greater_than` : the number of matching children must be less than
- * this number
- * - `only` : another hash consisting of the keys to use to match
- * on the children, and only matching children will be
- * counted
- *
- * <code>
- * // Matcher that asserts that there is an element with an id="my_id".
- * $matcher = array('id' => 'my_id');
- *
- * // Matcher that asserts that there is a "span" tag.
- * $matcher = array('tag' => 'span');
- *
- * // Matcher that asserts that there is a "span" tag with the content
- * // "Hello World".
- * $matcher = array('tag' => 'span', 'content' => 'Hello World');
- *
- * // Matcher that asserts that there is a "span" tag with content matching
- * // the regular expression pattern.
- * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
- *
- * // Matcher that asserts that there is a "span" with an "list" class
- * // attribute.
- * $matcher = array(
- * 'tag' => 'span',
- * 'attributes' => array('class' => 'list')
- * );
- *
- * // Matcher that asserts that there is a "span" inside of a "div".
- * $matcher = array(
- * 'tag' => 'span',
- * 'parent' => array('tag' => 'div')
- * );
- *
- * // Matcher that asserts that there is a "span" somewhere inside a
- * // "table".
- * $matcher = array(
- * 'tag' => 'span',
- * 'ancestor' => array('tag' => 'table')
- * );
- *
- * // Matcher that asserts that there is a "span" with at least one "em"
- * // child.
- * $matcher = array(
- * 'tag' => 'span',
- * 'child' => array('tag' => 'em')
- * );
- *
- * // Matcher that asserts that there is a "span" containing a (possibly
- * // nested) "strong" tag.
- * $matcher = array(
- * 'tag' => 'span',
- * 'descendant' => array('tag' => 'strong')
- * );
- *
- * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
- * // as immediate children.
- * $matcher = array(
- * 'tag' => 'span',
- * 'children' => array(
- * 'less_than' => 11,
- * 'greater_than' => 4,
- * 'only' => array('tag' => 'em')
- * )
- * );
- *
- * // Matcher that asserts that there is a "div", with an "ul" ancestor and
- * // a "li" parent (with class="enum"), and containing a "span" descendant
- * // that contains an element with id="my_test" and the text "Hello World".
- * $matcher = array(
- * 'tag' => 'div',
- * 'ancestor' => array('tag' => 'ul'),
- * 'parent' => array(
- * 'tag' => 'li',
- * 'attributes' => array('class' => 'enum')
- * ),
- * 'descendant' => array(
- * 'tag' => 'span',
- * 'child' => array(
- * 'id' => 'my_test',
- * 'content' => 'Hello World'
- * )
- * )
- * );
- *
- * // Use assertTag() to apply a $matcher to a piece of $html.
- * $this->assertTag($matcher, $html);
- *
- * // Use assertTag() to apply a $matcher to a piece of $xml.
- * $this->assertTag($matcher, $xml, '', false);
- * </code>
- *
- * The second argument ($actual) is a string containing either HTML or
- * XML text to be tested.
- *
- * The third argument ($message) is an optional message that will be
- * used if the assertion fails.
- *
- * The fourth argument ($html) is an optional flag specifying whether
- * to load the $actual string into a DOMDocument using the HTML or
- * XML load strategy. It is true by default, which assumes the HTML
- * load strategy. In many cases, this will be acceptable for XML as well.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- * @deprecated
- * @codeCoverageIgnore
- */
- public static function assertTag($matcher, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $dom = PHPUnit_Util_XML::load($actual, $isHtml);
- $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
- $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
- self::assertTrue($matched, $message);
- }
- /**
- * This assertion is the exact opposite of assertTag().
- *
- * Rather than asserting that $matcher results in a match, it asserts that
- * $matcher does not match.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- * @deprecated
- * @codeCoverageIgnore
- */
- public static function assertNotTag($matcher, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $dom = PHPUnit_Util_XML::load($actual, $isHtml);
- $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
- $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
- self::assertFalse($matched, $message);
- }
- /**
- * Evaluates a PHPUnit_Framework_Constraint matcher object.
- *
- * @param mixed $value
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
- {
- self::$count += count($constraint);
- $constraint->evaluate($value, $message);
- }
- /**
- * Asserts that a string is a valid JSON string.
- *
- * @param string $actualJson
- * @param string $message
- * @since Method available since Release 3.7.20
- */
- public static function assertJson($actualJson, $message = '')
- {
- if (!is_string($actualJson)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- self::assertThat($actualJson, self::isJson(), $message);
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- $expected = json_decode($expectedJson);
- $actual = json_decode($actualJson);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are not equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- $expected = json_decode($expectedJson);
- $actual = json_decode($actualJson);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- self::assertThat($actualJson, $constraint, $message);
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are not equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message);
- }
- /**
- * Asserts that two JSON files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- public static function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- self::assertFileExists($actualFile, $message);
- $actualJson = file_get_contents($actualFile);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
- self::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message);
- self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message);
- }
- /**
- * Asserts that two JSON files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- self::assertFileExists($actualFile, $message);
- $actualJson = file_get_contents($actualFile);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
- self::assertThat($expectedJson, $constraintActual, $message);
- self::assertThat($actualJson, $constraintExpected, $message);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_And matcher object.
- *
- * @return PHPUnit_Framework_Constraint_And
- * @since Method available since Release 3.0.0
- */
- public static function logicalAnd()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_And;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.0.0
- */
- public static function logicalOr()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_Or;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Not matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @return PHPUnit_Framework_Constraint_Not
- * @since Method available since Release 3.0.0
- */
- public static function logicalNot(PHPUnit_Framework_Constraint $constraint)
- {
- return new PHPUnit_Framework_Constraint_Not($constraint);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Xor
- * @since Method available since Release 3.0.0
- */
- public static function logicalXor()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_Xor;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsAnything
- * @since Method available since Release 3.0.0
- */
- public static function anything()
- {
- return new PHPUnit_Framework_Constraint_IsAnything;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsTrue
- * @since Method available since Release 3.3.0
- */
- public static function isTrue()
- {
- return new PHPUnit_Framework_Constraint_IsTrue;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
- *
- * @param callable $callback
- * @return PHPUnit_Framework_Constraint_Callback
- */
- public static function callback($callback)
- {
- return new PHPUnit_Framework_Constraint_Callback($callback);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsFalse
- * @since Method available since Release 3.3.0
- */
- public static function isFalse()
- {
- return new PHPUnit_Framework_Constraint_IsFalse;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsJson matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsJson
- * @since Method available since Release 3.7.20
- */
- public static function isJson()
- {
- return new PHPUnit_Framework_Constraint_IsJson;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsNull
- * @since Method available since Release 3.3.0
- */
- public static function isNull()
- {
- return new PHPUnit_Framework_Constraint_IsNull;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- public static function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- return new PHPUnit_Framework_Constraint_Attribute(
- $constraint,
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
- * object.
- *
- * @param mixed $value
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @return PHPUnit_Framework_Constraint_TraversableContains
- * @since Method available since Release 3.0.0
- */
- public static function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return new PHPUnit_Framework_Constraint_TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- * @since Method available since Release 3.1.4
- */
- public static function containsOnly($type)
- {
- return new PHPUnit_Framework_Constraint_TraversableContainsOnly($type);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $classname
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- */
- public static function containsOnlyInstancesOf($classname)
- {
- return new PHPUnit_Framework_Constraint_TraversableContainsOnly($classname, false);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
- *
- * @param mixed $key
- * @return PHPUnit_Framework_Constraint_ArrayHasKey
- * @since Method available since Release 3.0.0
- */
- public static function arrayHasKey($key)
- {
- return new PHPUnit_Framework_Constraint_ArrayHasKey($key);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
- *
- * @param mixed $value
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @return PHPUnit_Framework_Constraint_IsEqual
- * @since Method available since Release 3.0.0
- */
- public static function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return new PHPUnit_Framework_Constraint_IsEqual(
- $value,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
- * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
- * object.
- *
- * @param string $attributeName
- * @param mixed $value
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- public static function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return self::attribute(
- self::equalTo(
- $value,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- ),
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsEmpty
- * @since Method available since Release 3.5.0
- */
- public static function isEmpty()
- {
- return new PHPUnit_Framework_Constraint_IsEmpty;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
- *
- * @return PHPUnit_Framework_Constraint_FileExists
- * @since Method available since Release 3.0.0
- */
- public static function fileExists()
- {
- return new PHPUnit_Framework_Constraint_FileExists;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_GreaterThan
- * @since Method available since Release 3.0.0
- */
- public static function greaterThan($value)
- {
- return new PHPUnit_Framework_Constraint_GreaterThan($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- public static function greaterThanOrEqual($value)
- {
- return self::logicalOr(
- new PHPUnit_Framework_Constraint_IsEqual($value),
- new PHPUnit_Framework_Constraint_GreaterThan($value)
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasAttribute
- * @since Method available since Release 3.1.0
- */
- public static function classHasAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ClassHasAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
- * object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
- * @since Method available since Release 3.1.0
- */
- public static function classHasStaticAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
- * @since Method available since Release 3.0.0
- */
- public static function objectHasAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ObjectHasAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_IsIdentical
- * @since Method available since Release 3.0.0
- */
- public static function identicalTo($value)
- {
- return new PHPUnit_Framework_Constraint_IsIdentical($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
- *
- * @param string $className
- * @return PHPUnit_Framework_Constraint_IsInstanceOf
- * @since Method available since Release 3.0.0
- */
- public static function isInstanceOf($className)
- {
- return new PHPUnit_Framework_Constraint_IsInstanceOf($className);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_IsType
- * @since Method available since Release 3.0.0
- */
- public static function isType($type)
- {
- return new PHPUnit_Framework_Constraint_IsType($type);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_LessThan
- * @since Method available since Release 3.0.0
- */
- public static function lessThan($value)
- {
- return new PHPUnit_Framework_Constraint_LessThan($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- public static function lessThanOrEqual($value)
- {
- return self::logicalOr(
- new PHPUnit_Framework_Constraint_IsEqual($value),
- new PHPUnit_Framework_Constraint_LessThan($value)
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
- *
- * @param string $pattern
- * @return PHPUnit_Framework_Constraint_PCREMatch
- * @since Method available since Release 3.0.0
- */
- public static function matchesRegularExpression($pattern)
- {
- return new PHPUnit_Framework_Constraint_PCREMatch($pattern);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
- *
- * @param string $string
- * @return PHPUnit_Framework_Constraint_StringMatches
- * @since Method available since Release 3.5.0
- */
- public static function matches($string)
- {
- return new PHPUnit_Framework_Constraint_StringMatches($string);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
- *
- * @param mixed $prefix
- * @return PHPUnit_Framework_Constraint_StringStartsWith
- * @since Method available since Release 3.4.0
- */
- public static function stringStartsWith($prefix)
- {
- return new PHPUnit_Framework_Constraint_StringStartsWith($prefix);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
- *
- * @param string $string
- * @param bool $case
- * @return PHPUnit_Framework_Constraint_StringContains
- * @since Method available since Release 3.0.0
- */
- public static function stringContains($string, $case = true)
- {
- return new PHPUnit_Framework_Constraint_StringContains($string, $case);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
- *
- * @param mixed $suffix
- * @return PHPUnit_Framework_Constraint_StringEndsWith
- * @since Method available since Release 3.4.0
- */
- public static function stringEndsWith($suffix)
- {
- return new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Count matcher object.
- *
- * @param int $count
- * @return PHPUnit_Framework_Constraint_Count
- */
- public static function countOf($count)
- {
- return new PHPUnit_Framework_Constraint_Count($count);
- }
- /**
- * Fails a test with the given message.
- *
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function fail($message = '')
- {
- throw new PHPUnit_Framework_AssertionFailedError($message);
- }
- /**
- * Returns the value of an attribute of a class or an object.
- * This also works for attributes that are declared protected or private.
- *
- * @param mixed $classOrObject
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- */
- public static function readAttribute($classOrObject, $attributeName)
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- if (is_string($classOrObject)) {
- if (!class_exists($classOrObject)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name'
- );
- }
- return self::getStaticAttribute(
- $classOrObject,
- $attributeName
- );
- } elseif (is_object($classOrObject)) {
- return self::getObjectAttribute(
- $classOrObject,
- $attributeName
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name or object'
- );
- }
- }
- /**
- * Returns the value of a static attribute.
- * This also works for attributes that are declared protected or private.
- *
- * @param string $className
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public static function getStaticAttribute($className, $attributeName)
- {
- if (!is_string($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class name');
- }
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- $class = new ReflectionClass($className);
- while ($class) {
- $attributes = $class->getStaticProperties();
- if (array_key_exists($attributeName, $attributes)) {
- return $attributes[$attributeName];
- }
- $class = $class->getParentClass();
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Attribute "%s" not found in class.',
- $attributeName
- )
- );
- }
- /**
- * Returns the value of an object's attribute.
- * This also works for attributes that are declared protected or private.
- *
- * @param object $object
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public static function getObjectAttribute($object, $attributeName)
- {
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'object');
- }
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- try {
- $attribute = new ReflectionProperty($object, $attributeName);
- } catch (ReflectionException $e) {
- $reflector = new ReflectionObject($object);
- while ($reflector = $reflector->getParentClass()) {
- try {
- $attribute = $reflector->getProperty($attributeName);
- break;
- } catch (ReflectionException $e) {
- }
- }
- }
- if (isset($attribute)) {
- if (!$attribute || $attribute->isPublic()) {
- return $object->$attributeName;
- }
- $attribute->setAccessible(true);
- $value = $attribute->getValue($object);
- $attribute->setAccessible(false);
- return $value;
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Attribute "%s" not found in object.',
- $attributeName
- )
- );
- }
- /**
- * Mark the test as incomplete.
- *
- * @param string $message
- * @throws PHPUnit_Framework_IncompleteTestError
- * @since Method available since Release 3.0.0
- */
- public static function markTestIncomplete($message = '')
- {
- throw new PHPUnit_Framework_IncompleteTestError($message);
- }
- /**
- * Mark the test as skipped.
- *
- * @param string $message
- * @throws PHPUnit_Framework_SkippedTestError
- * @since Method available since Release 3.0.0
- */
- public static function markTestSkipped($message = '')
- {
- throw new PHPUnit_Framework_SkippedTestError($message);
- }
- /**
- * Return the current assertion count.
- *
- * @return int
- * @since Method available since Release 3.3.3
- */
- public static function getCount()
- {
- return self::$count;
- }
- /**
- * Reset the assertion counter.
- *
- * @since Method available since Release 3.3.3
- */
- public static function resetCount()
- {
- self::$count = 0;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_CodeCoverageException extends PHPUnit_Framework_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestSuite is a composite of Tests. It runs a collection of test cases.
- *
- * Here is an example using the dynamic test definition.
- *
- * <code>
- * <?php
- * $suite = new PHPUnit_Framework_TestSuite;
- * $suite->addTest(new MathTest('testPass'));
- * ?>
- * </code>
- *
- * Alternatively, a TestSuite can extract the tests to be run automatically.
- * To do so you pass a ReflectionClass instance for your
- * PHPUnit_Framework_TestCase class to the PHPUnit_Framework_TestSuite
- * constructor.
- *
- * <code>
- * <?php
- * $suite = new PHPUnit_Framework_TestSuite(
- * new ReflectionClass('MathTest')
- * );
- * ?>
- * </code>
- *
- * This constructor creates a suite with all the methods starting with
- * "test" that take no arguments.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing, IteratorAggregate
- {
- /**
- * Last count of tests in this suite.
- *
- * @var int|null
- */
- private $cachedNumTests;
- /**
- * Enable or disable the backup and restoration of the $GLOBALS array.
- *
- * @var bool
- */
- protected $backupGlobals = null;
- /**
- * Enable or disable the backup and restoration of static attributes.
- *
- * @var bool
- */
- protected $backupStaticAttributes = null;
- /**
- * @var bool
- */
- private $disallowChangesToGlobalState = null;
- /**
- * @var bool
- */
- protected $runTestInSeparateProcess = false;
- /**
- * The name of the test suite.
- *
- * @var string
- */
- protected $name = '';
- /**
- * The test groups of the test suite.
- *
- * @var array
- */
- protected $groups = array();
- /**
- * The tests in the test suite.
- *
- * @var array
- */
- protected $tests = array();
- /**
- * The number of tests in the test suite.
- *
- * @var int
- */
- protected $numTests = -1;
- /**
- * @var bool
- */
- protected $testCase = false;
- /**
- * @var array
- */
- protected $foundClasses = array();
- /**
- * @var PHPUnit_Runner_Filter_Factory
- */
- private $iteratorFilter = null;
- /**
- * Constructs a new TestSuite:
- *
- * - PHPUnit_Framework_TestSuite() constructs an empty TestSuite.
- *
- * - PHPUnit_Framework_TestSuite(ReflectionClass) constructs a
- * TestSuite from the given class.
- *
- * - PHPUnit_Framework_TestSuite(ReflectionClass, String)
- * constructs a TestSuite from the given class with the given
- * name.
- *
- * - PHPUnit_Framework_TestSuite(String) either constructs a
- * TestSuite from the given class (if the passed string is the
- * name of an existing class) or constructs an empty TestSuite
- * with the given name.
- *
- * @param mixed $theClass
- * @param string $name
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($theClass = '', $name = '')
- {
- $argumentsValid = false;
- if (is_object($theClass) &&
- $theClass instanceof ReflectionClass) {
- $argumentsValid = true;
- } elseif (is_string($theClass) &&
- $theClass !== '' &&
- class_exists($theClass, false)) {
- $argumentsValid = true;
- if ($name == '') {
- $name = $theClass;
- }
- $theClass = new ReflectionClass($theClass);
- } elseif (is_string($theClass)) {
- $this->setName($theClass);
- return;
- }
- if (!$argumentsValid) {
- throw new PHPUnit_Framework_Exception;
- }
- if (!$theClass->isSubclassOf('PHPUnit_Framework_TestCase')) {
- throw new PHPUnit_Framework_Exception(
- 'Class "' . $theClass->name . '" does not extend PHPUnit_Framework_TestCase.'
- );
- }
- if ($name != '') {
- $this->setName($name);
- } else {
- $this->setName($theClass->getName());
- }
- $constructor = $theClass->getConstructor();
- if ($constructor !== null &&
- !$constructor->isPublic()) {
- $this->addTest(
- self::warning(
- sprintf(
- 'Class "%s" has no public constructor.',
- $theClass->getName()
- )
- )
- );
- return;
- }
- foreach ($theClass->getMethods() as $method) {
- $this->addTestMethod($theClass, $method);
- }
- if (empty($this->tests)) {
- $this->addTest(
- self::warning(
- sprintf(
- 'No tests found in class "%s".',
- $theClass->getName()
- )
- )
- );
- }
- $this->testCase = true;
- }
- /**
- * Returns a string representation of the test suite.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- /**
- * Adds a test to the suite.
- *
- * @param PHPUnit_Framework_Test $test
- * @param array $groups
- */
- public function addTest(PHPUnit_Framework_Test $test, $groups = array())
- {
- $class = new ReflectionClass($test);
- if (!$class->isAbstract()) {
- $this->tests[] = $test;
- $this->numTests = -1;
- if ($test instanceof self &&
- empty($groups)) {
- $groups = $test->getGroups();
- }
- if (empty($groups)) {
- $groups = array('__nogroup__');
- }
- foreach ($groups as $group) {
- if (!isset($this->groups[$group])) {
- $this->groups[$group] = array($test);
- } else {
- $this->groups[$group][] = $test;
- }
- }
- }
- }
- /**
- * Adds the tests from the given class to the suite.
- *
- * @param mixed $testClass
- * @throws PHPUnit_Framework_Exception
- */
- public function addTestSuite($testClass)
- {
- if (is_string($testClass) && class_exists($testClass)) {
- $testClass = new ReflectionClass($testClass);
- }
- if (!is_object($testClass)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name or object'
- );
- }
- if ($testClass instanceof self) {
- $this->addTest($testClass);
- } elseif ($testClass instanceof ReflectionClass) {
- $suiteMethod = false;
- if (!$testClass->isAbstract()) {
- if ($testClass->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
- $method = $testClass->getMethod(
- PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
- );
- if ($method->isStatic()) {
- $this->addTest(
- $method->invoke(null, $testClass->getName())
- );
- $suiteMethod = true;
- }
- }
- }
- if (!$suiteMethod && !$testClass->isAbstract()) {
- $this->addTest(new self($testClass));
- }
- } else {
- throw new PHPUnit_Framework_Exception;
- }
- }
- /**
- * Wraps both <code>addTest()</code> and <code>addTestSuite</code>
- * as well as the separate import statements for the user's convenience.
- *
- * If the named file cannot be read or there are no new tests that can be
- * added, a <code>PHPUnit_Framework_Warning</code> will be created instead,
- * leaving the current test run untouched.
- *
- * @param string $filename
- * @param array $phptOptions Array with ini settings for the php instance
- * run, key being the name if the setting,
- * value the ini value.
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 2.3.0
- */
- public function addTestFile($filename, $phptOptions = array())
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (file_exists($filename) && substr($filename, -5) == '.phpt') {
- $this->addTest(
- new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)
- );
- return;
- }
- // The given file may contain further stub classes in addition to the
- // test class itself. Figure out the actual test class.
- $classes = get_declared_classes();
- $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename);
- $newClasses = array_diff(get_declared_classes(), $classes);
- // The diff is empty in case a parent class (with test methods) is added
- // AFTER a child class that inherited from it. To account for that case,
- // cumulate all discovered classes, so the parent class may be found in
- // a later invocation.
- if ($newClasses) {
- // On the assumption that test classes are defined first in files,
- // process discovered classes in approximate LIFO order, so as to
- // avoid unnecessary reflection.
- $this->foundClasses = array_merge($newClasses, $this->foundClasses);
- }
- // The test class's name must match the filename, either in full, or as
- // a PEAR/PSR-0 prefixed shortname ('NameSpace_ShortName'), or as a
- // PSR-1 local shortname ('NameSpace\ShortName'). The comparison must be
- // anchored to prevent false-positive matches (e.g., 'OtherShortName').
- $shortname = basename($filename, '.php');
- $shortnameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortname, '/') . '$/';
- foreach ($this->foundClasses as $i => $className) {
- if (preg_match($shortnameRegEx, $className)) {
- $class = new ReflectionClass($className);
- if ($class->getFileName() == $filename) {
- $newClasses = array($className);
- unset($this->foundClasses[$i]);
- break;
- }
- }
- }
- foreach ($newClasses as $className) {
- $class = new ReflectionClass($className);
- if (!$class->isAbstract()) {
- if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
- $method = $class->getMethod(
- PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
- );
- if ($method->isStatic()) {
- $this->addTest($method->invoke(null, $className));
- }
- } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) {
- $this->addTestSuite($class);
- }
- }
- }
- $this->numTests = -1;
- }
- /**
- * Wrapper for addTestFile() that adds multiple test files.
- *
- * @param array|Iterator $filenames
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 2.3.0
- */
- public function addTestFiles($filenames)
- {
- if (!(is_array($filenames) ||
- (is_object($filenames) && $filenames instanceof Iterator))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'array or iterator'
- );
- }
- foreach ($filenames as $filename) {
- $this->addTestFile((string) $filename);
- }
- }
- /**
- * Counts the number of test cases that will be run by this test.
- *
- * @param bool $preferCache Indicates if cache is preferred.
- * @return int
- */
- public function count($preferCache = false)
- {
- if ($preferCache && $this->cachedNumTests != null) {
- $numTests = $this->cachedNumTests;
- } else {
- $numTests = 0;
- foreach ($this as $test) {
- $numTests += count($test);
- }
- $this->cachedNumTests = $numTests;
- }
- return $numTests;
- }
- /**
- * @param ReflectionClass $theClass
- * @param string $name
- * @return PHPUnit_Framework_Test
- * @throws PHPUnit_Framework_Exception
- */
- public static function createTest(ReflectionClass $theClass, $name)
- {
- $className = $theClass->getName();
- if (!$theClass->isInstantiable()) {
- return self::warning(
- sprintf('Cannot instantiate class "%s".', $className)
- );
- }
- $backupSettings = PHPUnit_Util_Test::getBackupSettings(
- $className,
- $name
- );
- $preserveGlobalState = PHPUnit_Util_Test::getPreserveGlobalStateSettings(
- $className,
- $name
- );
- $runTestInSeparateProcess = PHPUnit_Util_Test::getProcessIsolationSettings(
- $className,
- $name
- );
- $constructor = $theClass->getConstructor();
- if ($constructor !== null) {
- $parameters = $constructor->getParameters();
- // TestCase() or TestCase($name)
- if (count($parameters) < 2) {
- $test = new $className;
- } // TestCase($name, $data)
- else {
- try {
- $data = PHPUnit_Util_Test::getProvidedData(
- $className,
- $name
- );
- } catch (PHPUnit_Framework_IncompleteTestError $e) {
- $message = sprintf(
- 'Test for %s::%s marked incomplete by data provider',
- $className,
- $name
- );
- $_message = $e->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::incompleteTest($className, $name, $message);
- } catch (PHPUnit_Framework_SkippedTestError $e) {
- $message = sprintf(
- 'Test for %s::%s skipped by data provider',
- $className,
- $name
- );
- $_message = $e->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::skipTest($className, $name, $message);
- } catch (Throwable $_t) {
- $t = $_t;
- } catch (Exception $_t) {
- $t = $_t;
- }
- if (isset($t)) {
- $message = sprintf(
- 'The data provider specified for %s::%s is invalid.',
- $className,
- $name
- );
- $_message = $t->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::warning($message);
- }
- // Test method with @dataProvider.
- if (isset($data)) {
- $test = new PHPUnit_Framework_TestSuite_DataProvider(
- $className . '::' . $name
- );
- if (empty($data)) {
- $data = self::warning(
- sprintf(
- 'No tests found in suite "%s".',
- $test->getName()
- )
- );
- }
- $groups = PHPUnit_Util_Test::getGroups($className, $name);
- if ($data instanceof PHPUnit_Framework_Warning ||
- $data instanceof PHPUnit_Framework_SkippedTestCase ||
- $data instanceof PHPUnit_Framework_IncompleteTestCase) {
- $test->addTest($data, $groups);
- } else {
- foreach ($data as $_dataName => $_data) {
- $_test = new $className($name, $_data, $_dataName);
- if ($runTestInSeparateProcess) {
- $_test->setRunTestInSeparateProcess(true);
- if ($preserveGlobalState !== null) {
- $_test->setPreserveGlobalState($preserveGlobalState);
- }
- }
- if ($backupSettings['backupGlobals'] !== null) {
- $_test->setBackupGlobals(
- $backupSettings['backupGlobals']
- );
- }
- if ($backupSettings['backupStaticAttributes'] !== null) {
- $_test->setBackupStaticAttributes(
- $backupSettings['backupStaticAttributes']
- );
- }
- $test->addTest($_test, $groups);
- }
- }
- } else {
- $test = new $className;
- }
- }
- }
- if (!isset($test)) {
- throw new PHPUnit_Framework_Exception('No valid test provided.');
- }
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $test->setName($name);
- if ($runTestInSeparateProcess) {
- $test->setRunTestInSeparateProcess(true);
- if ($preserveGlobalState !== null) {
- $test->setPreserveGlobalState($preserveGlobalState);
- }
- }
- if ($backupSettings['backupGlobals'] !== null) {
- $test->setBackupGlobals($backupSettings['backupGlobals']);
- }
- if ($backupSettings['backupStaticAttributes'] !== null) {
- $test->setBackupStaticAttributes(
- $backupSettings['backupStaticAttributes']
- );
- }
- }
- return $test;
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * Returns the name of the suite.
- *
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * Returns the test groups of the suite.
- *
- * @return array
- * @since Method available since Release 3.2.0
- */
- public function getGroups()
- {
- return array_keys($this->groups);
- }
- public function getGroupDetails()
- {
- return $this->groups;
- }
- /**
- * Set tests groups of the test case
- *
- * @param array $groups
- * @since Method available since Release 4.0.0
- */
- public function setGroupDetails(array $groups)
- {
- $this->groups = $groups;
- }
- /**
- * Runs the tests and collects their result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- if (count($this) == 0) {
- return $result;
- }
- $hookMethods = PHPUnit_Util_Test::getHookMethods($this->name);
- $result->startTestSuite($this);
- try {
- $this->setUp();
- foreach ($hookMethods['beforeClass'] as $beforeClassMethod) {
- if ($this->testCase === true &&
- class_exists($this->name, false) &&
- method_exists($this->name, $beforeClassMethod)) {
- if ($missingRequirements = PHPUnit_Util_Test::getMissingRequirements($this->name, $beforeClassMethod)) {
- $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements));
- }
- call_user_func(array($this->name, $beforeClassMethod));
- }
- }
- } catch (PHPUnit_Framework_SkippedTestSuiteError $e) {
- $numTests = count($this);
- for ($i = 0; $i < $numTests; $i++) {
- $result->startTest($this);
- $result->addFailure($this, $e, 0);
- $result->endTest($this, 0);
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- } catch (Throwable $_t) {
- $t = $_t;
- } catch (Exception $_t) {
- $t = $_t;
- }
- if (isset($t)) {
- $numTests = count($this);
- for ($i = 0; $i < $numTests; $i++) {
- $result->startTest($this);
- $result->addError($this, $t, 0);
- $result->endTest($this, 0);
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- }
- foreach ($this as $test) {
- if ($result->shouldStop()) {
- break;
- }
- if ($test instanceof PHPUnit_Framework_TestCase ||
- $test instanceof self) {
- $test->setDisallowChangesToGlobalState($this->disallowChangesToGlobalState);
- $test->setBackupGlobals($this->backupGlobals);
- $test->setBackupStaticAttributes($this->backupStaticAttributes);
- $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess);
- }
- $test->run($result);
- }
- foreach ($hookMethods['afterClass'] as $afterClassMethod) {
- if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $afterClassMethod)) {
- call_user_func(array($this->name, $afterClassMethod));
- }
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- }
- /**
- * @param bool $runTestInSeparateProcess
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.7.0
- */
- public function setRunTestInSeparateProcess($runTestInSeparateProcess)
- {
- if (is_bool($runTestInSeparateProcess)) {
- $this->runTestInSeparateProcess = $runTestInSeparateProcess;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * Runs a test.
- *
- * @deprecated
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- */
- public function runTest(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result)
- {
- $test->run($result);
- }
- /**
- * Sets the name of the suite.
- *
- * @param string
- */
- public function setName($name)
- {
- $this->name = $name;
- }
- /**
- * Returns the test at the given index.
- *
- * @param int
- * @return PHPUnit_Framework_Test
- */
- public function testAt($index)
- {
- if (isset($this->tests[$index])) {
- return $this->tests[$index];
- } else {
- return false;
- }
- }
- /**
- * Returns the tests as an enumeration.
- *
- * @return array
- */
- public function tests()
- {
- return $this->tests;
- }
- /**
- * Set tests of the test suite
- *
- * @param array $tests
- * @since Method available since Release 4.0.0
- */
- public function setTests(array $tests)
- {
- $this->tests = $tests;
- }
- /**
- * Mark the test suite as skipped.
- *
- * @param string $message
- * @throws PHPUnit_Framework_SkippedTestSuiteError
- * @since Method available since Release 3.0.0
- */
- public function markTestSuiteSkipped($message = '')
- {
- throw new PHPUnit_Framework_SkippedTestSuiteError($message);
- }
- /**
- * @param ReflectionClass $class
- * @param ReflectionMethod $method
- */
- protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- if (!$this->isTestMethod($method)) {
- return;
- }
- $name = $method->getName();
- if (!$method->isPublic()) {
- $this->addTest(
- self::warning(
- sprintf(
- 'Test method "%s" in test class "%s" is not public.',
- $name,
- $class->getName()
- )
- )
- );
- return;
- }
- $test = self::createTest($class, $name);
- if ($test instanceof PHPUnit_Framework_TestCase ||
- $test instanceof PHPUnit_Framework_TestSuite_DataProvider) {
- $test->setDependencies(
- PHPUnit_Util_Test::getDependencies($class->getName(), $name)
- );
- }
- $this->addTest(
- $test,
- PHPUnit_Util_Test::getGroups($class->getName(), $name)
- );
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- */
- public static function isTestMethod(ReflectionMethod $method)
- {
- if (strpos($method->name, 'test') === 0) {
- return true;
- }
- // @scenario on TestCase::testMethod()
- // @test on TestCase::testMethod()
- $doc_comment = $method->getDocComment();
- return strpos($doc_comment, '@test') !== false ||
- strpos($doc_comment, '@scenario') !== false;
- }
- /**
- * @param string $message
- * @return PHPUnit_Framework_Warning
- */
- protected static function warning($message)
- {
- return new PHPUnit_Framework_Warning($message);
- }
- /**
- * @param string $class
- * @param string $methodName
- * @param string $message
- * @return PHPUnit_Framework_SkippedTestCase
- * @since Method available since Release 4.3.0
- */
- protected static function skipTest($class, $methodName, $message)
- {
- return new PHPUnit_Framework_SkippedTestCase($class, $methodName, $message);
- }
- /**
- * @param string $class
- * @param string $methodName
- * @param string $message
- * @return PHPUnit_Framework_IncompleteTestCase
- * @since Method available since Release 4.3.0
- */
- protected static function incompleteTest($class, $methodName, $message)
- {
- return new PHPUnit_Framework_IncompleteTestCase($class, $methodName, $message);
- }
- /**
- * @param bool $disallowChangesToGlobalState
- * @since Method available since Release 4.6.0
- */
- public function setDisallowChangesToGlobalState($disallowChangesToGlobalState)
- {
- if (is_null($this->disallowChangesToGlobalState) && is_bool($disallowChangesToGlobalState)) {
- $this->disallowChangesToGlobalState = $disallowChangesToGlobalState;
- }
- }
- /**
- * @param bool $backupGlobals
- * @since Method available since Release 3.3.0
- */
- public function setBackupGlobals($backupGlobals)
- {
- if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
- $this->backupGlobals = $backupGlobals;
- }
- }
- /**
- * @param bool $backupStaticAttributes
- * @since Method available since Release 3.4.0
- */
- public function setBackupStaticAttributes($backupStaticAttributes)
- {
- if (is_null($this->backupStaticAttributes) &&
- is_bool($backupStaticAttributes)) {
- $this->backupStaticAttributes = $backupStaticAttributes;
- }
- }
- /**
- * Returns an iterator for this test suite.
- *
- * @return RecursiveIteratorIterator
- * @since Method available since Release 3.1.0
- */
- public function getIterator()
- {
- $iterator = new PHPUnit_Util_TestSuiteIterator($this);
- if ($this->iteratorFilter !== null) {
- $iterator = $this->iteratorFilter->factory($iterator, $this);
- }
- return $iterator;
- }
- public function injectFilter(PHPUnit_Runner_Filter_Factory $filter)
- {
- $this->iteratorFilter = $filter;
- foreach ($this as $test) {
- if ($test instanceof self) {
- $test->injectFilter($filter);
- }
- }
- }
- /**
- * Template Method that is called before the tests
- * of this test suite are run.
- *
- * @since Method available since Release 3.1.0
- */
- protected function setUp()
- {
- }
- /**
- * Template Method that is called after the tests
- * of this test suite have finished running.
- *
- * @since Method available since Release 3.1.0
- */
- protected function tearDown()
- {
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking any exception/error as result of an unit
- * test as risky.
- *
- * @since Interface available since Release 4.0.0
- */
- interface PHPUnit_Framework_RiskyTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes that can return a description of itself.
- *
- * @since Interface available since Release 3.0.0
- */
- interface PHPUnit_Framework_SelfDescribing
- {
- /**
- * Returns a string representation of the object.
- *
- * @return string
- */
- public function toString();
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Returns a matcher that matches when the method is executed
- * zero or more times.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
- * @since Method available since Release 3.0.0
- */
- function any()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::any',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsAnything
- * @since Method available since Release 3.0.0
- */
- function anything()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::anything',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
- *
- * @param mixed $key
- * @return PHPUnit_Framework_Constraint_ArrayHasKey
- * @since Method available since Release 3.0.0
- */
- function arrayHasKey($key)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::arrayHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that an array has a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertArrayHasKey($key, $array, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArrayHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that an array has a specified subset.
- *
- * @param array|ArrayAccess $subset
- * @param array|ArrayAccess $array
- * @param bool $strict Check for object identity
- * @param string $message
- * @since Method available since Release 4.4.0
- */
- function assertArraySubset($subset, $array, $strict = false, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArraySubset',
- func_get_args()
- );
- }
- /**
- * Asserts that an array does not have a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertArrayNotHasKey($key, $array, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArrayNotHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains only values of a given type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param int $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is greater than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeGreaterThan',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is smaller than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeLessThan',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain only values of a given
- * type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param int $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is not empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable and an attribute of an object do not have the
- * same type and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotSame',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable and an attribute of an object have the same type
- * and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeSame',
- func_get_args()
- );
- }
- /**
- * Asserts that a class has a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassHasAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class has a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassHasStaticAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class does not have a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassNotHasAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassNotHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class does not have a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains only instances of a given classname
- *
- * @param string $classname
- * @param array|Traversable $haystack
- * @param string $message
- */
- function assertContainsOnlyInstancesOf($classname, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param int $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- function assertCount($expectedCount, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertEmpty($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a hierarchy of DOMElements matches.
- *
- * @param DOMElement $expectedElement
- * @param DOMElement $actualElement
- * @param bool $checkAttributes
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEqualXMLStructure',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables are equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- */
- function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is not true.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotTrue($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotTrue',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is false.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertFalse($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFalse',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of one file is equal to the contents of another
- * file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.2.14
- */
- function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a file exists.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertFileExists($filename, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileExists',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of one file is not equal to the contents of
- * another file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.2.14
- */
- function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a file does not exist.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertFileNotExists($filename, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileNotExists',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is greater than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertGreaterThan($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertGreaterThan',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertGreaterThanOrEqual($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertGreaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertInstanceOf($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertInternalType($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a string is a valid JSON string.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.7.20
- */
- function assertJson($expectedJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJson',
- func_get_args()
- );
- }
- /**
- * Asserts that two JSON files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two JSON files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString',
- func_get_args()
- );
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are not equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are not equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is smaller than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertLessThan($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertLessThan',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertLessThanOrEqual($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertLessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack does not contain a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param bool $ignoreCase
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack does not contain only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param bool $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param int $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- function assertNotCount($expectedCount, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotEmpty($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables are not equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 2.3.0
- */
- function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertNotInstanceOf($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertNotInternalType($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is not false.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotFalse($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotFalse',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not null.
- *
- * @param mixed $actual
- * @param string $message
- */
- function assertNotNull($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotNull',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- * @since Method available since Release 2.1.0
- */
- function assertNotRegExp($pattern, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables do not have the same type and value.
- * Used on objects, it asserts that two variables do not reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- function assertNotSame($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotSame',
- func_get_args()
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is not the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- function assertNotSameSize($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotSameSize',
- func_get_args()
- );
- }
- /**
- * This assertion is the exact opposite of assertTag().
- *
- * Rather than asserting that $matcher results in a match, it asserts that
- * $matcher does not match.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- */
- function assertNotTag($matcher, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotTag',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is null.
- *
- * @param mixed $actual
- * @param string $message
- */
- function assertNull($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNull',
- func_get_args()
- );
- }
- /**
- * Asserts that an object has a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertObjectHasAttribute($attributeName, $object, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertObjectHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that an object does not have a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertObjectNotHasAttribute($attributeName, $object, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertObjectNotHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- */
- function assertRegExp($pattern, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables have the same type and value.
- * Used on objects, it asserts that two variables reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- function assertSame($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSame',
- func_get_args()
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- function assertSameSize($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSameSize',
- func_get_args()
- );
- }
- /**
- * Assert the presence, absence, or count of elements in a document matching
- * the CSS $selector, regardless of the contents of those elements.
- *
- * The first argument, $selector, is the CSS selector used to match
- * the elements in the $actual document.
- *
- * The second argument, $count, can be either boolean or numeric.
- * When boolean, it asserts for presence of elements matching the selector
- * (true) or absence of elements (false).
- * When numeric, it asserts the count of elements.
- *
- * assertSelectCount("#binder", true, $xml); // any?
- * assertSelectCount(".binder", 3, $xml); // exactly 3?
- *
- * @param array $selector
- * @param int $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- */
- function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectCount',
- func_get_args()
- );
- }
- /**
- * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any?
- * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none?
- *
- * @param array $selector
- * @param string $content
- * @param int $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- */
- function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectEquals',
- func_get_args()
- );
- }
- /**
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml);// 3?
- *
- * @param array $selector
- * @param string $pattern
- * @param int $count
- * @param mixed $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- */
- function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that a string ends not with a given prefix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringEndsNotWith($suffix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEndsNotWith',
- func_get_args()
- );
- }
- /**
- * Asserts that a string ends with a given prefix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringEndsWith($suffix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEndsWith',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of a string is equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.3.0
- */
- function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEqualsFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringMatchesFormat($format, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringMatchesFormat',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given format file.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringMatchesFormatFile($formatFile, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringMatchesFormatFile',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of a string is not equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @since Method available since Release 3.3.0
- */
- function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotEqualsFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringNotMatchesFormat($format, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotMatchesFormat',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string starts not with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringStartsNotWith($prefix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringStartsNotWith',
- func_get_args()
- );
- }
- /**
- * Asserts that a string starts with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringStartsWith($prefix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringStartsWith',
- func_get_args()
- );
- }
- /**
- * Evaluate an HTML or XML string and assert its structure and/or contents.
- *
- * The first argument ($matcher) is an associative array that specifies the
- * match criteria for the assertion:
- *
- * - `id` : the node with the given id attribute must match the
- * corresponding value.
- * - `tag` : the node type must match the corresponding value.
- * - `attributes` : a hash. The node's attributes must match the
- * corresponding values in the hash.
- * - `content` : The text content must match the given value.
- * - `parent` : a hash. The node's parent must match the
- * corresponding hash.
- * - `child`: a hash. At least one of the node's immediate children
- * must meet the criteria described by the hash.
- * - `ancestor` : a hash. At least one of the node's ancestors must
- * meet the criteria described by the hash.
- * - `descendant` : a hash. At least one of the node's descendants must
- * meet the criteria described by the hash.
- * - `children` : a hash, for counting children of a node.
- * Accepts the keys:
- *- `count`: a number which must equal the number of children
- * that match
- *- `less_than`: the number of matching children must be greater
- * than this number
- *- `greater_than` : the number of matching children must be less than
- * this number
- *- `only` : another hash consisting of the keys to use to match
- * on the children, and only matching children will be
- * counted
- *
- * <code>
- * // Matcher that asserts that there is an element with an id="my_id".
- * $matcher = array('id' => 'my_id');
- *
- * // Matcher that asserts that there is a "span" tag.
- * $matcher = array('tag' => 'span');
- *
- * // Matcher that asserts that there is a "span" tag with the content
- * // "Hello World".
- * $matcher = array('tag' => 'span', 'content' => 'Hello World');
- *
- * // Matcher that asserts that there is a "span" tag with content matching
- * // the regular expression pattern.
- * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
- *
- * // Matcher that asserts that there is a "span" with an "list" class
- * // attribute.
- * $matcher = array(
- * 'tag'=> 'span',
- * 'attributes' => array('class' => 'list')
- * );
- *
- * // Matcher that asserts that there is a "span" inside of a "div".
- * $matcher = array(
- * 'tag'=> 'span',
- * 'parent' => array('tag' => 'div')
- * );
- *
- * // Matcher that asserts that there is a "span" somewhere inside a
- * // "table".
- * $matcher = array(
- * 'tag' => 'span',
- * 'ancestor' => array('tag' => 'table')
- * );
- *
- * // Matcher that asserts that there is a "span" with at least one "em"
- * // child.
- * $matcher = array(
- * 'tag' => 'span',
- * 'child' => array('tag' => 'em')
- * );
- *
- * // Matcher that asserts that there is a "span" containing a (possibly
- * // nested) "strong" tag.
- * $matcher = array(
- * 'tag'=> 'span',
- * 'descendant' => array('tag' => 'strong')
- * );
- *
- * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
- * // as immediate children.
- * $matcher = array(
- * 'tag' => 'span',
- * 'children' => array(
- * 'less_than'=> 11,
- * 'greater_than' => 4,
- * 'only' => array('tag' => 'em')
- * )
- * );
- *
- * // Matcher that asserts that there is a "div", with an "ul" ancestor and
- * // a "li" parent (with class="enum"), and containing a "span" descendant
- * // that contains an element with id="my_test" and the text "Hello World".
- * $matcher = array(
- * 'tag'=> 'div',
- * 'ancestor' => array('tag' => 'ul'),
- * 'parent' => array(
- * 'tag'=> 'li',
- * 'attributes' => array('class' => 'enum')
- * ),
- * 'descendant' => array(
- * 'tag' => 'span',
- * 'child' => array(
- * 'id' => 'my_test',
- * 'content' => 'Hello World'
- * )
- * )
- * );
- *
- * // Use assertTag() to apply a $matcher to a piece of $html.
- * $this->assertTag($matcher, $html);
- *
- * // Use assertTag() to apply a $matcher to a piece of $xml.
- * $this->assertTag($matcher, $xml, '', false);
- * </code>
- *
- * The second argument ($actual) is a string containing either HTML or
- * XML text to be tested.
- *
- * The third argument ($message) is an optional message that will be
- * used if the assertion fails.
- *
- * The fourth argument ($html) is an optional flag specifying whether
- * to load the $actual string into a DOMDocument using the HTML or
- * XML load strategy. It is true by default, which assumes the HTML
- * load strategy. In many cases, this will be acceptable for XML as well.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param bool $isHtml
- * @since Method available since Release 3.3.0
- */
- function assertTag($matcher, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertTag',
- func_get_args()
- );
- }
- /**
- * Evaluates a PHPUnit_Framework_Constraint matcher object.
- *
- * @param mixed$value
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertThat',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is true.
- *
- * @param bool $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertTrue($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertTrue',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at the given $index.
- *
- * @param int $index
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
- * @since Method available since Release 3.0.0
- */
- function at($index)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::at',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed at least once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
- * @since Method available since Release 3.0.0
- */
- function atLeastOnce()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::atLeastOnce',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::attribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
- * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
- * object.
- *
- * @param string $attributeName
- * @param mixed $value
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::attributeEqualTo',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
- *
- * @param callable $callback
- * @return PHPUnit_Framework_Constraint_Callback
- */
- function callback($callback)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::callback',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasAttribute
- * @since Method available since Release 3.1.0
- */
- function classHasAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::classHasAttribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
- * object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
- * @since Method available since Release 3.1.0
- */
- function classHasStaticAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::classHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
- * object.
- *
- * @param mixed $value
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @return PHPUnit_Framework_Constraint_TraversableContains
- * @since Method available since Release 3.0.0
- */
- function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::contains',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- * @since Method available since Release 3.1.4
- */
- function containsOnly($type)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::containsOnly',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $classname
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- */
- function containsOnlyInstancesOf($classname)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::containsOnlyInstancesOf',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
- *
- * @param mixed $value
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @return PHPUnit_Framework_Constraint_IsEqual
- * @since Method available since Release 3.0.0
- */
- function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::equalTo',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * exactly $count times.
- *
- * @param int $count
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function exactly($count)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::exactly',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
- *
- * @return PHPUnit_Framework_Constraint_FileExists
- * @since Method available since Release 3.0.0
- */
- function fileExists()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::fileExists',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_GreaterThan
- * @since Method available since Release 3.0.0
- */
- function greaterThan($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::greaterThan',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- function greaterThanOrEqual($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::greaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_IsIdentical
- * @since Method available since Release 3.0.0
- */
- function identicalTo($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::identicalTo',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsEmpty
- * @since Method available since Release 3.5.0
- */
- function isEmpty()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isEmpty',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsFalse
- * @since Method available since Release 3.3.0
- */
- function isFalse()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isFalse',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
- *
- * @param string $className
- * @return PHPUnit_Framework_Constraint_IsInstanceOf
- * @since Method available since Release 3.0.0
- */
- function isInstanceOf($className)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isInstanceOf',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsJson matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsJson
- * @since Method available since Release 3.7.20
- */
- function isJson()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isJson',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsNull
- * @since Method available since Release 3.3.0
- */
- function isNull()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isNull',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsTrue
- * @since Method available since Release 3.3.0
- */
- function isTrue()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isTrue',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_IsType
- * @since Method available since Release 3.0.0
- */
- function isType($type)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isType',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_LessThan
- * @since Method available since Release 3.0.0
- */
- function lessThan($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::lessThan',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- function lessThanOrEqual($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::lessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_And matcher object.
- *
- * @return PHPUnit_Framework_Constraint_And
- * @since Method available since Release 3.0.0
- */
- function logicalAnd()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalAnd',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Not matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @return PHPUnit_Framework_Constraint_Not
- * @since Method available since Release 3.0.0
- */
- function logicalNot(PHPUnit_Framework_Constraint $constraint)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalNot',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.0.0
- */
- function logicalOr()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalOr',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Xor
- * @since Method available since Release 3.0.0
- */
- function logicalXor()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalXor',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
- *
- * @param string $string
- * @return PHPUnit_Framework_Constraint_StringMatches
- * @since Method available since Release 3.5.0
- */
- function matches($string)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::matches',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
- *
- * @param string $pattern
- * @return PHPUnit_Framework_Constraint_PCREMatch
- * @since Method available since Release 3.0.0
- */
- function matchesRegularExpression($pattern)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::matchesRegularExpression',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is never executed.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function never()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::never',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
- * @since Method available since Release 3.0.0
- */
- function objectHasAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::objectHasAttribute',
- func_get_args()
- );
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
- * @since Method available since Release 3.0.0
- */
- function onConsecutiveCalls()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::onConsecutiveCalls',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed exactly once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function once()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::once',
- func_get_args()
- );
- }
- /**
- * @param int $argumentIndex
- * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
- * @since Method available since Release 3.3.0
- */
- function returnArgument($argumentIndex)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnArgument',
- func_get_args()
- );
- }
- /**
- * @param mixed $callback
- * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
- * @since Method available since Release 3.3.0
- */
- function returnCallback($callback)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnCallback',
- func_get_args()
- );
- }
- /**
- * Returns the current object.
- *
- * This method is useful when mocking a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
- * @since Method available since Release 3.6.0
- */
- function returnSelf()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnSelf',
- func_get_args()
- );
- }
- /**
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Stub_Return
- * @since Method available since Release 3.0.0
- */
- function returnValue($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnValue',
- func_get_args()
- );
- }
- /**
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
- * @since Method available since Release 3.6.0
- */
- function returnValueMap(array $valueMap)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnValueMap',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
- *
- * @param string $string
- * @param bool $case
- * @return PHPUnit_Framework_Constraint_StringContains
- * @since Method available since Release 3.0.0
- */
- function stringContains($string, $case = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringContains',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
- *
- * @param mixed $suffix
- * @return PHPUnit_Framework_Constraint_StringEndsWith
- * @since Method available since Release 3.4.0
- */
- function stringEndsWith($suffix)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringEndsWith',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
- *
- * @param mixed $prefix
- * @return PHPUnit_Framework_Constraint_StringStartsWith
- * @since Method available since Release 3.4.0
- */
- function stringStartsWith($prefix)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringStartsWith',
- func_get_args()
- );
- }
- /**
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Stub_Exception
- * @since Method available since Release 3.1.0
- */
- function throwException(Exception $exception)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::throwException',
- func_get_args()
- );
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a synthetic failed assertion.
- *
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError
- {
- /**
- * The synthetic file.
- *
- * @var string
- */
- protected $syntheticFile = '';
- /**
- * The synthetic line number.
- *
- * @var int
- */
- protected $syntheticLine = 0;
- /**
- * The synthetic trace.
- *
- * @var array
- */
- protected $syntheticTrace = array();
- /**
- * Constructor.
- *
- * @param string $message
- * @param int $code
- * @param string $file
- * @param int $line
- * @param array $trace
- */
- public function __construct($message, $code, $file, $line, $trace)
- {
- parent::__construct($message, $code);
- $this->syntheticFile = $file;
- $this->syntheticLine = $line;
- $this->syntheticTrace = $trace;
- }
- /**
- * @return string
- */
- public function getSyntheticFile()
- {
- return $this->syntheticFile;
- }
- /**
- * @return int
- */
- public function getSyntheticLine()
- {
- return $this->syntheticLine;
- }
- /**
- * @return array
- */
- public function getSyntheticTrace()
- {
- return $this->syntheticTrace;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a risky test.
- *
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_RiskyTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_RiskyTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Listener for test progress.
- *
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_TestListener
- {
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time);
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * A test suite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite);
- /**
- * A test suite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite);
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test);
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wraps Exceptions thrown by code under test.
- *
- * Re-instantiates Exceptions thrown by user-space code to retain their original
- * class names, properties, and stack traces (but without arguments).
- *
- * Unlike PHPUnit_Framework_Exception, the complete stack of previous Exceptions
- * is processed.
- *
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_ExceptionWrapper extends PHPUnit_Framework_Exception
- {
- /**
- * @var string
- */
- protected $classname;
- /**
- * @var PHPUnit_Framework_ExceptionWrapper|null
- */
- protected $previous;
- /**
- * @param Throwable|Exception $e
- */
- public function __construct($e)
- {
- // PDOException::getCode() is a string.
- // @see http://php.net/manual/en/class.pdoexception.php#95812
- parent::__construct($e->getMessage(), (int) $e->getCode());
- $this->classname = get_class($e);
- $this->file = $e->getFile();
- $this->line = $e->getLine();
- $this->serializableTrace = $e->getTrace();
- foreach ($this->serializableTrace as $i => $call) {
- unset($this->serializableTrace[$i]['args']);
- }
- if ($e->getPrevious()) {
- $this->previous = new self($e->getPrevious());
- }
- }
- /**
- * @return string
- */
- public function getClassname()
- {
- return $this->classname;
- }
- /**
- * @return PHPUnit_Framework_ExceptionWrapper
- */
- public function getPreviousWrapped()
- {
- return $this->previous;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $string = PHPUnit_Framework_TestFailure::exceptionToString($this);
- if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) {
- $string .= "\n" . $trace;
- }
- if ($this->previous) {
- $string .= "\nCaused by\n" . $this->previous;
- }
- return $string;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking a unit test as being skipped.
- *
- * @since Interface available since Release 3.0.0
- */
- interface PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_InvalidCoversTargetException extends PHPUnit_Framework_CodeCoverageException
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\GlobalState\Snapshot;
- use SebastianBergmann\GlobalState\Restorer;
- use SebastianBergmann\GlobalState\Blacklist;
- use SebastianBergmann\Diff\Differ;
- use SebastianBergmann\Exporter\Exporter;
- use Prophecy\Exception\Prediction\PredictionException;
- use Prophecy\Prophet;
- /**
- * A TestCase defines the fixture to run multiple tests.
- *
- * To define a TestCase
- *
- * 1) Implement a subclass of PHPUnit_Framework_TestCase.
- * 2) Define instance variables that store the state of the fixture.
- * 3) Initialize the fixture state by overriding setUp().
- * 4) Clean-up after a test by overriding tearDown().
- *
- * Each test runs in its own fixture so there can be no side effects
- * among test runs.
- *
- * Here is an example:
- *
- * <code>
- * <?php
- * class MathTest extends PHPUnit_Framework_TestCase
- * {
- * public $value1;
- * public $value2;
- *
- * protected function setUp()
- * {
- * $this->value1 = 2;
- * $this->value2 = 3;
- * }
- * }
- * ?>
- * </code>
- *
- * For each test implement a method which interacts with the fixture.
- * Verify the expected results with assertions specified by calling
- * assert with a boolean.
- *
- * <code>
- * <?php
- * public function testPass()
- * {
- * $this->assertTrue($this->value1 + $this->value2 == 5);
- * }
- * ?>
- * </code>
- *
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * Enable or disable the backup and restoration of the $GLOBALS array.
- * Overwrite this attribute in a child class of TestCase.
- * Setting this attribute in setUp() has no effect!
- *
- * @var bool
- */
- protected $backupGlobals = null;
- /**
- * @var array
- */
- protected $backupGlobalsBlacklist = array();
- /**
- * Enable or disable the backup and restoration of static attributes.
- * Overwrite this attribute in a child class of TestCase.
- * Setting this attribute in setUp() has no effect!
- *
- * @var bool
- */
- protected $backupStaticAttributes = null;
- /**
- * @var array
- */
- protected $backupStaticAttributesBlacklist = array();
- /**
- * Whether or not this test is to be run in a separate PHP process.
- *
- * @var bool
- */
- protected $runTestInSeparateProcess = null;
- /**
- * Whether or not this test should preserve the global state when
- * running in a separate PHP process.
- *
- * @var bool
- */
- protected $preserveGlobalState = true;
- /**
- * Whether or not this test is running in a separate PHP process.
- *
- * @var bool
- */
- private $inIsolation = false;
- /**
- * @var array
- */
- private $data = array();
- /**
- * @var string
- */
- private $dataName = '';
- /**
- * @var bool
- */
- private $useErrorHandler = null;
- /**
- * The name of the expected Exception.
- *
- * @var mixed
- */
- private $expectedException = null;
- /**
- * The message of the expected Exception.
- *
- * @var string
- */
- private $expectedExceptionMessage = '';
- /**
- * The regex pattern to validate the expected Exception message.
- *
- * @var string
- */
- private $expectedExceptionMessageRegExp = '';
- /**
- * The code of the expected Exception.
- *
- * @var int
- */
- private $expectedExceptionCode;
- /**
- * The name of the test case.
- *
- * @var string
- */
- private $name = null;
- /**
- * @var array
- */
- private $dependencies = array();
- /**
- * @var array
- */
- private $dependencyInput = array();
- /**
- * @var array
- */
- private $iniSettings = array();
- /**
- * @var array
- */
- private $locale = array();
- /**
- * @var array
- */
- private $mockObjects = array();
- /**
- * @var array
- */
- private $mockObjectGenerator = null;
- /**
- * @var int
- */
- private $status;
- /**
- * @var string
- */
- private $statusMessage = '';
- /**
- * @var int
- */
- private $numAssertions = 0;
- /**
- * @var PHPUnit_Framework_TestResult
- */
- private $result;
- /**
- * @var mixed
- */
- private $testResult;
- /**
- * @var string
- */
- private $output = '';
- /**
- * @var string
- */
- private $outputExpectedRegex = null;
- /**
- * @var string
- */
- private $outputExpectedString = null;
- /**
- * @var mixed
- */
- private $outputCallback = false;
- /**
- * @var bool
- */
- private $outputBufferingActive = false;
- /**
- * @var int
- */
- private $outputBufferingLevel;
- /**
- * @var SebastianBergmann\GlobalState\Snapshot
- */
- private $snapshot;
- /**
- * @var Prophecy\Prophet
- */
- private $prophet;
- /**
- * @var bool
- */
- private $disallowChangesToGlobalState = false;
- /**
- * Constructs a test case with the given name.
- *
- * @param string $name
- * @param array $data
- * @param string $dataName
- */
- public function __construct($name = null, array $data = array(), $dataName = '')
- {
- if ($name !== null) {
- $this->setName($name);
- }
- $this->data = $data;
- $this->dataName = $dataName;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- $class = new ReflectionClass($this);
- $buffer = sprintf(
- '%s::%s',
- $class->name,
- $this->getName(false)
- );
- return $buffer . $this->getDataSetAsString();
- }
- /**
- * Counts the number of test cases executed by run(TestResult result).
- *
- * @return int
- */
- public function count()
- {
- return 1;
- }
- /**
- * Returns the annotations for this test.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function getAnnotations()
- {
- return PHPUnit_Util_Test::parseTestMethodAnnotations(
- get_class($this),
- $this->name
- );
- }
- /**
- * Gets the name of a TestCase.
- *
- * @param bool $withDataSet
- * @return string
- */
- public function getName($withDataSet = true)
- {
- if ($withDataSet) {
- return $this->name . $this->getDataSetAsString(false);
- } else {
- return $this->name;
- }
- }
- /**
- * Returns the size of the test.
- *
- * @return int
- * @since Method available since Release 3.6.0
- */
- public function getSize()
- {
- return PHPUnit_Util_Test::getSize(
- get_class($this),
- $this->getName(false)
- );
- }
- /**
- * @return string
- * @since Method available since Release 3.6.0
- */
- public function getActualOutput()
- {
- if (!$this->outputBufferingActive) {
- return $this->output;
- } else {
- return ob_get_contents();
- }
- }
- /**
- * @return bool
- * @since Method available since Release 3.6.0
- */
- public function hasOutput()
- {
- if (strlen($this->output) === 0) {
- return false;
- }
- if ($this->hasExpectationOnOutput()) {
- return false;
- }
- return true;
- }
- /**
- * @param string $expectedRegex
- * @since Method available since Release 3.6.0
- * @throws PHPUnit_Framework_Exception
- */
- public function expectOutputRegex($expectedRegex)
- {
- if ($this->outputExpectedString !== null) {
- throw new PHPUnit_Framework_Exception;
- }
- if (is_string($expectedRegex) || is_null($expectedRegex)) {
- $this->outputExpectedRegex = $expectedRegex;
- }
- }
- /**
- * @param string $expectedString
- * @since Method available since Release 3.6.0
- */
- public function expectOutputString($expectedString)
- {
- if ($this->outputExpectedRegex !== null) {
- throw new PHPUnit_Framework_Exception;
- }
- if (is_string($expectedString) || is_null($expectedString)) {
- $this->outputExpectedString = $expectedString;
- }
- }
- /**
- * @return bool
- * @since Method available since Release 3.6.5
- * @deprecated
- */
- public function hasPerformedExpectationsOnOutput()
- {
- return $this->hasExpectationOnOutput();
- }
- /**
- * @return bool
- * @since Method available since Release 4.3.3
- */
- public function hasExpectationOnOutput()
- {
- return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex);
- }
- /**
- * @return string
- * @since Method available since Release 3.2.0
- */
- public function getExpectedException()
- {
- return $this->expectedException;
- }
- /**
- * @param mixed $exceptionName
- * @param string $exceptionMessage
- * @param int $exceptionCode
- * @since Method available since Release 3.2.0
- */
- public function setExpectedException($exceptionName, $exceptionMessage = '', $exceptionCode = null)
- {
- $this->expectedException = $exceptionName;
- $this->expectedExceptionMessage = $exceptionMessage;
- $this->expectedExceptionCode = $exceptionCode;
- }
- /**
- * @param mixed $exceptionName
- * @param string $exceptionMessageRegExp
- * @param int $exceptionCode
- * @since Method available since Release 4.3.0
- */
- public function setExpectedExceptionRegExp($exceptionName, $exceptionMessageRegExp = '', $exceptionCode = null)
- {
- $this->expectedException = $exceptionName;
- $this->expectedExceptionMessageRegExp = $exceptionMessageRegExp;
- $this->expectedExceptionCode = $exceptionCode;
- }
- /**
- * @since Method available since Release 3.4.0
- */
- protected function setExpectedExceptionFromAnnotation()
- {
- try {
- $expectedException = PHPUnit_Util_Test::getExpectedException(
- get_class($this),
- $this->name
- );
- if ($expectedException !== false) {
- $this->setExpectedException(
- $expectedException['class'],
- $expectedException['message'],
- $expectedException['code']
- );
- if (!empty($expectedException['message_regex'])) {
- $this->setExpectedExceptionRegExp(
- $expectedException['class'],
- $expectedException['message_regex'],
- $expectedException['code']
- );
- }
- }
- } catch (ReflectionException $e) {
- }
- }
- /**
- * @param bool $useErrorHandler
- * @since Method available since Release 3.4.0
- */
- public function setUseErrorHandler($useErrorHandler)
- {
- $this->useErrorHandler = $useErrorHandler;
- }
- /**
- * @since Method available since Release 3.4.0
- */
- protected function setUseErrorHandlerFromAnnotation()
- {
- try {
- $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings(
- get_class($this),
- $this->name
- );
- if ($useErrorHandler !== null) {
- $this->setUseErrorHandler($useErrorHandler);
- }
- } catch (ReflectionException $e) {
- }
- }
- /**
- * @since Method available since Release 3.6.0
- */
- protected function checkRequirements()
- {
- if (!$this->name || !method_exists($this, $this->name)) {
- return;
- }
- $missingRequirements = PHPUnit_Util_Test::getMissingRequirements(
- get_class($this),
- $this->name
- );
- if ($missingRequirements) {
- $this->markTestSkipped(implode(PHP_EOL, $missingRequirements));
- }
- }
- /**
- * Returns the status of this test.
- *
- * @return int
- * @since Method available since Release 3.1.0
- */
- public function getStatus()
- {
- return $this->status;
- }
- /**
- * Returns the status message of this test.
- *
- * @return string
- * @since Method available since Release 3.3.0
- */
- public function getStatusMessage()
- {
- return $this->statusMessage;
- }
- /**
- * Returns whether or not this test has failed.
- *
- * @return bool
- * @since Method available since Release 3.0.0
- */
- public function hasFailed()
- {
- $status = $this->getStatus();
- return $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE ||
- $status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- }
- /**
- * Runs the test case and collects the results in a TestResult object.
- * If no TestResult object is passed a new one will be created.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- if (!$this instanceof PHPUnit_Framework_Warning) {
- $this->setTestResultObject($result);
- $this->setUseErrorHandlerFromAnnotation();
- }
- if ($this->useErrorHandler !== null) {
- $oldErrorHandlerSetting = $result->getConvertErrorsToExceptions();
- $result->convertErrorsToExceptions($this->useErrorHandler);
- }
- if (!$this instanceof PHPUnit_Framework_Warning && !$this->handleDependencies()) {
- return;
- }
- if ($this->runTestInSeparateProcess === true &&
- $this->inIsolation !== true &&
- !$this instanceof PHPUnit_Extensions_SeleniumTestCase &&
- !$this instanceof PHPUnit_Extensions_PhptTestCase) {
- $class = new ReflectionClass($this);
- $template = new Text_Template(
- __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl'
- );
- if ($this->preserveGlobalState) {
- $constants = PHPUnit_Util_GlobalState::getConstantsAsString();
- $globals = PHPUnit_Util_GlobalState::getGlobalsAsString();
- $includedFiles = PHPUnit_Util_GlobalState::getIncludedFilesAsString();
- $iniSettings = PHPUnit_Util_GlobalState::getIniSettingsAsString();
- } else {
- $constants = '';
- if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) {
- $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n";
- } else {
- $globals = '';
- }
- $includedFiles = '';
- $iniSettings = '';
- }
- $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false';
- $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false';
- $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false';
- $isStrictAboutTestSize = $result->isStrictAboutTestSize() ? 'true' : 'false';
- $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false';
- if (defined('PHPUNIT_COMPOSER_INSTALL')) {
- $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true);
- } else {
- $composerAutoload = '\'\'';
- }
- if (defined('__PHPUNIT_PHAR__')) {
- $phar = var_export(__PHPUNIT_PHAR__, true);
- } else {
- $phar = '\'\'';
- }
- if ($result->getCodeCoverage()) {
- $codeCoverageFilter = $result->getCodeCoverage()->filter();
- } else {
- $codeCoverageFilter = null;
- }
- $data = var_export(serialize($this->data), true);
- $dataName = var_export($this->dataName, true);
- $dependencyInput = var_export(serialize($this->dependencyInput), true);
- $includePath = var_export(get_include_path(), true);
- $codeCoverageFilter = var_export(serialize($codeCoverageFilter), true);
- // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC
- // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences
- $data = "'." . $data . ".'";
- $dataName = "'.(" . $dataName . ").'";
- $dependencyInput = "'." . $dependencyInput . ".'";
- $includePath = "'." . $includePath . ".'";
- $codeCoverageFilter = "'." . $codeCoverageFilter . ".'";
- $template->setVar(
- array(
- 'composerAutoload' => $composerAutoload,
- 'phar' => $phar,
- 'filename' => $class->getFileName(),
- 'className' => $class->getName(),
- 'methodName' => $this->name,
- 'collectCodeCoverageInformation' => $coverage,
- 'data' => $data,
- 'dataName' => $dataName,
- 'dependencyInput' => $dependencyInput,
- 'constants' => $constants,
- 'globals' => $globals,
- 'include_path' => $includePath,
- 'included_files' => $includedFiles,
- 'iniSettings' => $iniSettings,
- 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything,
- 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests,
- 'isStrictAboutTestSize' => $isStrictAboutTestSize,
- 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests,
- 'codeCoverageFilter' => $codeCoverageFilter
- )
- );
- $this->prepareTemplate($template);
- $php = PHPUnit_Util_PHP::factory();
- $php->runTestJob($template->render(), $this, $result);
- } else {
- $result->run($this);
- }
- if ($this->useErrorHandler !== null) {
- $result->convertErrorsToExceptions($oldErrorHandlerSetting);
- }
- $this->result = null;
- return $result;
- }
- /**
- * Runs the bare test sequence.
- */
- public function runBare()
- {
- $this->numAssertions = 0;
- $this->snapshotGlobalState();
- $this->startOutputBuffering();
- clearstatcache();
- $currentWorkingDirectory = getcwd();
- $hookMethods = PHPUnit_Util_Test::getHookMethods(get_class($this));
- try {
- $hasMetRequirements = false;
- $this->checkRequirements();
- $hasMetRequirements = true;
- if ($this->inIsolation) {
- foreach ($hookMethods['beforeClass'] as $method) {
- $this->$method();
- }
- }
- $this->setExpectedExceptionFromAnnotation();
- foreach ($hookMethods['before'] as $method) {
- $this->$method();
- }
- $this->assertPreConditions();
- $this->testResult = $this->runTest();
- $this->verifyMockObjects();
- $this->assertPostConditions();
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
- } catch (PHPUnit_Framework_IncompleteTest $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
- $this->statusMessage = $e->getMessage();
- } catch (PHPUnit_Framework_SkippedTest $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
- $this->statusMessage = $e->getMessage();
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->statusMessage = $e->getMessage();
- } catch (PredictionException $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->statusMessage = $e->getMessage();
- } catch (Throwable $_e) {
- $e = $_e;
- } catch (Exception $_e) {
- $e = $_e;
- }
- if (isset($e)) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- $this->statusMessage = $e->getMessage();
- }
- // Clean up the mock objects.
- $this->mockObjects = array();
- $this->prophet = null;
- // Tear down the fixture. An exception raised in tearDown() will be
- // caught and passed on when no exception was raised before.
- try {
- if ($hasMetRequirements) {
- foreach ($hookMethods['after'] as $method) {
- $this->$method();
- }
- if ($this->inIsolation) {
- foreach ($hookMethods['afterClass'] as $method) {
- $this->$method();
- }
- }
- }
- } catch (Throwable $_e) {
- if (!isset($e)) {
- $e = $_e;
- }
- } catch (Exception $_e) {
- if (!isset($e)) {
- $e = $_e;
- }
- }
- try {
- $this->stopOutputBuffering();
- } catch (PHPUnit_Framework_RiskyTestError $_e) {
- if (!isset($e)) {
- $e = $_e;
- }
- }
- clearstatcache();
- if ($currentWorkingDirectory != getcwd()) {
- chdir($currentWorkingDirectory);
- }
- $this->restoreGlobalState();
- // Clean up INI settings.
- foreach ($this->iniSettings as $varName => $oldValue) {
- ini_set($varName, $oldValue);
- }
- $this->iniSettings = array();
- // Clean up locale settings.
- foreach ($this->locale as $category => $locale) {
- setlocale($category, $locale);
- }
- // Perform assertion on output.
- if (!isset($e)) {
- try {
- if ($this->outputExpectedRegex !== null) {
- $this->assertRegExp($this->outputExpectedRegex, $this->output);
- } elseif ($this->outputExpectedString !== null) {
- $this->assertEquals($this->outputExpectedString, $this->output);
- }
- } catch (Throwable $_e) {
- $e = $_e;
- } catch (Exception $_e) {
- $e = $_e;
- }
- }
- // Workaround for missing "finally".
- if (isset($e)) {
- if ($e instanceof PredictionException) {
- $e = new PHPUnit_Framework_AssertionFailedError($e->getMessage());
- }
- $this->onNotSuccessfulTest($e);
- }
- }
- /**
- * Override to run the test and assert its state.
- *
- * @return mixed
- * @throws Exception|PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- if ($this->name === null) {
- throw new PHPUnit_Framework_Exception(
- 'PHPUnit_Framework_TestCase::$name must not be null.'
- );
- }
- try {
- $class = new ReflectionClass($this);
- $method = $class->getMethod($this->name);
- } catch (ReflectionException $e) {
- $this->fail($e->getMessage());
- }
- try {
- $testResult = $method->invokeArgs(
- $this,
- array_merge($this->data, $this->dependencyInput)
- );
- } catch (Throwable $_e) {
- $e = $_e;
- } catch (Exception $_e) {
- $e = $_e;
- }
- if (isset($e)) {
- $checkException = false;
- if (is_string($this->expectedException)) {
- $checkException = true;
- if ($e instanceof PHPUnit_Framework_Exception) {
- $checkException = false;
- }
- $reflector = new ReflectionClass($this->expectedException);
- if ($this->expectedException == 'PHPUnit_Framework_Exception' ||
- $reflector->isSubclassOf('PHPUnit_Framework_Exception')) {
- $checkException = true;
- }
- }
- if ($checkException) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_Exception(
- $this->expectedException
- )
- );
- if (is_string($this->expectedExceptionMessage) &&
- !empty($this->expectedExceptionMessage)) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionMessage(
- $this->expectedExceptionMessage
- )
- );
- }
- if (is_string($this->expectedExceptionMessageRegExp) &&
- !empty($this->expectedExceptionMessageRegExp)) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionMessageRegExp(
- $this->expectedExceptionMessageRegExp
- )
- );
- }
- if ($this->expectedExceptionCode !== null) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionCode(
- $this->expectedExceptionCode
- )
- );
- }
- return;
- } else {
- throw $e;
- }
- }
- if ($this->expectedException !== null) {
- $this->assertThat(
- null,
- new PHPUnit_Framework_Constraint_Exception(
- $this->expectedException
- )
- );
- }
- return $testResult;
- }
- /**
- * Verifies the mock object expectations.
- *
- * @since Method available since Release 3.5.0
- */
- protected function verifyMockObjects()
- {
- foreach ($this->mockObjects as $mockObject) {
- if ($mockObject->__phpunit_hasMatchers()) {
- $this->numAssertions++;
- }
- $mockObject->__phpunit_verify();
- }
- if ($this->prophet !== null) {
- try {
- $this->prophet->checkPredictions();
- } catch (Throwable $t) {
- /* Intentionally left empty */
- } catch (Exception $e) {
- /* Intentionally left empty */
- }
- foreach ($this->prophet->getProphecies() as $objectProphecy) {
- foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) {
- foreach ($methodProphecies as $methodProphecy) {
- $this->numAssertions += count($methodProphecy->getCheckedPredictions());
- }
- }
- }
- if (isset($e)) {
- throw $e;
- }
- }
- }
- /**
- * Sets the name of a TestCase.
- *
- * @param string
- */
- public function setName($name)
- {
- $this->name = $name;
- }
- /**
- * Sets the dependencies of a TestCase.
- *
- * @param array $dependencies
- * @since Method available since Release 3.4.0
- */
- public function setDependencies(array $dependencies)
- {
- $this->dependencies = $dependencies;
- }
- /**
- * Returns true if the tests has dependencies
- *
- * @return bool
- * @since Method available since Release 4.0.0
- */
- public function hasDependencies()
- {
- return count($this->dependencies) > 0;
- }
- /**
- * Sets
- *
- * @param array $dependencyInput
- * @since Method available since Release 3.4.0
- */
- public function setDependencyInput(array $dependencyInput)
- {
- $this->dependencyInput = $dependencyInput;
- }
- /**
- * @param bool $disallowChangesToGlobalState
- * @since Method available since Release 4.6.0
- */
- public function setDisallowChangesToGlobalState($disallowChangesToGlobalState)
- {
- $this->disallowChangesToGlobalState = $disallowChangesToGlobalState;
- }
- /**
- * Calling this method in setUp() has no effect!
- *
- * @param bool $backupGlobals
- * @since Method available since Release 3.3.0
- */
- public function setBackupGlobals($backupGlobals)
- {
- if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
- $this->backupGlobals = $backupGlobals;
- }
- }
- /**
- * Calling this method in setUp() has no effect!
- *
- * @param bool $backupStaticAttributes
- * @since Method available since Release 3.4.0
- */
- public function setBackupStaticAttributes($backupStaticAttributes)
- {
- if (is_null($this->backupStaticAttributes) &&
- is_bool($backupStaticAttributes)) {
- $this->backupStaticAttributes = $backupStaticAttributes;
- }
- }
- /**
- * @param bool $runTestInSeparateProcess
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setRunTestInSeparateProcess($runTestInSeparateProcess)
- {
- if (is_bool($runTestInSeparateProcess)) {
- if ($this->runTestInSeparateProcess === null) {
- $this->runTestInSeparateProcess = $runTestInSeparateProcess;
- }
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @param bool $preserveGlobalState
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setPreserveGlobalState($preserveGlobalState)
- {
- if (is_bool($preserveGlobalState)) {
- $this->preserveGlobalState = $preserveGlobalState;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @param bool $inIsolation
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setInIsolation($inIsolation)
- {
- if (is_bool($inIsolation)) {
- $this->inIsolation = $inIsolation;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @return bool
- * @since Method available since Release 4.3.0
- */
- public function isInIsolation()
- {
- return $this->inIsolation;
- }
- /**
- * @return mixed
- * @since Method available since Release 3.4.0
- */
- public function getResult()
- {
- return $this->testResult;
- }
- /**
- * @param mixed $result
- * @since Method available since Release 3.4.0
- */
- public function setResult($result)
- {
- $this->testResult = $result;
- }
- /**
- * @param callable $callback
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setOutputCallback($callback)
- {
- if (!is_callable($callback)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback');
- }
- $this->outputCallback = $callback;
- }
- /**
- * @return PHPUnit_Framework_TestResult
- * @since Method available since Release 3.5.7
- */
- public function getTestResultObject()
- {
- return $this->result;
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 3.6.0
- */
- public function setTestResultObject(PHPUnit_Framework_TestResult $result)
- {
- $this->result = $result;
- }
- /**
- * This method is a wrapper for the ini_set() function that automatically
- * resets the modified php.ini setting to its original value after the
- * test is run.
- *
- * @param string $varName
- * @param string $newValue
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- protected function iniSet($varName, $newValue)
- {
- if (!is_string($varName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $currentValue = ini_set($varName, $newValue);
- if ($currentValue !== false) {
- $this->iniSettings[$varName] = $currentValue;
- } else {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'INI setting "%s" could not be set to "%s".',
- $varName,
- $newValue
- )
- );
- }
- }
- /**
- * This method is a wrapper for the setlocale() function that automatically
- * resets the locale to its original value after the test is run.
- *
- * @param int $category
- * @param string $locale
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- protected function setLocale()
- {
- $args = func_get_args();
- if (count($args) < 2) {
- throw new PHPUnit_Framework_Exception;
- }
- $category = $args[0];
- $locale = $args[1];
- $categories = array(
- LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME
- );
- if (defined('LC_MESSAGES')) {
- $categories[] = LC_MESSAGES;
- }
- if (!in_array($category, $categories)) {
- throw new PHPUnit_Framework_Exception;
- }
- if (!is_array($locale) && !is_string($locale)) {
- throw new PHPUnit_Framework_Exception;
- }
- $this->locale[$category] = setlocale($category, null);
- $result = call_user_func_array('setlocale', $args);
- if ($result === false) {
- throw new PHPUnit_Framework_Exception(
- 'The locale functionality is not implemented on your platform, ' .
- 'the specified locale does not exist or the category name is ' .
- 'invalid.'
- );
- }
- }
- /**
- * Returns a mock object for the specified class.
- *
- * @param string $originalClassName Name of the class to mock.
- * @param array|null $methods When provided, only methods whose names are in the array
- * are replaced with a configurable test double. The behavior
- * of the other methods is not changed.
- * Providing null means that no methods will be replaced.
- * @param array $arguments Parameters to pass to the original class' constructor.
- * @param string $mockClassName Class name for the generated test double class.
- * @param bool $callOriginalConstructor Can be used to disable the call to the original class' constructor.
- * @param bool $callOriginalClone Can be used to disable the call to the original class' clone constructor.
- * @param bool $callAutoload Can be used to disable __autoload() during the generation of the test double class.
- * @param bool $cloneArguments
- * @param bool $callOriginalMethods
- * @return PHPUnit_Framework_MockObject_MockObject
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns a builder object to create mock objects using a fluent interface.
- *
- * @param string $className
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 3.5.0
- */
- public function getMockBuilder($className)
- {
- return new PHPUnit_Framework_MockObject_MockBuilder($this, $className);
- }
- /**
- * Mocks the specified class and returns the name of the mocked class.
- *
- * @param string $originalClassName
- * @param array $methods
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param bool $cloneArguments
- * @return string
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- protected function getMockClass($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false)
- {
- $mock = $this->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- return get_class($mock);
- }
- /**
- * Returns a mock object for the specified abstract class with all abstract
- * methods of the class mocked. Concrete methods are not mocked by default.
- * To mock concrete methods, use the 7th parameter ($mockedMethods).
- *
- * @param string $originalClassName
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param array $mockedMethods
- * @param bool $cloneArguments
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 3.4.0
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass(
- $originalClassName,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $mockedMethods,
- $cloneArguments
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns a mock object based on the given WSDL file.
- *
- * @param string $wsdlFile
- * @param string $originalClassName
- * @param string $mockClassName
- * @param array $methods
- * @param bool $callOriginalConstructor
- * @param array $options An array of options passed to SOAPClient::_construct
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 3.4.0
- */
- protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = array(), $callOriginalConstructor = true, array $options = array())
- {
- if ($originalClassName === '') {
- $originalClassName = str_replace('.wsdl', '', basename($wsdlFile));
- }
- if (!class_exists($originalClassName)) {
- eval(
- $this->getMockObjectGenerator()->generateClassFromWsdl(
- $wsdlFile,
- $originalClassName,
- $methods,
- $options
- )
- );
- }
- return $this->getMock(
- $originalClassName,
- $methods,
- array('', $options),
- $mockClassName,
- $callOriginalConstructor,
- false,
- false
- );
- }
- /**
- * Returns a mock object for the specified trait with all abstract methods
- * of the trait mocked. Concrete methods to mock can be specified with the
- * `$mockedMethods` parameter.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $mockClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param array $mockedMethods
- * @param bool $cloneArguments
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 4.0.0
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForTrait($traitName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMockForTrait(
- $traitName,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $mockedMethods,
- $cloneArguments
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns an object for the specified trait.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $traitClassName
- * @param bool $callOriginalConstructor
- * @param bool $callOriginalClone
- * @param bool $callAutoload
- * @param bool $cloneArguments
- * @return object
- * @since Method available since Release 3.6.0
- * @throws PHPUnit_Framework_Exception
- */
- protected function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false)
- {
- return $this->getMockObjectGenerator()->getObjectForTrait(
- $traitName,
- $arguments,
- $traitClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- }
- /**
- * @param string|null $classOrInterface
- * @return \Prophecy\Prophecy\ObjectProphecy
- * @throws \LogicException
- * @since Method available since Release 4.5.0
- */
- protected function prophesize($classOrInterface = null)
- {
- return $this->getProphet()->prophesize($classOrInterface);
- }
- /**
- * Adds a value to the assertion counter.
- *
- * @param int $count
- * @since Method available since Release 3.3.3
- */
- public function addToAssertionCount($count)
- {
- $this->numAssertions += $count;
- }
- /**
- * Returns the number of assertions performed by this test.
- *
- * @return int
- * @since Method available since Release 3.3.0
- */
- public function getNumAssertions()
- {
- return $this->numAssertions;
- }
- /**
- * Returns a matcher that matches when the method is executed
- * zero or more times.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function any()
- {
- return new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount;
- }
- /**
- * Returns a matcher that matches when the method is never executed.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function never()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(0);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at least N times.
- *
- * @param int $requiredInvocations
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount
- * @since Method available since Release 4.2.0
- */
- public static function atLeast($requiredInvocations)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount(
- $requiredInvocations
- );
- }
- /**
- * Returns a matcher that matches when the method is executed at least once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
- * @since Method available since Release 3.0.0
- */
- public static function atLeastOnce()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce;
- }
- /**
- * Returns a matcher that matches when the method is executed exactly once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function once()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(1);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * exactly $count times.
- *
- * @param int $count
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function exactly($count)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount($count);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at most N times.
- *
- * @param int $allowedInvocations
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount
- * @since Method available since Release 4.2.0
- */
- public static function atMost($allowedInvocations)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount(
- $allowedInvocations
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at the given index.
- *
- * @param int $index
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
- * @since Method available since Release 3.0.0
- */
- public static function at($index)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index);
- }
- /**
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Stub_Return
- * @since Method available since Release 3.0.0
- */
- public static function returnValue($value)
- {
- return new PHPUnit_Framework_MockObject_Stub_Return($value);
- }
- /**
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
- * @since Method available since Release 3.6.0
- */
- public static function returnValueMap(array $valueMap)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap);
- }
- /**
- * @param int $argumentIndex
- * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
- * @since Method available since Release 3.3.0
- */
- public static function returnArgument($argumentIndex)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnArgument(
- $argumentIndex
- );
- }
- /**
- * @param mixed $callback
- * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
- * @since Method available since Release 3.3.0
- */
- public static function returnCallback($callback)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnCallback($callback);
- }
- /**
- * Returns the current object.
- *
- * This method is useful when mocking a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
- * @since Method available since Release 3.6.0
- */
- public static function returnSelf()
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnSelf();
- }
- /**
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Stub_Exception
- * @since Method available since Release 3.1.0
- */
- public static function throwException(Exception $exception)
- {
- return new PHPUnit_Framework_MockObject_Stub_Exception($exception);
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
- * @since Method available since Release 3.0.0
- */
- public static function onConsecutiveCalls()
- {
- $args = func_get_args();
- return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args);
- }
- /**
- * Gets the data set description of a TestCase.
- *
- * @param bool $includeData
- * @return string
- * @since Method available since Release 3.3.0
- */
- protected function getDataSetAsString($includeData = true)
- {
- $buffer = '';
- if (!empty($this->data)) {
- if (is_int($this->dataName)) {
- $buffer .= sprintf(' with data set #%d', $this->dataName);
- } else {
- $buffer .= sprintf(' with data set "%s"', $this->dataName);
- }
- $exporter = new Exporter;
- if ($includeData) {
- $buffer .= sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data));
- }
- }
- return $buffer;
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * @since Method available since Release 3.5.4
- */
- protected function handleDependencies()
- {
- if (!empty($this->dependencies) && !$this->inIsolation) {
- $className = get_class($this);
- $passed = $this->result->passed();
- $passedKeys = array_keys($passed);
- $numKeys = count($passedKeys);
- for ($i = 0; $i < $numKeys; $i++) {
- $pos = strpos($passedKeys[$i], ' with data set');
- if ($pos !== false) {
- $passedKeys[$i] = substr($passedKeys[$i], 0, $pos);
- }
- }
- $passedKeys = array_flip(array_unique($passedKeys));
- foreach ($this->dependencies as $dependency) {
- if (strpos($dependency, '::') === false) {
- $dependency = $className . '::' . $dependency;
- }
- if (!isset($passedKeys[$dependency])) {
- $this->result->addError(
- $this,
- new PHPUnit_Framework_SkippedTestError(
- sprintf(
- 'This test depends on "%s" to pass.',
- $dependency
- )
- ),
- 0
- );
- return false;
- }
- if (isset($passed[$dependency])) {
- if ($passed[$dependency]['size'] != PHPUnit_Util_Test::UNKNOWN &&
- $this->getSize() != PHPUnit_Util_Test::UNKNOWN &&
- $passed[$dependency]['size'] > $this->getSize()) {
- $this->result->addError(
- $this,
- new PHPUnit_Framework_SkippedTestError(
- 'This test depends on a test that is larger than itself.'
- ),
- 0
- );
- return false;
- }
- $this->dependencyInput[$dependency] = $passed[$dependency]['result'];
- } else {
- $this->dependencyInput[$dependency] = null;
- }
- }
- }
- return true;
- }
- /**
- * This method is called before the first test of this test class is run.
- *
- * @since Method available since Release 3.4.0
- */
- public static function setUpBeforeClass()
- {
- }
- /**
- * Sets up the fixture, for example, open a network connection.
- * This method is called before a test is executed.
- */
- protected function setUp()
- {
- }
- /**
- * Performs assertions shared by all tests of a test case.
- *
- * This method is called before the execution of a test starts
- * and after setUp() is called.
- *
- * @since Method available since Release 3.2.8
- */
- protected function assertPreConditions()
- {
- }
- /**
- * Performs assertions shared by all tests of a test case.
- *
- * This method is called before the execution of a test ends
- * and before tearDown() is called.
- *
- * @since Method available since Release 3.2.8
- */
- protected function assertPostConditions()
- {
- }
- /**
- * Tears down the fixture, for example, close a network connection.
- * This method is called after a test is executed.
- */
- protected function tearDown()
- {
- }
- /**
- * This method is called after the last test of this test class is run.
- *
- * @since Method available since Release 3.4.0
- */
- public static function tearDownAfterClass()
- {
- }
- /**
- * This method is called when a test method did not execute successfully.
- *
- * @param Exception $e
- * @since Method available since Release 3.4.0
- * @throws Exception
- */
- protected function onNotSuccessfulTest(Exception $e)
- {
- throw $e;
- }
- /**
- * Performs custom preparations on the process isolation template.
- *
- * @param Text_Template $template
- * @since Method available since Release 3.4.0
- */
- protected function prepareTemplate(Text_Template $template)
- {
- }
- /**
- * Get the mock object generator, creating it if it doesn't exist.
- *
- * @return PHPUnit_Framework_MockObject_Generator
- */
- protected function getMockObjectGenerator()
- {
- if (null === $this->mockObjectGenerator) {
- $this->mockObjectGenerator = new PHPUnit_Framework_MockObject_Generator;
- }
- return $this->mockObjectGenerator;
- }
- /**
- * @since Method available since Release 4.2.0
- */
- private function startOutputBuffering()
- {
- while (!defined('PHPUNIT_TESTSUITE') && ob_get_level() > 0) {
- ob_end_clean();
- }
- ob_start();
- $this->outputBufferingActive = true;
- $this->outputBufferingLevel = ob_get_level();
- }
- /**
- * @since Method available since Release 4.2.0
- */
- private function stopOutputBuffering()
- {
- if (ob_get_level() != $this->outputBufferingLevel) {
- while (ob_get_level() > 0) {
- ob_end_clean();
- }
- throw new PHPUnit_Framework_RiskyTestError(
- 'Test code or tested code did not (only) close its own output buffers'
- );
- }
- $output = ob_get_contents();
- if ($this->outputCallback === false) {
- $this->output = $output;
- } else {
- $this->output = call_user_func_array(
- $this->outputCallback,
- array($output)
- );
- }
- ob_end_clean();
- $this->outputBufferingActive = false;
- $this->outputBufferingLevel = ob_get_level();
- }
- private function snapshotGlobalState()
- {
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($this->runTestInSeparateProcess || $this->inIsolation ||
- (!$backupGlobals && !$this->backupStaticAttributes)) {
- return;
- }
- $this->snapshot = $this->createGlobalStateSnapshot($backupGlobals);
- }
- private function restoreGlobalState()
- {
- if (!$this->snapshot instanceof Snapshot) {
- return;
- }
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($this->disallowChangesToGlobalState) {
- $this->compareGlobalStateSnapshots(
- $this->snapshot,
- $this->createGlobalStateSnapshot($backupGlobals)
- );
- }
- $restorer = new Restorer;
- if ($backupGlobals) {
- $restorer->restoreGlobalVariables($this->snapshot);
- }
- if ($this->backupStaticAttributes) {
- $restorer->restoreStaticAttributes($this->snapshot);
- }
- $this->snapshot = null;
- }
- /**
- * @param bool $backupGlobals
- * @return Snapshot
- */
- private function createGlobalStateSnapshot($backupGlobals)
- {
- $blacklist = new Blacklist;
- foreach ($this->backupGlobalsBlacklist as $globalVariable) {
- $blacklist->addGlobalVariable($globalVariable);
- }
- if (!defined('PHPUNIT_TESTSUITE')) {
- $blacklist->addClassNamePrefix('PHPUnit');
- $blacklist->addClassNamePrefix('File_Iterator');
- $blacklist->addClassNamePrefix('PHP_CodeCoverage');
- $blacklist->addClassNamePrefix('PHP_Invoker');
- $blacklist->addClassNamePrefix('PHP_Timer');
- $blacklist->addClassNamePrefix('PHP_Token');
- $blacklist->addClassNamePrefix('Symfony');
- $blacklist->addClassNamePrefix('Text_Template');
- $blacklist->addClassNamePrefix('Doctrine\Instantiator');
- foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) {
- foreach ($attributes as $attribute) {
- $blacklist->addStaticAttribute($class, $attribute);
- }
- }
- }
- return new Snapshot(
- $blacklist,
- $backupGlobals,
- $this->backupStaticAttributes,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- );
- }
- /**
- * @param Snapshot $before
- * @param Snapshot $after
- * @throws PHPUnit_Framework_RiskyTestError
- */
- private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after)
- {
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($backupGlobals) {
- $this->compareGlobalStateSnapshotPart(
- $before->globalVariables(),
- $after->globalVariables(),
- "--- Global variables before the test\n+++ Global variables after the test\n"
- );
- $this->compareGlobalStateSnapshotPart(
- $before->superGlobalVariables(),
- $after->superGlobalVariables(),
- "--- Super-global variables before the test\n+++ Super-global variables after the test\n"
- );
- }
- if ($this->backupStaticAttributes) {
- $this->compareGlobalStateSnapshotPart(
- $before->staticAttributes(),
- $after->staticAttributes(),
- "--- Static attributes before the test\n+++ Static attributes after the test\n"
- );
- }
- }
- /**
- * @param array $before
- * @param array $after
- * @param string $header
- * @throws PHPUnit_Framework_RiskyTestError
- */
- private function compareGlobalStateSnapshotPart(array $before, array $after, $header)
- {
- if ($before != $after) {
- $differ = new Differ($header);
- $exporter = new Exporter;
- $diff = $differ->diff(
- $exporter->export($before),
- $exporter->export($after)
- );
- throw new PHPUnit_Framework_RiskyTestError(
- $diff
- );
- }
- }
- /**
- * @return Prophecy\Prophet
- * @since Method available since Release 4.5.0
- */
- private function getProphet()
- {
- if ($this->prophet === null) {
- $this->prophet = new Prophet;
- }
- return $this->prophet;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception for expectations which failed their check.
- *
- * The exception contains the error message and optionally a
- * SebastianBergmann\Comparator\ComparisonFailure which is used to
- * generate diff output of the failed expectations.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_ExpectationFailedException extends PHPUnit_Framework_AssertionFailedError
- {
- /**
- * @var SebastianBergmann\Comparator\ComparisonFailure
- */
- protected $comparisonFailure;
- public function __construct($message, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null, Exception $previous = null)
- {
- $this->comparisonFailure = $comparisonFailure;
- parent::__construct($message, 0, $previous);
- }
- /**
- * @return SebastianBergmann\Comparator\ComparisonFailure
- */
- public function getComparisonFailure()
- {
- return $this->comparisonFailure;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP errors.
- *
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_Error extends PHPUnit_Framework_Exception
- {
- /**
- * Constructor.
- *
- * @param string $message
- * @param int $code
- * @param string $file
- * @param int $line
- * @param Exception $previous
- */
- public function __construct($message, $code, $file, $line, Exception $previous = null)
- {
- parent::__construct($message, $code, $previous);
- $this->file = $file;
- $this->line = $line;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Abstract base class for constraints. which are placed upon any value.
- *
- * @since Interface available since Release 3.0.0
- */
- abstract class PHPUnit_Framework_Constraint implements Countable, PHPUnit_Framework_SelfDescribing
- {
- protected $exporter;
- public function __construct()
- {
- $this->exporter = new Exporter;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = false;
- if ($this->matches($other)) {
- $success = true;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return false;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- return 1;
- }
- /**
- * Throws an exception for the given compared value and test description
- *
- * @param mixed $other Evaluated value or object.
- * @param string $description Additional information about the test
- * @param SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- protected function fail($other, $description, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null)
- {
- $failureDescription = sprintf(
- 'Failed asserting that %s.',
- $this->failureDescription($other)
- );
- $additionalFailureDescription = $this->additionalFailureDescription($other);
- if ($additionalFailureDescription) {
- $failureDescription .= "\n" . $additionalFailureDescription;
- }
- if (!empty($description)) {
- $failureDescription = $description . "\n" . $failureDescription;
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- $failureDescription,
- $comparisonFailure
- );
- }
- /**
- * Return additional failure description where needed
- *
- * The function can be overridden to provide additional failure
- * information like a diff
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function additionalFailureDescription($other)
- {
- return '';
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * To provide additional failure information additionalFailureDescription
- * can be used.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $this->exporter->export($other) . ' ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown when an assertion failed.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_AssertionFailedError extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing
- {
- /**
- * Wrapper for getMessage() which is declared as final.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getMessage();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An incomplete test case
- *
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_IncompleteTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var bool
- */
- protected $backupGlobals = false;
- /**
- * @var bool
- */
- protected $backupStaticAttributes = false;
- /**
- * @var bool
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var bool
- */
- protected $useErrorHandler = false;
- /**
- * @var bool
- */
- protected $useOutputBuffering = false;
- /**
- * @param string $className
- * @param string $methodName
- * @param string $message
- */
- public function __construct($className, $methodName, $message = '')
- {
- $this->message = $message;
- parent::__construct($className . '::' . $methodName);
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->markTestIncomplete($this->message);
- }
- /**
- * @return string
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_TestSuite_DataProvider extends PHPUnit_Framework_TestSuite
- {
- /**
- * Sets the dependencies of a TestCase.
- *
- * @param array $dependencies
- */
- public function setDependencies(array $dependencies)
- {
- foreach ($this->tests as $test) {
- $test->setDependencies($dependencies);
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP deprecated errors.
- * You can disable deprecated-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Deprecated::$enabled = false;
- * </code>
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP notices.
- * You can disable notice-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Notice::$enabled = false;
- * </code>
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP warnings.
- * You can disable notice-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Warning::$enabled = false;
- * </code>
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of an incomplete test.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test that is skipped because of an invalid @covers annotation.
- *
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_InvalidCoversTargetError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a skipped test suite.
- *
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestResult collects the results of executing a test case.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestResult implements Countable
- {
- /**
- * @var array
- */
- protected $passed = array();
- /**
- * @var array
- */
- protected $errors = array();
- /**
- * @var array
- */
- protected $failures = array();
- /**
- * @var array
- */
- protected $notImplemented = array();
- /**
- * @var array
- */
- protected $risky = array();
- /**
- * @var array
- */
- protected $skipped = array();
- /**
- * @var array
- */
- protected $listeners = array();
- /**
- * @var int
- */
- protected $runTests = 0;
- /**
- * @var float
- */
- protected $time = 0;
- /**
- * @var PHPUnit_Framework_TestSuite
- */
- protected $topTestSuite = null;
- /**
- * Code Coverage information.
- *
- * @var PHP_CodeCoverage
- */
- protected $codeCoverage;
- /**
- * @var bool
- */
- protected $convertErrorsToExceptions = true;
- /**
- * @var bool
- */
- protected $stop = false;
- /**
- * @var bool
- */
- protected $stopOnError = false;
- /**
- * @var bool
- */
- protected $stopOnFailure = false;
- /**
- * @var bool
- */
- protected $beStrictAboutTestsThatDoNotTestAnything = false;
- /**
- * @var bool
- */
- protected $beStrictAboutOutputDuringTests = false;
- /**
- * @var bool
- */
- protected $beStrictAboutTestSize = false;
- /**
- * @var bool
- */
- protected $beStrictAboutTodoAnnotatedTests = false;
- /**
- * @var bool
- */
- protected $stopOnRisky = false;
- /**
- * @var bool
- */
- protected $stopOnIncomplete = false;
- /**
- * @var bool
- */
- protected $stopOnSkipped = false;
- /**
- * @var bool
- */
- protected $lastTestFailed = false;
- /**
- * @var int
- */
- protected $timeoutForSmallTests = 1;
- /**
- * @var int
- */
- protected $timeoutForMediumTests = 10;
- /**
- * @var int
- */
- protected $timeoutForLargeTests = 60;
- /**
- * Registers a TestListener.
- *
- * @param PHPUnit_Framework_TestListener
- */
- public function addListener(PHPUnit_Framework_TestListener $listener)
- {
- $this->listeners[] = $listener;
- }
- /**
- * Unregisters a TestListener.
- *
- * @param PHPUnit_Framework_TestListener $listener
- */
- public function removeListener(PHPUnit_Framework_TestListener $listener)
- {
- foreach ($this->listeners as $key => $_listener) {
- if ($listener === $_listener) {
- unset($this->listeners[$key]);
- }
- }
- }
- /**
- * Flushes all flushable TestListeners.
- *
- * @since Method available since Release 3.0.0
- */
- public function flushListeners()
- {
- foreach ($this->listeners as $listener) {
- if ($listener instanceof PHPUnit_Util_Printer) {
- $listener->flush();
- }
- }
- }
- /**
- * Adds an error to the list of errors.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($e instanceof PHPUnit_Framework_RiskyTest) {
- $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addRiskyTest';
- if ($this->stopOnRisky) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
- $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addIncompleteTest';
- if ($this->stopOnIncomplete) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
- $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addSkippedTest';
- if ($this->stopOnSkipped) {
- $this->stop();
- }
- } else {
- $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addError';
- if ($this->stopOnError || $this->stopOnFailure) {
- $this->stop();
- }
- }
- foreach ($this->listeners as $listener) {
- $listener->$notifyMethod($test, $e, $time);
- }
- $this->lastTestFailed = true;
- $this->time += $time;
- }
- /**
- * Adds a failure to the list of failures.
- * The passed in exception caused the failure.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if ($e instanceof PHPUnit_Framework_RiskyTest ||
- $e instanceof PHPUnit_Framework_OutputError) {
- $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addRiskyTest';
- if ($this->stopOnRisky) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
- $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addIncompleteTest';
- if ($this->stopOnIncomplete) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
- $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addSkippedTest';
- if ($this->stopOnSkipped) {
- $this->stop();
- }
- } else {
- $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addFailure';
- if ($this->stopOnFailure) {
- $this->stop();
- }
- }
- foreach ($this->listeners as $listener) {
- $listener->$notifyMethod($test, $e, $time);
- }
- $this->lastTestFailed = true;
- $this->time += $time;
- }
- /**
- * Informs the result that a testsuite will be started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- if ($this->topTestSuite === null) {
- $this->topTestSuite = $suite;
- }
- foreach ($this->listeners as $listener) {
- $listener->startTestSuite($suite);
- }
- }
- /**
- * Informs the result that a testsuite was completed.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- foreach ($this->listeners as $listener) {
- $listener->endTestSuite($suite);
- }
- }
- /**
- * Informs the result that a test will be started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->lastTestFailed = false;
- $this->runTests += count($test);
- foreach ($this->listeners as $listener) {
- $listener->startTest($test);
- }
- }
- /**
- * Informs the result that a test was completed.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- foreach ($this->listeners as $listener) {
- $listener->endTest($test, $time);
- }
- if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) {
- $class = get_class($test);
- $key = $class . '::' . $test->getName();
- $this->passed[$key] = array(
- 'result' => $test->getResult(),
- 'size' => PHPUnit_Util_Test::getSize(
- $class,
- $test->getName(false)
- )
- );
- $this->time += $time;
- }
- }
- /**
- * Returns true if no risky test occurred.
- *
- * @return bool
- * @since Method available since Release 4.0.0
- */
- public function allHarmless()
- {
- return $this->riskyCount() == 0;
- }
- /**
- * Gets the number of risky tests.
- *
- * @return int
- * @since Method available since Release 4.0.0
- */
- public function riskyCount()
- {
- return count($this->risky);
- }
- /**
- * Returns true if no incomplete test occurred.
- *
- * @return bool
- */
- public function allCompletelyImplemented()
- {
- return $this->notImplementedCount() == 0;
- }
- /**
- * Gets the number of incomplete tests.
- *
- * @return int
- */
- public function notImplementedCount()
- {
- return count($this->notImplemented);
- }
- /**
- * Returns an Enumeration for the risky tests.
- *
- * @return array
- * @since Method available since Release 4.0.0
- */
- public function risky()
- {
- return $this->risky;
- }
- /**
- * Returns an Enumeration for the incomplete tests.
- *
- * @return array
- */
- public function notImplemented()
- {
- return $this->notImplemented;
- }
- /**
- * Returns true if no test has been skipped.
- *
- * @return bool
- * @since Method available since Release 3.0.0
- */
- public function noneSkipped()
- {
- return $this->skippedCount() == 0;
- }
- /**
- * Gets the number of skipped tests.
- *
- * @return int
- * @since Method available since Release 3.0.0
- */
- public function skippedCount()
- {
- return count($this->skipped);
- }
- /**
- * Returns an Enumeration for the skipped tests.
- *
- * @return array
- * @since Method available since Release 3.0.0
- */
- public function skipped()
- {
- return $this->skipped;
- }
- /**
- * Gets the number of detected errors.
- *
- * @return int
- */
- public function errorCount()
- {
- return count($this->errors);
- }
- /**
- * Returns an Enumeration for the errors.
- *
- * @return array
- */
- public function errors()
- {
- return $this->errors;
- }
- /**
- * Gets the number of detected failures.
- *
- * @return int
- */
- public function failureCount()
- {
- return count($this->failures);
- }
- /**
- * Returns an Enumeration for the failures.
- *
- * @return array
- */
- public function failures()
- {
- return $this->failures;
- }
- /**
- * Returns the names of the tests that have passed.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function passed()
- {
- return $this->passed;
- }
- /**
- * Returns the (top) test suite.
- *
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.0.0
- */
- public function topTestSuite()
- {
- return $this->topTestSuite;
- }
- /**
- * Returns whether code coverage information should be collected.
- *
- * @return bool If code coverage should be collected
- * @since Method available since Release 3.2.0
- */
- public function getCollectCodeCoverageInformation()
- {
- return $this->codeCoverage !== null;
- }
- /**
- * Runs a TestCase.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function run(PHPUnit_Framework_Test $test)
- {
- PHPUnit_Framework_Assert::resetCount();
- $error = false;
- $failure = false;
- $incomplete = false;
- $risky = false;
- $skipped = false;
- $this->startTest($test);
- $errorHandlerSet = false;
- if ($this->convertErrorsToExceptions) {
- $oldErrorHandler = set_error_handler(
- array('PHPUnit_Util_ErrorHandler', 'handleError'),
- E_ALL | E_STRICT
- );
- if ($oldErrorHandler === null) {
- $errorHandlerSet = true;
- } else {
- restore_error_handler();
- }
- }
- $collectCodeCoverage = $this->codeCoverage !== null &&
- !$test instanceof PHPUnit_Extensions_SeleniumTestCase &&
- !$test instanceof PHPUnit_Framework_Warning;
- if ($collectCodeCoverage) {
- // We need to blacklist test source files when no whitelist is used.
- if (!$this->codeCoverage->filter()->hasWhitelist()) {
- $classes = $this->getHierarchy(get_class($test), true);
- foreach ($classes as $class) {
- $this->codeCoverage->filter()->addFileToBlacklist(
- $class->getFileName()
- );
- }
- }
- $this->codeCoverage->start($test);
- }
- PHP_Timer::start();
- try {
- if (!$test instanceof PHPUnit_Framework_Warning &&
- $test->getSize() != PHPUnit_Util_Test::UNKNOWN &&
- $this->beStrictAboutTestSize &&
- extension_loaded('pcntl') && class_exists('PHP_Invoker')) {
- switch ($test->getSize()) {
- case PHPUnit_Util_Test::SMALL:
- $_timeout = $this->timeoutForSmallTests;
- break;
- case PHPUnit_Util_Test::MEDIUM:
- $_timeout = $this->timeoutForMediumTests;
- break;
- case PHPUnit_Util_Test::LARGE:
- $_timeout = $this->timeoutForLargeTests;
- break;
- }
- $invoker = new PHP_Invoker;
- $invoker->invoke(array($test, 'runBare'), array(), $_timeout);
- } else {
- $test->runBare();
- }
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $failure = true;
- if ($e instanceof PHPUnit_Framework_RiskyTestError) {
- $risky = true;
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) {
- $incomplete = true;
- } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) {
- $skipped = true;
- }
- } catch (PHPUnit_Framework_Exception $e) {
- $error = true;
- } catch (Throwable $e) {
- $e = new PHPUnit_Framework_ExceptionWrapper($e);
- $error = true;
- } catch (Exception $e) {
- $e = new PHPUnit_Framework_ExceptionWrapper($e);
- $error = true;
- }
- $time = PHP_Timer::stop();
- $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
- if ($this->beStrictAboutTestsThatDoNotTestAnything &&
- $test->getNumAssertions() == 0) {
- $risky = true;
- }
- if ($collectCodeCoverage) {
- $append = !$risky && !$incomplete && !$skipped;
- $linesToBeCovered = array();
- $linesToBeUsed = array();
- if ($append && $test instanceof PHPUnit_Framework_TestCase) {
- $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered(
- get_class($test),
- $test->getName(false)
- );
- $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed(
- get_class($test),
- $test->getName(false)
- );
- }
- try {
- $this->codeCoverage->stop(
- $append,
- $linesToBeCovered,
- $linesToBeUsed
- );
- } catch (PHP_CodeCoverage_Exception_UnintentionallyCoveredCode $cce) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_UnintentionallyCoveredCodeError(
- 'This test executed code that is not listed as code to be covered or used:' .
- PHP_EOL . $cce->getMessage()
- ),
- $time
- );
- } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_InvalidCoversTargetError(
- $cce->getMessage()
- ),
- $time
- );
- } catch (PHP_CodeCoverage_Exception $cce) {
- $error = true;
- if (!isset($e)) {
- $e = $cce;
- }
- }
- }
- if ($errorHandlerSet === true) {
- restore_error_handler();
- }
- if ($error === true) {
- $this->addError($test, $e, $time);
- } elseif ($failure === true) {
- $this->addFailure($test, $e, $time);
- } elseif ($this->beStrictAboutTestsThatDoNotTestAnything &&
- $test->getNumAssertions() == 0) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_RiskyTestError(
- 'This test did not perform any assertions'
- ),
- $time
- );
- } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_OutputError(
- sprintf(
- 'This test printed output: %s',
- $test->getActualOutput()
- )
- ),
- $time
- );
- } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof PHPUnit_Framework_TestCase) {
- $annotations = $test->getAnnotations();
- if (isset($annotations['method']['todo'])) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_RiskyTestError(
- 'Test method is annotated with @todo'
- ),
- $time
- );
- }
- }
- $this->endTest($test, $time);
- }
- /**
- * Gets the number of run tests.
- *
- * @return int
- */
- public function count()
- {
- return $this->runTests;
- }
- /**
- * Checks whether the test run should stop.
- *
- * @return bool
- */
- public function shouldStop()
- {
- return $this->stop;
- }
- /**
- * Marks that the test run should stop.
- */
- public function stop()
- {
- $this->stop = true;
- }
- /**
- * Returns the PHP_CodeCoverage object.
- *
- * @return PHP_CodeCoverage
- * @since Method available since Release 3.5.0
- */
- public function getCodeCoverage()
- {
- return $this->codeCoverage;
- }
- /**
- * Sets the PHP_CodeCoverage object.
- *
- * @param PHP_CodeCoverage $codeCoverage
- * @since Method available since Release 3.6.0
- */
- public function setCodeCoverage(PHP_CodeCoverage $codeCoverage)
- {
- $this->codeCoverage = $codeCoverage;
- }
- /**
- * Enables or disables the error-to-exception conversion.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.2.14
- */
- public function convertErrorsToExceptions($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->convertErrorsToExceptions = $flag;
- }
- /**
- * Returns the error-to-exception conversion setting.
- *
- * @return bool
- * @since Method available since Release 3.4.0
- */
- public function getConvertErrorsToExceptions()
- {
- return $this->convertErrorsToExceptions;
- }
- /**
- * Enables or disables the stopping when an error occurs.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- public function stopOnError($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnError = $flag;
- }
- /**
- * Enables or disables the stopping when a failure occurs.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- public function stopOnFailure($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnFailure = $flag;
- }
- /**
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutTestsThatDoNotTestAnything($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTestsThatDoNotTestAnything = $flag;
- }
- /**
- * @return bool
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutTestsThatDoNotTestAnything()
- {
- return $this->beStrictAboutTestsThatDoNotTestAnything;
- }
- /**
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutOutputDuringTests($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutOutputDuringTests = $flag;
- }
- /**
- * @return bool
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutOutputDuringTests()
- {
- return $this->beStrictAboutOutputDuringTests;
- }
- /**
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutTestSize($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTestSize = $flag;
- }
- /**
- * @return bool
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutTestSize()
- {
- return $this->beStrictAboutTestSize;
- }
- /**
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.2.0
- */
- public function beStrictAboutTodoAnnotatedTests($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTodoAnnotatedTests = $flag;
- }
- /**
- * @return bool
- * @since Method available since Release 4.2.0
- */
- public function isStrictAboutTodoAnnotatedTests()
- {
- return $this->beStrictAboutTodoAnnotatedTests;
- }
- /**
- * Enables or disables the stopping for risky tests.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function stopOnRisky($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnRisky = $flag;
- }
- /**
- * Enables or disables the stopping for incomplete tests.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- public function stopOnIncomplete($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnIncomplete = $flag;
- }
- /**
- * Enables or disables the stopping for skipped tests.
- *
- * @param bool $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- public function stopOnSkipped($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnSkipped = $flag;
- }
- /**
- * Returns the time spent running the tests.
- *
- * @return float
- */
- public function time()
- {
- return $this->time;
- }
- /**
- * Returns whether the entire test was successful or not.
- *
- * @return bool
- */
- public function wasSuccessful()
- {
- return empty($this->errors) && empty($this->failures);
- }
- /**
- * Sets the timeout for small tests.
- *
- * @param int $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForSmallTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForSmallTests = $timeout;
- }
- /**
- * Sets the timeout for medium tests.
- *
- * @param int $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForMediumTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForMediumTests = $timeout;
- }
- /**
- * Sets the timeout for large tests.
- *
- * @param int $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForLargeTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForLargeTests = $timeout;
- }
- /**
- * Returns the class hierarchy for a given class.
- *
- * @param string $className
- * @param bool $asReflectionObjects
- * @return array
- */
- protected function getHierarchy($className, $asReflectionObjects = false)
- {
- if ($asReflectionObjects) {
- $classes = array(new ReflectionClass($className));
- } else {
- $classes = array($className);
- }
- $done = false;
- while (!$done) {
- if ($asReflectionObjects) {
- $class = new ReflectionClass(
- $classes[count($classes)-1]->getName()
- );
- } else {
- $class = new ReflectionClass($classes[count($classes)-1]);
- }
- $parent = $class->getParentClass();
- if ($parent !== false) {
- if ($asReflectionObjects) {
- $classes[] = $parent;
- } else {
- $classes[] = $parent->getName();
- }
- } else {
- $done = true;
- }
- }
- return $classes;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestFailure collects a failed test together with the caught exception.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestFailure
- {
- /**
- * @var string
- */
- private $testName;
- /**
- * @var PHPUnit_Framework_Test|null
- */
- protected $failedTest;
- /**
- * @var Exception
- */
- protected $thrownException;
- /**
- * Constructs a TestFailure with the given test and exception.
- *
- * @param PHPUnit_Framework_Test $failedTest
- * @param Exception $thrownException
- */
- public function __construct(PHPUnit_Framework_Test $failedTest, Exception $thrownException)
- {
- if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) {
- $this->testName = $failedTest->toString();
- } else {
- $this->testName = get_class($failedTest);
- }
- if (!$failedTest instanceof PHPUnit_Framework_TestCase || !$failedTest->isInIsolation()) {
- $this->failedTest = $failedTest;
- }
- $this->thrownException = $thrownException;
- }
- /**
- * Returns a short description of the failure.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- '%s: %s',
- $this->testName,
- $this->thrownException->getMessage()
- );
- }
- /**
- * Returns a description for the thrown exception.
- *
- * @return string
- * @since Method available since Release 3.4.0
- */
- public function getExceptionAsString()
- {
- return self::exceptionToString($this->thrownException);
- }
- /**
- * Returns a description for an exception.
- *
- * @param Exception $e
- * @return string
- * @since Method available since Release 3.2.0
- */
- public static function exceptionToString(Exception $e)
- {
- if ($e instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $e->toString();
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException && $e->getComparisonFailure()) {
- $buffer = $buffer . $e->getComparisonFailure()->getDiff();
- }
- if (!empty($buffer)) {
- $buffer = trim($buffer) . "\n";
- }
- } elseif ($e instanceof PHPUnit_Framework_Error) {
- $buffer = $e->getMessage() . "\n";
- } elseif ($e instanceof PHPUnit_Framework_ExceptionWrapper) {
- $buffer = $e->getClassname() . ': ' . $e->getMessage() . "\n";
- } else {
- $buffer = get_class($e) . ': ' . $e->getMessage() . "\n";
- }
- return $buffer;
- }
- /**
- * Returns the name of the failing test (including data set, if any).
- *
- * @return string
- * @since Method available since Release 4.3.0
- */
- public function getTestName()
- {
- return $this->testName;
- }
- /**
- * Returns the failing test.
- *
- * Note: The test object is not set when the test is executed in process
- * isolation.
- *
- * @see PHPUnit_Framework_Exception
- *
- * @return PHPUnit_Framework_Test|null
- */
- public function failedTest()
- {
- return $this->failedTest;
- }
- /**
- * Gets the thrown exception.
- *
- * @return Exception
- */
- public function thrownException()
- {
- return $this->thrownException;
- }
- /**
- * Returns the exception's message.
- *
- * @return string
- */
- public function exceptionMessage()
- {
- return $this->thrownException()->getMessage();
- }
- /**
- * Returns true if the thrown exception
- * is of type AssertionFailedError.
- *
- * @return bool
- */
- public function isFailure()
- {
- return ($this->thrownException() instanceof PHPUnit_Framework_AssertionFailedError);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking any exception/error as result of an unit
- * test as incomplete implementation or currently not implemented.
- *
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_IncompleteTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A skipped test case
- *
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_SkippedTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var bool
- */
- protected $backupGlobals = false;
- /**
- * @var bool
- */
- protected $backupStaticAttributes = false;
- /**
- * @var bool
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var bool
- */
- protected $useErrorHandler = false;
- /**
- * @var bool
- */
- protected $useOutputBuffering = false;
- /**
- * @param string $message
- */
- public function __construct($className, $methodName, $message = '')
- {
- $this->message = $message;
- parent::__construct($className . '::' . $methodName);
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->markTestSkipped($this->message);
- }
- /**
- * @return string
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the class it is evaluated for has a given
- * attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_ClassHasAttribute extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $attributeName;
- /**
- * @param string $attributeName
- */
- public function __construct($attributeName)
- {
- parent::__construct();
- $this->attributeName = $attributeName;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $class = new ReflectionClass($other);
- return $class->hasProperty($this->attributeName);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'has attribute "%s"',
- $this->attributeName
- );
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%sclass "%s" %s',
- is_object($other) ? 'object of ' : '',
- is_object($other) ? get_class($other) : $other,
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the Traversable it is applied to contains
- * a given value.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_TraversableContains extends PHPUnit_Framework_Constraint
- {
- /**
- * @var bool
- */
- protected $checkForObjectIdentity;
- /**
- * @var bool
- */
- protected $checkForNonObjectIdentity;
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @param mixed $value
- * @param bool $checkForObjectIdentity
- * @param bool $checkForNonObjectIdentity
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- parent::__construct();
- if (!is_bool($checkForObjectIdentity)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
- }
- if (!is_bool($checkForNonObjectIdentity)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean');
- }
- $this->checkForObjectIdentity = $checkForObjectIdentity;
- $this->checkForNonObjectIdentity = $checkForNonObjectIdentity;
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($other instanceof SplObjectStorage) {
- return $other->contains($this->value);
- }
- if (is_object($this->value)) {
- foreach ($other as $element) {
- if (($this->checkForObjectIdentity &&
- $element === $this->value) ||
- (!$this->checkForObjectIdentity &&
- $element == $this->value)) {
- return true;
- }
- }
- } else {
- foreach ($other as $element) {
- if (($this->checkForNonObjectIdentity &&
- $element === $this->value) ||
- (!$this->checkForNonObjectIdentity &&
- $element == $this->value)) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if (is_string($this->value) && strpos($this->value, "\n") !== false) {
- return 'contains "' . $this->value . '"';
- } else {
- return 'contains ' . $this->exporter->export($this->value);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s %s',
- is_array($other) ? 'an array' : 'a traversable',
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_ExceptionCode extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $expectedCode;
- /**
- * @param int $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedCode = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return bool
- */
- protected function matches($other)
- {
- return (string) $other->getCode() == (string) $this->expectedCode;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s is equal to expected exception code %s',
- $this->exporter->export($other->getCode()),
- $this->exporter->export($this->expectedCode)
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'exception code is ';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_Exception extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $className;
- /**
- * @param string $className
- */
- public function __construct($className)
- {
- parent::__construct();
- $this->className = $className;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other instanceof $this->className;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- if ($other !== null) {
- $message = '';
- if ($other instanceof Exception) {
- $message = '. Message was: "' . $other->getMessage() . '" at'
- . "\n" . $other->getTraceAsString();
- }
- return sprintf(
- 'exception of type "%s" matches expected exception "%s"%s',
- get_class($other),
- $this->className,
- $message
- );
- }
- return sprintf(
- 'exception of type "%s" is thrown',
- $this->className
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'exception of type "%s"',
- $this->className
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_Constraint_SameSize extends PHPUnit_Framework_Constraint_Count
- {
- /**
- * @var int
- */
- protected $expectedCount;
- /**
- * @param int $expected
- */
- public function __construct($expected)
- {
- parent::__construct($this->getCountOf($expected));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two JSON objects are equal.
- *
- * @since Class available since Release 3.7.0
- */
- class PHPUnit_Framework_Constraint_JsonMatches extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $value;
- /**
- * Creates a new constraint.
- *
- * @param string $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $decodedOther = json_decode($other);
- if (json_last_error()) {
- return false;
- }
- $decodedValue = json_decode($this->value);
- if (json_last_error()) {
- return false;
- }
- return $decodedOther == $decodedValue;
- }
- /**
- * Returns a string representation of the object.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'matches JSON string "%s"',
- $this->value
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the object it is evaluated for is an instance
- * of a given class.
- *
- * The expected class name is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsInstanceOf extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $className;
- /**
- * @param string $className
- */
- public function __construct($className)
- {
- parent::__construct();
- $this->className = $className;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return ($other instanceof $this->className);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s is an instance of %s "%s"',
- $this->exporter->shortenedExport($other),
- $this->getType(),
- $this->className
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is instance of %s "%s"',
- $this->getType(),
- $this->className
- );
- }
- private function getType()
- {
- try {
- $reflection = new ReflectionClass($this->className);
- if ($reflection->isInterface()) {
- return 'interface';
- }
- } catch (ReflectionException $e) {
- }
- return 'class';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the object it is evaluated for has a given
- * attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_ObjectHasAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $object = new ReflectionObject($other);
- return $object->hasProperty($this->attributeName);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is of a
- * specified type.
- *
- * The expected value is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsType extends PHPUnit_Framework_Constraint
- {
- const TYPE_ARRAY = 'array';
- const TYPE_BOOL = 'bool';
- const TYPE_FLOAT = 'float';
- const TYPE_INT = 'int';
- const TYPE_NULL = 'null';
- const TYPE_NUMERIC = 'numeric';
- const TYPE_OBJECT = 'object';
- const TYPE_RESOURCE = 'resource';
- const TYPE_STRING = 'string';
- const TYPE_SCALAR = 'scalar';
- const TYPE_CALLABLE = 'callable';
- /**
- * @var array
- */
- protected $types = array(
- 'array' => true,
- 'boolean' => true,
- 'bool' => true,
- 'double' => true,
- 'float' => true,
- 'integer' => true,
- 'int' => true,
- 'null' => true,
- 'numeric' => true,
- 'object' => true,
- 'real' => true,
- 'resource' => true,
- 'string' => true,
- 'scalar' => true,
- 'callable' => true
- );
- /**
- * @var string
- */
- protected $type;
- /**
- * @param string $type
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($type)
- {
- parent::__construct();
- if (!isset($this->types[$type])) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Type specified for PHPUnit_Framework_Constraint_IsType <%s> ' .
- 'is not a valid type.',
- $type
- )
- );
- }
- $this->type = $type;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- switch ($this->type) {
- case 'numeric':
- return is_numeric($other);
- case 'integer':
- case 'int':
- return is_integer($other);
- case 'double':
- case 'float':
- case 'real':
- return is_float($other);
- case 'string':
- return is_string($other);
- case 'boolean':
- case 'bool':
- return is_bool($other);
- case 'null':
- return is_null($other);
- case 'array':
- return is_array($other);
- case 'object':
- return is_object($other);
- case 'resource':
- return is_resource($other) || is_string(@get_resource_type($other));
- case 'scalar':
- return is_scalar($other);
- case 'callable':
- return is_callable($other);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is of type "%s"',
- $this->type
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is less than
- * a given value.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_LessThan extends PHPUnit_Framework_Constraint
- {
- /**
- * @var numeric
- */
- protected $value;
- /**
- * @param numeric $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $this->value > $other;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is less than ' . $this->exporter->export($this->value);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the array it is evaluated for has a specified subset.
- *
- * Uses array_replace_recursive() to check if a key value subset is part of the
- * subject array.
- *
- * @since Class available since Release 4.4.0
- */
- class PHPUnit_Framework_Constraint_ArraySubset extends PHPUnit_Framework_Constraint
- {
- /**
- * @var array|ArrayAccess
- */
- protected $subset;
- /**
- * @var bool
- */
- protected $strict;
- /**
- * @param array|ArrayAccess $subset
- * @param bool $strict Check for object identity
- */
- public function __construct($subset, $strict = false)
- {
- parent::__construct();
- $this->strict = $strict;
- $this->subset = $subset;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param array|ArrayAccess $other Array or ArrayAccess object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $patched = array_replace_recursive($other, $this->subset);
- if ($this->strict) {
- return $other === $patched;
- } else {
- return $other == $patched;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'has the subset ' . $this->exporter->export($this->subset);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return 'an array ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts true.
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === true;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is true';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that a string is valid JSON.
- *
- * @since Class available since Release 3.7.20
- */
- class PHPUnit_Framework_Constraint_IsJson extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- json_decode($other);
- if (json_last_error()) {
- return false;
- }
- return true;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- json_decode($other);
- $error = PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
- json_last_error()
- );
- return sprintf(
- '%s is valid JSON (%s)',
- $this->exporter->shortenedExport($other),
- $error
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is valid JSON';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks if one value is equal to another.
- *
- * Equality is checked with PHP's == operator, the operator is explained in
- * detail at {@url http://www.php.net/manual/en/types.comparisons.php}.
- * Two values are equal if they have the same value disregarding type.
- *
- * The expected value is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @var float
- */
- protected $delta = 0.0;
- /**
- * @var int
- */
- protected $maxDepth = 10;
- /**
- * @var bool
- */
- protected $canonicalize = false;
- /**
- * @var bool
- */
- protected $ignoreCase = false;
- /**
- * @var SebastianBergmann\Comparator\ComparisonFailure
- */
- protected $lastFailure;
- /**
- * @param mixed $value
- * @param float $delta
- * @param int $maxDepth
- * @param bool $canonicalize
- * @param bool $ignoreCase
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- parent::__construct();
- if (!is_numeric($delta)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'numeric');
- }
- if (!is_int($maxDepth)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'integer');
- }
- if (!is_bool($canonicalize)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
- }
- if (!is_bool($ignoreCase)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'boolean');
- }
- $this->value = $value;
- $this->delta = $delta;
- $this->maxDepth = $maxDepth;
- $this->canonicalize = $canonicalize;
- $this->ignoreCase = $ignoreCase;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- // If $this->value and $other are identical, they are also equal.
- // This is the most common path and will allow us to skip
- // initialization of all the comparators.
- if ($this->value === $other) {
- return true;
- }
- $comparatorFactory = SebastianBergmann\Comparator\Factory::getInstance();
- try {
- $comparator = $comparatorFactory->getComparatorFor(
- $this->value,
- $other
- );
- $comparator->assertEquals(
- $this->value,
- $other,
- $this->delta,
- $this->canonicalize,
- $this->ignoreCase
- );
- } catch (SebastianBergmann\Comparator\ComparisonFailure $f) {
- if ($returnResult) {
- return false;
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- trim($description . "\n" . $f->getMessage()),
- $f
- );
- }
- return true;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $delta = '';
- if (is_string($this->value)) {
- if (strpos($this->value, "\n") !== false) {
- return 'is equal to <text>';
- } else {
- return sprintf(
- 'is equal to <string:%s>',
- $this->value
- );
- }
- } else {
- if ($this->delta != 0) {
- $delta = sprintf(
- ' with delta <%F>',
- $this->delta
- );
- }
- return sprintf(
- 'is equal to %s%s',
- $this->exporter->export($this->value),
- $delta
- );
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical XOR.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- $lastResult = null;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- $result = $constraint->evaluate($other, $description, true);
- if ($result === $lastResult) {
- $success = false;
- break;
- }
- $lastResult = $result;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' xor ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides human readable messages for each JSON error.
- *
- * @since Class available since Release 3.7.0
- */
- class PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider
- {
- /**
- * Translates JSON error to a human readable string.
- *
- * @param string $error
- * @param string $prefix
- * @return string
- */
- public static function determineJsonError($error, $prefix = '')
- {
- switch ($error) {
- case JSON_ERROR_NONE:
- return;
- case JSON_ERROR_DEPTH:
- return $prefix . 'Maximum stack depth exceeded';
- case JSON_ERROR_STATE_MISMATCH:
- return $prefix . 'Underflow or the modes mismatch';
- case JSON_ERROR_CTRL_CHAR:
- return $prefix . 'Unexpected control character found';
- case JSON_ERROR_SYNTAX:
- return $prefix . 'Syntax error, malformed JSON';
- case JSON_ERROR_UTF8:
- return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded';
- default:
- return $prefix . 'Unknown error';
- }
- }
- /**
- * Translates a given type to a human readable message prefix.
- *
- * @param string $type
- * @return string
- */
- public static function translateTypeToPrefix($type)
- {
- switch (strtolower($type)) {
- case 'expected':
- $prefix = 'Expected value JSON decode error - ';
- break;
- case 'actual':
- $prefix = 'Actual value JSON decode error - ';
- break;
- default:
- $prefix = '';
- break;
- }
- return $prefix;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Diff\Differ;
- /**
- * ...
- *
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch
- {
- /**
- * @var string
- */
- protected $string;
- /**
- * @param string $string
- */
- public function __construct($string)
- {
- parent::__construct($string);
- $this->pattern = $this->createPatternFromFormat(
- preg_replace('/\r\n/', "\n", $string)
- );
- $this->string = $string;
- }
- protected function failureDescription($other)
- {
- return 'format description matches text';
- }
- protected function additionalFailureDescription($other)
- {
- $from = preg_split('(\r\n|\r|\n)', $this->string);
- $to = preg_split('(\r\n|\r|\n)', $other);
- foreach ($from as $index => $line) {
- if (isset($to[$index]) && $line !== $to[$index]) {
- $line = $this->createPatternFromFormat($line);
- if (preg_match($line, $to[$index]) > 0) {
- $from[$index] = $to[$index];
- }
- }
- }
- $this->string = implode("\n", $from);
- $other = implode("\n", $to);
- $differ = new Differ("--- Expected\n+++ Actual\n");
- return $differ->diff($this->string, $other);
- }
- protected function createPatternFromFormat($string)
- {
- $string = str_replace(
- array(
- '%e',
- '%s',
- '%S',
- '%a',
- '%A',
- '%w',
- '%i',
- '%d',
- '%x',
- '%f',
- '%c'
- ),
- array(
- '\\' . DIRECTORY_SEPARATOR,
- '[^\r\n]+',
- '[^\r\n]*',
- '.+',
- '.*',
- '\s*',
- '[+-]?\d+',
- '\d+',
- '[0-9a-fA-F]+',
- '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?',
- '.'
- ),
- preg_quote($string, '/')
- );
- return '/^' . $string . '$/s';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical NOT.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Not extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @param PHPUnit_Framework_Constraint $constraint
- */
- public function __construct($constraint)
- {
- parent::__construct();
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint);
- }
- $this->constraint = $constraint;
- }
- /**
- * @param string $string
- * @return string
- */
- public static function negate($string)
- {
- return str_replace(
- array(
- 'contains ',
- 'exists',
- 'has ',
- 'is ',
- 'are ',
- 'matches ',
- 'starts with ',
- 'ends with ',
- 'reference ',
- 'not not '
- ),
- array(
- 'does not contain ',
- 'does not exist',
- 'does not have ',
- 'is not ',
- 'are not ',
- 'does not match ',
- 'starts not with ',
- 'ends not with ',
- 'don\'t reference ',
- 'not '
- ),
- $string
- );
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = !$this->constraint->evaluate($other, $description, true);
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- switch (get_class($this->constraint)) {
- case 'PHPUnit_Framework_Constraint_And':
- case 'PHPUnit_Framework_Constraint_Not':
- case 'PHPUnit_Framework_Constraint_Or':
- return 'not( ' . $this->constraint->failureDescription($other) . ' )';
- default:
- return self::negate(
- $this->constraint->failureDescription($other)
- );
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- switch (get_class($this->constraint)) {
- case 'PHPUnit_Framework_Constraint_And':
- case 'PHPUnit_Framework_Constraint_Not':
- case 'PHPUnit_Framework_Constraint_Or':
- return 'not( ' . $this->constraint->toString() . ' )';
- default:
- return self::negate(
- $this->constraint->toString()
- );
- }
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- return count($this->constraint);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_Constraint_ExceptionMessageRegExp extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $expectedMessageRegExp;
- /**
- * @param string $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedMessageRegExp = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return bool
- */
- protected function matches($other)
- {
- $match = PHPUnit_Util_Regex::pregMatchSafe($this->expectedMessageRegExp, $other->getMessage());
- if (false === $match) {
- throw new PHPUnit_Framework_Exception(
- "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'"
- );
- }
- return 1 === $match;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- "exception message '%s' matches '%s'",
- $other->getMessage(),
- $this->expectedMessageRegExp
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'exception message matches ';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is greater
- * than a given value.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_GreaterThan extends PHPUnit_Framework_Constraint
- {
- /**
- * @var numeric
- */
- protected $value;
- /**
- * @param numeric $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $this->value < $other;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is greater than ' . $this->exporter->export($this->value);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $expectedMessage;
- /**
- * @param string $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedMessage = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return bool
- */
- protected function matches($other)
- {
- return strpos($other->getMessage(), $this->expectedMessage) !== false;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- "exception message '%s' contains '%s'",
- $other->getMessage(),
- $this->expectedMessage
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'exception message contains ';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that evaluates against a specified closure.
- */
- class PHPUnit_Framework_Constraint_Callback extends PHPUnit_Framework_Constraint
- {
- private $callback;
- /**
- * @param callable $callback
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'callable'
- );
- }
- parent::__construct();
- $this->callback = $callback;
- }
- /**
- * Evaluates the constraint for parameter $value. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return call_user_func($this->callback, $other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is accepted by specified callback';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the array it is evaluated for has a given key.
- *
- * Uses array_key_exists() to check if the key is found in the input array, if
- * not found the evaluation fails.
- *
- * The array key is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_ArrayHasKey extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int|string
- */
- protected $key;
- /**
- * @param int|string $key
- */
- public function __construct($key)
- {
- parent::__construct();
- $this->key = $key;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (is_array($other)) {
- return array_key_exists($this->key, $other);
- }
- if ($other instanceof ArrayAccess) {
- return $other->offsetExists($this->key);
- }
- return false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'has the key ' . $this->exporter->export($this->key);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return 'an array ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for contains
- * a given string.
- *
- * Uses strpos() to find the position of the string in the input, if not found
- * the evaluation fails.
- *
- * The sub-string is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_StringContains extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $string;
- /**
- * @var bool
- */
- protected $ignoreCase;
- /**
- * @param string $string
- * @param bool $ignoreCase
- */
- public function __construct($string, $ignoreCase = false)
- {
- parent::__construct();
- $this->string = $string;
- $this->ignoreCase = $ignoreCase;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($this->ignoreCase) {
- return stripos($other, $this->string) !== false;
- } else {
- return strpos($other, $this->string) !== false;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if ($this->ignoreCase) {
- $string = strtolower($this->string);
- } else {
- $string = $this->string;
- }
- return sprintf(
- 'contains "%s"',
- $string
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the Traversable it is applied to contains
- * only values of a given type.
- *
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Framework_Constraint_TraversableContainsOnly extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @var string
- */
- protected $type;
- /**
- * @param string $type
- * @param bool $isNativeType
- */
- public function __construct($type, $isNativeType = true)
- {
- parent::__construct();
- if ($isNativeType) {
- $this->constraint = new PHPUnit_Framework_Constraint_IsType($type);
- } else {
- $this->constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
- $type
- );
- }
- $this->type = $type;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- foreach ($other as $item) {
- if (!$this->constraint->evaluate($item, '', true)) {
- $success = false;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'contains only values of type "' . $this->type . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks whether a variable is empty().
- *
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_Constraint_IsEmpty extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($other instanceof Countable) {
- return count($other) === 0;
- }
- return empty($other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is empty';
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- $type = gettype($other);
- return sprintf(
- '%s %s %s',
- $type[0] == 'a' || $type[0] == 'o' ? 'an' : 'a',
- $type,
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for matches
- * a regular expression.
- *
- * Checks a given value using the Perl Compatible Regular Expression extension
- * in PHP. The pattern is matched by executing preg_match().
- *
- * The pattern string passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_PCREMatch extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $pattern;
- /**
- * @param string $pattern
- */
- public function __construct($pattern)
- {
- parent::__construct();
- $this->pattern = $pattern;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return preg_match($this->pattern, $other) > 0;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'matches PCRE pattern "%s"',
- $this->pattern
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts null.
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsNull extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === null;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is null';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_Attribute extends PHPUnit_Framework_Constraint_Composite
- {
- /**
- * @var string
- */
- protected $attributeName;
- /**
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- */
- public function __construct(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- parent::__construct($constraint);
- $this->attributeName = $attributeName;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- return parent::evaluate(
- PHPUnit_Framework_Assert::readAttribute(
- $other,
- $this->attributeName
- ),
- $description,
- $returnResult
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'attribute "' . $this->attributeName . '" ' .
- $this->innerConstraint->toString();
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts false.
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsFalse extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is false';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the class it is evaluated for has a given
- * static attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_ClassHasStaticAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $class = new ReflectionClass($other);
- if ($class->hasProperty($this->attributeName)) {
- $attribute = $class->getProperty($this->attributeName);
- return $attribute->isStatic();
- } else {
- return false;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- * @since Method available since Release 3.3.0
- */
- public function toString()
- {
- return sprintf(
- 'has static attribute "%s"',
- $this->attributeName
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical OR.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Or extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = false;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- if ($constraint->evaluate($other, $description, true)) {
- $success = true;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' or ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that one value is identical to another.
- *
- * Identical check is performed with PHP's === operator, the operator is
- * explained in detail at
- * {@url http://www.php.net/manual/en/types.comparisons.php}.
- * Two values are identical if they have the same value and are of the same
- * type.
- *
- * The expected value is passed in the constructor.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsIdentical extends PHPUnit_Framework_Constraint
- {
- /**
- * @var float
- */
- const EPSILON = 0.0000000001;
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @param mixed $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- if (is_double($this->value) && is_double($other) &&
- !is_infinite($this->value) && !is_infinite($other) &&
- !is_nan($this->value) && !is_nan($other)) {
- $success = abs($this->value - $other) < self::EPSILON;
- } else {
- $success = $this->value === $other;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $f = null;
- // if both values are strings, make sure a diff is generated
- if (is_string($this->value) && is_string($other)) {
- $f = new SebastianBergmann\Comparator\ComparisonFailure(
- $this->value,
- $other,
- $this->value,
- $other
- );
- }
- $this->fail($other, $description, $f);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- if (is_object($this->value) && is_object($other)) {
- return 'two variables reference the same object';
- }
- if (is_string($this->value) && is_string($other)) {
- return 'two strings are identical';
- }
- return parent::failureDescription($other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if (is_object($this->value)) {
- return 'is identical to an object of class "' .
- get_class($this->value) . '"';
- } else {
- return 'is identical to ' .
- $this->exporter->export($this->value);
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks if the file(name) that it is evaluated for exists.
- *
- * The file path to check is passed as $other in evaluate().
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_FileExists extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return file_exists($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- 'file "%s" exists',
- $other
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'file exists';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.1.0
- */
- abstract class PHPUnit_Framework_Constraint_Composite extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $innerConstraint;
- /**
- * @param PHPUnit_Framework_Constraint $innerConstraint
- */
- public function __construct(PHPUnit_Framework_Constraint $innerConstraint)
- {
- parent::__construct();
- $this->innerConstraint = $innerConstraint;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- try {
- return $this->innerConstraint->evaluate(
- $other,
- $description,
- $returnResult
- );
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- $this->fail($other, $description);
- }
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- */
- public function count()
- {
- return count($this->innerConstraint);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for begins with a
- * given prefix.
- *
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Constraint_StringStartsWith extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $prefix;
- /**
- * @param string $prefix
- */
- public function __construct($prefix)
- {
- parent::__construct();
- $this->prefix = $prefix;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return strpos($other, $this->prefix) === 0;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'starts with "' . $this->prefix . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for ends with a given
- * suffix.
- *
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Constraint_StringEndsWith extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $suffix;
- /**
- * @param string $suffix
- */
- public function __construct($suffix)
- {
- parent::__construct();
- $this->suffix = $suffix;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return substr($other, 0 - strlen($this->suffix)) == $this->suffix;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'ends with "' . $this->suffix . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts any input value.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsAnything extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- return $returnResult ? true : null;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is anything';
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.5.0
- */
- public function count()
- {
- return 0;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_Constraint_Count extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $expectedCount = 0;
- /**
- * @param int $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedCount = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other
- * @return bool
- */
- protected function matches($other)
- {
- return $this->expectedCount === $this->getCountOf($other);
- }
- /**
- * @param mixed $other
- * @return bool
- */
- protected function getCountOf($other)
- {
- if ($other instanceof Countable || is_array($other)) {
- return count($other);
- } elseif ($other instanceof Traversable) {
- if ($other instanceof IteratorAggregate) {
- $iterator = $other->getIterator();
- } else {
- $iterator = $other;
- }
- $key = $iterator->key();
- $count = iterator_count($iterator);
- // manually rewind $iterator to previous key, since iterator_count
- // moves pointer
- if ($key !== null) {
- $iterator->rewind();
- while ($iterator->valid() && $key !== $iterator->key()) {
- $iterator->next();
- }
- }
- return $count;
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- 'actual size %d matches expected size %d',
- $this->getCountOf($other),
- $this->expectedCount
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'count matches %d',
- $this->expectedCount
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical AND.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_And extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $lastConstraint = null;
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- * @throws PHPUnit_Framework_Exception
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- throw new PHPUnit_Framework_Exception(
- 'All parameters to ' . __CLASS__ .
- ' must be a constraint object.'
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- if (!$constraint->evaluate($other, $description, true)) {
- $success = false;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' and ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return int
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An empty Listener that can be extended to implement TestListener
- * with just a few lines of code.
- * @see PHPUnit_Framework_TestListener for documentation on the API methods.
- *
- * @since Class available since Release 4.0.0
- */
- abstract class PHPUnit_Framework_BaseTestListener implements PHPUnit_Framework_TestListener
- {
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- }
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- public function startTest(PHPUnit_Framework_Test $test)
- {
- }
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a skipped test.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test test that unintentionally covers code.
- *
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_UnintentionallyCoveredCodeError extends PHPUnit_Framework_RiskyTestError
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A warning.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_Warning extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var bool
- */
- protected $backupGlobals = false;
- /**
- * @var bool
- */
- protected $backupStaticAttributes = false;
- /**
- * @var bool
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var bool
- */
- protected $useErrorHandler = false;
- /**
- * @param string $message
- */
- public function __construct($message = '')
- {
- $this->message = $message;
- parent::__construct('Warning');
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->fail($this->message);
- }
- /**
- * @return string
- * @since Method available since Release 3.0.0
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- * @since Method available since Release 3.4.0
- */
- public function toString()
- {
- return 'Warning';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * We have a TestSuite object A.
- * In TestSuite object A we have Tests tagged with @group.
- * We want a TestSuite object B that contains TestSuite objects C, D, ...
- * for the Tests tagged with @group C, @group D, ...
- * Running the Tests from TestSuite object B results in Tests tagged with both
- * @group C and @group D in TestSuite object A to be run twice .
- *
- * <code>
- * $suite = new PHPUnit_Extensions_GroupTestSuite($A, array('C', 'D'));
- * </code>
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Extensions_GroupTestSuite extends PHPUnit_Framework_TestSuite
- {
- public function __construct(PHPUnit_Framework_TestSuite $suite, array $groups)
- {
- $groupSuites = array();
- $name = $suite->getName();
- foreach ($groups as $group) {
- $groupSuites[$group] = new PHPUnit_Framework_TestSuite($name . ' - ' . $group);
- $this->addTest($groupSuites[$group]);
- }
- $tests = new RecursiveIteratorIterator(
- new PHPUnit_Util_TestSuiteIterator($suite),
- RecursiveIteratorIterator::LEAVES_ONLY
- );
- foreach ($tests as $test) {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $testGroups = PHPUnit_Util_Test::getGroups(
- get_class($test),
- $test->getName(false)
- );
- foreach ($groups as $group) {
- foreach ($testGroups as $testGroup) {
- if ($group == $testGroup) {
- $groupSuites[$group]->addTest($test);
- }
- }
- }
- }
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Suite for .phpt test cases.
- *
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Extensions_PhptTestSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Constructs a new TestSuite for .phpt test cases.
- *
- * @param string $directory
- * @param array $options Array with ini settings for the php instance run,
- * key being the name if the setting, value the ini value.
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($directory, array $options = array())
- {
- if (is_string($directory) && is_dir($directory)) {
- $this->setName($directory);
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, '.phpt');
- foreach ($files as $file) {
- $this->addTestFile($file, $options);
- }
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'directory name');
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Decorator that runs a test repeatedly.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator
- {
- /**
- * @var bool
- */
- protected $processIsolation = false;
- /**
- * @var int
- */
- protected $timesRepeat = 1;
- /**
- * @param PHPUnit_Framework_Test $test
- * @param int $timesRepeat
- * @param bool $processIsolation
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1, $processIsolation = false)
- {
- parent::__construct($test);
- if (is_integer($timesRepeat) &&
- $timesRepeat >= 0) {
- $this->timesRepeat = $timesRepeat;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'positive integer'
- );
- }
- $this->processIsolation = $processIsolation;
- }
- /**
- * Counts the number of test cases that
- * will be run by this test.
- *
- * @return int
- */
- public function count()
- {
- return $this->timesRepeat * count($this->test);
- }
- /**
- * Runs the decorated test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- //@codingStandardsIgnoreStart
- for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) {
- //@codingStandardsIgnoreEnd
- if ($this->test instanceof PHPUnit_Framework_TestSuite) {
- $this->test->setRunTestInSeparateProcess($this->processIsolation);
- }
- $this->test->run($result);
- }
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for test listeners that interact with an issue tracker.
- *
- * @since Class available since Release 3.4.0
- */
- abstract class PHPUnit_Extensions_TicketListener implements PHPUnit_Framework_TestListener
- {
- /**
- * @var array
- */
- protected $ticketCounts = array();
- /**
- * @var bool
- */
- protected $ran = false;
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * A test suite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test suite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($this->ran) {
- return;
- }
- $name = $test->getName(false);
- $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
- foreach ($tickets as $ticket) {
- $this->ticketCounts[$ticket][$name] = 1;
- }
- $this->ran = true;
- }
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $ifStatus = array('assigned', 'new', 'reopened');
- $newStatus = 'closed';
- $message = 'Automatically closed by PHPUnit (test passed).';
- $resolution = 'fixed';
- $cumulative = true;
- } elseif ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
- $ifStatus = array('closed');
- $newStatus = 'reopened';
- $message = 'Automatically reopened by PHPUnit (test failed).';
- $resolution = '';
- $cumulative = false;
- } else {
- return;
- }
- $name = $test->getName(false);
- $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
- foreach ($tickets as $ticket) {
- // Remove this test from the totals (if it passed).
- if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- unset($this->ticketCounts[$ticket][$name]);
- }
- // Only close tickets if ALL referenced cases pass
- // but reopen tickets if a single test fails.
- if ($cumulative) {
- // Determine number of to-pass tests:
- if (count($this->ticketCounts[$ticket]) > 0) {
- // There exist remaining test cases with this reference.
- $adjustTicket = false;
- } else {
- // No remaining tickets, go ahead and adjust.
- $adjustTicket = true;
- }
- } else {
- $adjustTicket = true;
- }
- $ticketInfo = $this->getTicketInfo($ticket);
- if ($adjustTicket && in_array($ticketInfo['status'], $ifStatus)) {
- $this->updateTicket($ticket, $newStatus, $message, $resolution);
- }
- }
- }
- }
- abstract protected function getTicketInfo($ticketId = null);
- abstract protected function updateTicket($ticketId, $newStatus, $message, $resolution);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Decorator for Tests.
- *
- * Use TestDecorator as the base class for defining new
- * test decorators. Test decorator subclasses can be introduced
- * to add behaviour before or after a test is run.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * The Test to be decorated.
- *
- * @var object
- */
- protected $test = null;
- /**
- * Constructor.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function __construct(PHPUnit_Framework_Test $test)
- {
- $this->test = $test;
- }
- /**
- * Returns a string representation of the test.
- *
- * @return string
- */
- public function toString()
- {
- return $this->test->toString();
- }
- /**
- * Runs the test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- */
- public function basicRun(PHPUnit_Framework_TestResult $result)
- {
- $this->test->run($result);
- }
- /**
- * Counts the number of test cases that
- * will be run by this test.
- *
- * @return int
- */
- public function count()
- {
- return count($this->test);
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * Returns the test to be run.
- *
- * @return PHPUnit_Framework_Test
- */
- public function getTest()
- {
- return $this->test;
- }
- /**
- * Runs the decorated test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- $this->basicRun($result);
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Runner for PHPT test cases.
- *
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * @var string
- */
- private $filename;
- /**
- * @var array
- */
- private $settings = array(
- 'allow_url_fopen=1',
- 'auto_append_file=',
- 'auto_prepend_file=',
- 'disable_functions=',
- 'display_errors=1',
- 'docref_root=',
- 'docref_ext=.html',
- 'error_append_string=',
- 'error_prepend_string=',
- 'error_reporting=-1',
- 'html_errors=0',
- 'log_errors=0',
- 'magic_quotes_runtime=0',
- 'output_handler=',
- 'open_basedir=',
- 'output_buffering=Off',
- 'report_memleaks=0',
- 'report_zend_debug=0',
- 'safe_mode=0',
- 'track_errors=1',
- 'xdebug.default_enable=0'
- );
- /**
- * Constructs a test case with the given filename.
- *
- * @param string $filename
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($filename)
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_file($filename)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'File "%s" does not exist.',
- $filename
- )
- );
- }
- $this->filename = $filename;
- }
- /**
- * Counts the number of test cases executed by run(TestResult result).
- *
- * @return int
- */
- public function count()
- {
- return 1;
- }
- /**
- * Runs a test and collects its result in a TestResult instance.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- $sections = $this->parse();
- $code = $this->render($sections['FILE']);
- if ($result === null) {
- $result = new PHPUnit_Framework_TestResult;
- }
- $php = PHPUnit_Util_PHP::factory();
- $skip = false;
- $time = 0;
- $settings = $this->settings;
- $result->startTest($this);
- if (isset($sections['INI'])) {
- $settings = array_merge($settings, $this->parseIniSection($sections['INI']));
- }
- if (isset($sections['SKIPIF'])) {
- $jobResult = $php->runJob($sections['SKIPIF'], $settings);
- if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) {
- if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $message)) {
- $message = substr($message[1], 2);
- } else {
- $message = '';
- }
- $result->addFailure($this, new PHPUnit_Framework_SkippedTestError($message), 0);
- $skip = true;
- }
- }
- if (!$skip) {
- PHP_Timer::start();
- $jobResult = $php->runJob($code, $settings);
- $time = PHP_Timer::stop();
- if (isset($sections['EXPECT'])) {
- $assertion = 'assertEquals';
- $expected = $sections['EXPECT'];
- } else {
- $assertion = 'assertStringMatchesFormat';
- $expected = $sections['EXPECTF'];
- }
- $output = preg_replace('/\r\n/', "\n", trim($jobResult['stdout']));
- $expected = preg_replace('/\r\n/', "\n", trim($expected));
- try {
- PHPUnit_Framework_Assert::$assertion($expected, $output);
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $result->addFailure($this, $e, $time);
- } catch (Throwable $t) {
- $result->addError($this, $t, $time);
- } catch (Exception $e) {
- $result->addError($this, $e, $time);
- }
- }
- $result->endTest($this, $time);
- return $result;
- }
- /**
- * Returns the name of the test case.
- *
- * @return string
- */
- public function getName()
- {
- return $this->toString();
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->filename;
- }
- /**
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- private function parse()
- {
- $sections = array();
- $section = '';
- foreach (file($this->filename) as $line) {
- if (preg_match('/^--([_A-Z]+)--/', $line, $result)) {
- $section = $result[1];
- $sections[$section] = '';
- continue;
- } elseif (empty($section)) {
- throw new PHPUnit_Framework_Exception('Invalid PHPT file');
- }
- $sections[$section] .= $line;
- }
- if (!isset($sections['FILE']) ||
- (!isset($sections['EXPECT']) && !isset($sections['EXPECTF']))) {
- throw new PHPUnit_Framework_Exception('Invalid PHPT file');
- }
- return $sections;
- }
- /**
- * @param string $code
- * @return string
- */
- private function render($code)
- {
- return str_replace(
- array(
- '__DIR__',
- '__FILE__'
- ),
- array(
- "'" . dirname($this->filename) . "'",
- "'" . $this->filename . "'"
- ),
- $code
- );
- }
- /**
- * Parse --INI-- section key value pairs and return as array.
- *
- * @param string
- * @return array
- */
- protected function parseIniSection($content)
- {
- return preg_split('/\n|\r/', $content, -1, PREG_SPLIT_NO_EMPTY);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestRunner for the Command Line Interface (CLI)
- * PHP SAPI Module.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_TextUI_Command
- {
- /**
- * @var array
- */
- protected $arguments = array(
- 'listGroups' => false,
- 'loader' => null,
- 'useDefaultConfiguration' => true
- );
- /**
- * @var array
- */
- protected $options = array();
- /**
- * @var array
- */
- protected $longOptions = array(
- 'colors==' => null,
- 'bootstrap=' => null,
- 'columns=' => null,
- 'configuration=' => null,
- 'coverage-clover=' => null,
- 'coverage-crap4j=' => null,
- 'coverage-html=' => null,
- 'coverage-php=' => null,
- 'coverage-text==' => null,
- 'coverage-xml=' => null,
- 'debug' => null,
- 'exclude-group=' => null,
- 'filter=' => null,
- 'testsuite=' => null,
- 'group=' => null,
- 'help' => null,
- 'include-path=' => null,
- 'list-groups' => null,
- 'loader=' => null,
- 'log-json=' => null,
- 'log-junit=' => null,
- 'log-tap=' => null,
- 'process-isolation' => null,
- 'repeat=' => null,
- 'stderr' => null,
- 'stop-on-error' => null,
- 'stop-on-failure' => null,
- 'stop-on-incomplete' => null,
- 'stop-on-risky' => null,
- 'stop-on-skipped' => null,
- 'report-useless-tests' => null,
- 'strict-coverage' => null,
- 'disallow-test-output' => null,
- 'enforce-time-limit' => null,
- 'disallow-todo-tests' => null,
- 'strict-global-state' => null,
- 'strict' => null,
- 'tap' => null,
- 'testdox' => null,
- 'testdox-html=' => null,
- 'testdox-text=' => null,
- 'test-suffix=' => null,
- 'no-configuration' => null,
- 'no-globals-backup' => null,
- 'printer=' => null,
- 'static-backup' => null,
- 'verbose' => null,
- 'version' => null
- );
- /**
- * @var bool
- */
- private $versionStringPrinted = false;
- /**
- * @param bool $exit
- */
- public static function main($exit = true)
- {
- $command = new static;
- return $command->run($_SERVER['argv'], $exit);
- }
- /**
- * @param array $argv
- * @param bool $exit
- * @return int
- */
- public function run(array $argv, $exit = true)
- {
- $this->handleArguments($argv);
- $runner = $this->createRunner();
- if (is_object($this->arguments['test']) &&
- $this->arguments['test'] instanceof PHPUnit_Framework_Test) {
- $suite = $this->arguments['test'];
- } else {
- $suite = $runner->getTest(
- $this->arguments['test'],
- $this->arguments['testFile'],
- $this->arguments['testSuffixes']
- );
- }
- if ($this->arguments['listGroups']) {
- $this->printVersionString();
- print "Available test group(s):\n";
- $groups = $suite->getGroups();
- sort($groups);
- foreach ($groups as $group) {
- print " - $group\n";
- }
- if ($exit) {
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- } else {
- return PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
- }
- }
- unset($this->arguments['test']);
- unset($this->arguments['testFile']);
- try {
- $result = $runner->doRun($suite, $this->arguments);
- } catch (PHPUnit_Framework_Exception $e) {
- print $e->getMessage() . "\n";
- }
- $ret = PHPUnit_TextUI_TestRunner::FAILURE_EXIT;
- if (isset($result) && $result->wasSuccessful()) {
- $ret = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
- } elseif (!isset($result) || $result->errorCount() > 0) {
- $ret = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT;
- }
- if ($exit) {
- exit($ret);
- } else {
- return $ret;
- }
- }
- /**
- * Create a TestRunner, override in subclasses.
- *
- * @return PHPUnit_TextUI_TestRunner
- * @since Method available since Release 3.6.0
- */
- protected function createRunner()
- {
- return new PHPUnit_TextUI_TestRunner($this->arguments['loader']);
- }
- /**
- * Handles the command-line arguments.
- *
- * A child class of PHPUnit_TextUI_Command can hook into the argument
- * parsing by adding the switch(es) to the $longOptions array and point to a
- * callback method that handles the switch(es) in the child class like this
- *
- * <code>
- * <?php
- * class MyCommand extends PHPUnit_TextUI_Command
- * {
- * public function __construct()
- * {
- * // my-switch won't accept a value, it's an on/off
- * $this->longOptions['my-switch'] = 'myHandler';
- * // my-secondswitch will accept a value - note the equals sign
- * $this->longOptions['my-secondswitch='] = 'myOtherHandler';
- * }
- *
- * // --my-switch -> myHandler()
- * protected function myHandler()
- * {
- * }
- *
- * // --my-secondswitch foo -> myOtherHandler('foo')
- * protected function myOtherHandler ($value)
- * {
- * }
- *
- * // You will also need this - the static keyword in the
- * // PHPUnit_TextUI_Command will mean that it'll be
- * // PHPUnit_TextUI_Command that gets instantiated,
- * // not MyCommand
- * public static function main($exit = true)
- * {
- * $command = new static;
- *
- * return $command->run($_SERVER['argv'], $exit);
- * }
- *
- * }
- * </code>
- *
- * @param array $argv
- */
- protected function handleArguments(array $argv)
- {
- if (defined('__PHPUNIT_PHAR__')) {
- $this->longOptions['selfupdate'] = null;
- $this->longOptions['self-update'] = null;
- }
- try {
- $this->options = PHPUnit_Util_Getopt::getopt(
- $argv,
- 'd:c:hv',
- array_keys($this->longOptions)
- );
- } catch (PHPUnit_Framework_Exception $e) {
- $this->showError($e->getMessage());
- }
- foreach ($this->options[0] as $option) {
- switch ($option[0]) {
- case '--colors':
- $this->arguments['colors'] = $option[1] ?: PHPUnit_TextUI_ResultPrinter::COLOR_AUTO;
- break;
- case '--bootstrap':
- $this->arguments['bootstrap'] = $option[1];
- break;
- case '--columns':
- if (is_numeric($option[1])) {
- $this->arguments['columns'] = (int) $option[1];
- } elseif ($option[1] == 'max') {
- $this->arguments['columns'] = 'max';
- }
- break;
- case 'c':
- case '--configuration':
- $this->arguments['configuration'] = $option[1];
- break;
- case '--coverage-clover':
- $this->arguments['coverageClover'] = $option[1];
- break;
- case '--coverage-crap4j':
- $this->arguments['coverageCrap4J'] = $option[1];
- break;
- case '--coverage-html':
- $this->arguments['coverageHtml'] = $option[1];
- break;
- case '--coverage-php':
- $this->arguments['coveragePHP'] = $option[1];
- break;
- case '--coverage-text':
- if ($option[1] === null) {
- $option[1] = 'php://stdout';
- }
- $this->arguments['coverageText'] = $option[1];
- $this->arguments['coverageTextShowUncoveredFiles'] = false;
- $this->arguments['coverageTextShowOnlySummary'] = false;
- break;
- case '--coverage-xml':
- $this->arguments['coverageXml'] = $option[1];
- break;
- case 'd':
- $ini = explode('=', $option[1]);
- if (isset($ini[0])) {
- if (isset($ini[1])) {
- ini_set($ini[0], $ini[1]);
- } else {
- ini_set($ini[0], true);
- }
- }
- break;
- case '--debug':
- $this->arguments['debug'] = true;
- break;
- case 'h':
- case '--help':
- $this->showHelp();
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- break;
- case '--filter':
- $this->arguments['filter'] = $option[1];
- break;
- case '--testsuite':
- $this->arguments['testsuite'] = $option[1];
- break;
- case '--group':
- $this->arguments['groups'] = explode(',', $option[1]);
- break;
- case '--exclude-group':
- $this->arguments['excludeGroups'] = explode(
- ',',
- $option[1]
- );
- break;
- case '--test-suffix':
- $this->arguments['testSuffixes'] = explode(
- ',',
- $option[1]
- );
- break;
- case '--include-path':
- $includePath = $option[1];
- break;
- case '--list-groups':
- $this->arguments['listGroups'] = true;
- break;
- case '--printer':
- $this->arguments['printer'] = $option[1];
- break;
- case '--loader':
- $this->arguments['loader'] = $option[1];
- break;
- case '--log-json':
- $this->arguments['jsonLogfile'] = $option[1];
- break;
- case '--log-junit':
- $this->arguments['junitLogfile'] = $option[1];
- break;
- case '--log-tap':
- $this->arguments['tapLogfile'] = $option[1];
- break;
- case '--process-isolation':
- $this->arguments['processIsolation'] = true;
- break;
- case '--repeat':
- $this->arguments['repeat'] = (int) $option[1];
- break;
- case '--stderr':
- $this->arguments['stderr'] = true;
- break;
- case '--stop-on-error':
- $this->arguments['stopOnError'] = true;
- break;
- case '--stop-on-failure':
- $this->arguments['stopOnFailure'] = true;
- break;
- case '--stop-on-incomplete':
- $this->arguments['stopOnIncomplete'] = true;
- break;
- case '--stop-on-risky':
- $this->arguments['stopOnRisky'] = true;
- break;
- case '--stop-on-skipped':
- $this->arguments['stopOnSkipped'] = true;
- break;
- case '--tap':
- $this->arguments['printer'] = 'PHPUnit_Util_Log_TAP';
- break;
- case '--testdox':
- $this->arguments['printer'] = 'PHPUnit_Util_TestDox_ResultPrinter_Text';
- break;
- case '--testdox-html':
- $this->arguments['testdoxHTMLFile'] = $option[1];
- break;
- case '--testdox-text':
- $this->arguments['testdoxTextFile'] = $option[1];
- break;
- case '--no-configuration':
- $this->arguments['useDefaultConfiguration'] = false;
- break;
- case '--no-globals-backup':
- $this->arguments['backupGlobals'] = false;
- break;
- case '--static-backup':
- $this->arguments['backupStaticAttributes'] = true;
- break;
- case 'v':
- case '--verbose':
- $this->arguments['verbose'] = true;
- break;
- case '--version':
- $this->printVersionString();
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- break;
- case '--report-useless-tests':
- $this->arguments['reportUselessTests'] = true;
- break;
- case '--strict-coverage':
- $this->arguments['strictCoverage'] = true;
- break;
- case '--strict-global-state':
- $this->arguments['disallowChangesToGlobalState'] = true;
- break;
- case '--disallow-test-output':
- $this->arguments['disallowTestOutput'] = true;
- break;
- case '--enforce-time-limit':
- $this->arguments['enforceTimeLimit'] = true;
- break;
- case '--disallow-todo-tests':
- $this->arguments['disallowTodoAnnotatedTests'] = true;
- break;
- case '--strict':
- $this->arguments['reportUselessTests'] = true;
- $this->arguments['strictCoverage'] = true;
- $this->arguments['disallowTestOutput'] = true;
- $this->arguments['enforceTimeLimit'] = true;
- $this->arguments['disallowTodoAnnotatedTests'] = true;
- $this->arguments['deprecatedStrictModeOption'] = true;
- break;
- case '--selfupdate':
- case '--self-update':
- $this->handleSelfUpdate();
- break;
- default:
- $optionName = str_replace('--', '', $option[0]);
- if (isset($this->longOptions[$optionName])) {
- $handler = $this->longOptions[$optionName];
- } elseif (isset($this->longOptions[$optionName . '='])) {
- $handler = $this->longOptions[$optionName . '='];
- }
- if (isset($handler) && is_callable(array($this, $handler))) {
- $this->$handler($option[1]);
- }
- }
- }
- $this->handleCustomTestSuite();
- if (!isset($this->arguments['test'])) {
- if (isset($this->options[1][0])) {
- $this->arguments['test'] = $this->options[1][0];
- }
- if (isset($this->options[1][1])) {
- $this->arguments['testFile'] = realpath($this->options[1][1]);
- } else {
- $this->arguments['testFile'] = '';
- }
- if (isset($this->arguments['test']) &&
- is_file($this->arguments['test']) &&
- substr($this->arguments['test'], -5, 5) != '.phpt') {
- $this->arguments['testFile'] = realpath($this->arguments['test']);
- $this->arguments['test'] = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.'));
- }
- }
- if (!isset($this->arguments['testSuffixes'])) {
- $this->arguments['testSuffixes'] = array('Test.php', '.phpt');
- }
- if (isset($includePath)) {
- ini_set(
- 'include_path',
- $includePath . PATH_SEPARATOR . ini_get('include_path')
- );
- }
- if ($this->arguments['loader'] !== null) {
- $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']);
- }
- if (isset($this->arguments['configuration']) &&
- is_dir($this->arguments['configuration'])) {
- $configurationFile = $this->arguments['configuration'] . '/phpunit.xml';
- if (file_exists($configurationFile)) {
- $this->arguments['configuration'] = realpath(
- $configurationFile
- );
- } elseif (file_exists($configurationFile . '.dist')) {
- $this->arguments['configuration'] = realpath(
- $configurationFile . '.dist'
- );
- }
- } elseif (!isset($this->arguments['configuration']) &&
- $this->arguments['useDefaultConfiguration']) {
- if (file_exists('phpunit.xml')) {
- $this->arguments['configuration'] = realpath('phpunit.xml');
- } elseif (file_exists('phpunit.xml.dist')) {
- $this->arguments['configuration'] = realpath(
- 'phpunit.xml.dist'
- );
- }
- }
- if (isset($this->arguments['configuration'])) {
- try {
- $configuration = PHPUnit_Util_Configuration::getInstance(
- $this->arguments['configuration']
- );
- } catch (Throwable $e) {
- print $e->getMessage() . "\n";
- exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
- } catch (Exception $e) {
- print $e->getMessage() . "\n";
- exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
- }
- $phpunit = $configuration->getPHPUnitConfiguration();
- $configuration->handlePHPConfiguration();
- /*
- * Issue #1216
- */
- if (isset($this->arguments['bootstrap'])) {
- $this->handleBootstrap($this->arguments['bootstrap']);
- } elseif (isset($phpunit['bootstrap'])) {
- $this->handleBootstrap($phpunit['bootstrap']);
- }
- /*
- * Issue #657
- */
- if (isset($phpunit['stderr']) && ! isset($this->arguments['stderr'])) {
- $this->arguments['stderr'] = $phpunit['stderr'];
- }
- if (isset($phpunit['printerClass'])) {
- if (isset($phpunit['printerFile'])) {
- $file = $phpunit['printerFile'];
- } else {
- $file = '';
- }
- $this->arguments['printer'] = $this->handlePrinter(
- $phpunit['printerClass'],
- $file
- );
- }
- if (isset($phpunit['testSuiteLoaderClass'])) {
- if (isset($phpunit['testSuiteLoaderFile'])) {
- $file = $phpunit['testSuiteLoaderFile'];
- } else {
- $file = '';
- }
- $this->arguments['loader'] = $this->handleLoader(
- $phpunit['testSuiteLoaderClass'],
- $file
- );
- }
- $browsers = $configuration->getSeleniumBrowserConfiguration();
- if (!empty($browsers)) {
- $this->arguments['deprecatedSeleniumConfiguration'] = true;
- if (class_exists('PHPUnit_Extensions_SeleniumTestCase')) {
- PHPUnit_Extensions_SeleniumTestCase::$browsers = $browsers;
- }
- }
- if (!isset($this->arguments['test'])) {
- $testSuite = $configuration->getTestSuiteConfiguration(isset($this->arguments['testsuite']) ? $this->arguments['testsuite'] : null);
- if ($testSuite !== null) {
- $this->arguments['test'] = $testSuite;
- }
- }
- } elseif (isset($this->arguments['bootstrap'])) {
- $this->handleBootstrap($this->arguments['bootstrap']);
- }
- if (isset($this->arguments['printer']) &&
- is_string($this->arguments['printer'])) {
- $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']);
- }
- if (isset($this->arguments['test']) && is_string($this->arguments['test']) && substr($this->arguments['test'], -5, 5) == '.phpt') {
- $test = new PHPUnit_Extensions_PhptTestCase($this->arguments['test']);
- $this->arguments['test'] = new PHPUnit_Framework_TestSuite;
- $this->arguments['test']->addTest($test);
- }
- if (!isset($this->arguments['test']) ||
- (isset($this->arguments['testDatabaseLogRevision']) && !isset($this->arguments['testDatabaseDSN']))) {
- $this->showHelp();
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- }
- /**
- * Handles the loading of the PHPUnit_Runner_TestSuiteLoader implementation.
- *
- * @param string $loaderClass
- * @param string $loaderFile
- * @return PHPUnit_Runner_TestSuiteLoader
- */
- protected function handleLoader($loaderClass, $loaderFile = '')
- {
- if (!class_exists($loaderClass, false)) {
- if ($loaderFile == '') {
- $loaderFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $loaderClass
- );
- }
- $loaderFile = stream_resolve_include_path($loaderFile);
- if ($loaderFile) {
- require $loaderFile;
- }
- }
- if (class_exists($loaderClass, false)) {
- $class = new ReflectionClass($loaderClass);
- if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') &&
- $class->isInstantiable()) {
- return $class->newInstance();
- }
- }
- if ($loaderClass == 'PHPUnit_Runner_StandardTestSuiteLoader') {
- return;
- }
- $this->showError(
- sprintf(
- 'Could not use "%s" as loader.',
- $loaderClass
- )
- );
- }
- /**
- * Handles the loading of the PHPUnit_Util_Printer implementation.
- *
- * @param string $printerClass
- * @param string $printerFile
- * @return PHPUnit_Util_Printer
- */
- protected function handlePrinter($printerClass, $printerFile = '')
- {
- if (!class_exists($printerClass, false)) {
- if ($printerFile == '') {
- $printerFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $printerClass
- );
- }
- $printerFile = stream_resolve_include_path($printerFile);
- if ($printerFile) {
- require $printerFile;
- }
- }
- if (class_exists($printerClass)) {
- $class = new ReflectionClass($printerClass);
- if ($class->implementsInterface('PHPUnit_Framework_TestListener') &&
- $class->isSubclassOf('PHPUnit_Util_Printer') &&
- $class->isInstantiable()) {
- if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) {
- return $printerClass;
- }
- $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null;
- return $class->newInstance($outputStream);
- }
- }
- $this->showError(
- sprintf(
- 'Could not use "%s" as printer.',
- $printerClass
- )
- );
- }
- /**
- * Loads a bootstrap file.
- *
- * @param string $filename
- */
- protected function handleBootstrap($filename)
- {
- try {
- PHPUnit_Util_Fileloader::checkAndLoad($filename);
- } catch (PHPUnit_Framework_Exception $e) {
- $this->showError($e->getMessage());
- }
- }
- /**
- * @since Method available since Release 4.0.0
- */
- protected function handleSelfUpdate()
- {
- $this->printVersionString();
- $localFilename = realpath($_SERVER['argv'][0]);
- if (!is_writable($localFilename)) {
- print 'No write permission to update ' . $localFilename . "\n";
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- if (!extension_loaded('openssl')) {
- print "The OpenSSL extension is not loaded.\n";
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- $remoteFilename = sprintf(
- 'https://phar.phpunit.de/phpunit%s.phar',
- PHPUnit_Runner_Version::getReleaseChannel()
- );
- $tempFilename = tempnam(sys_get_temp_dir(), 'phpunit') . '.phar';
- // Workaround for https://bugs.php.net/bug.php?id=65538
- $caFile = dirname($tempFilename) . '/ca.pem';
- copy(__PHPUNIT_PHAR_ROOT__ . '/ca.pem', $caFile);
- print 'Updating the PHPUnit PHAR ... ';
- $options = array(
- 'ssl' => array(
- 'allow_self_signed' => false,
- 'cafile' => $caFile,
- 'verify_peer' => true
- )
- );
- if (PHP_VERSION_ID < 50600) {
- $options['ssl']['CN_match'] = 'phar.phpunit.de';
- $options['ssl']['SNI_server_name'] = 'phar.phpunit.de';
- }
- file_put_contents(
- $tempFilename,
- file_get_contents(
- $remoteFilename,
- false,
- stream_context_create($options)
- )
- );
- chmod($tempFilename, 0777 & ~umask());
- try {
- $phar = new Phar($tempFilename);
- unset($phar);
- rename($tempFilename, $localFilename);
- unlink($caFile);
- } catch (Throwable $_e) {
- $e = $_e;
- } catch (Exception $_e) {
- $e = $_e;
- }
- if (isset($e)) {
- unlink($caFile);
- unlink($tempFilename);
- print " done\n\n" . $e->getMessage() . "\n";
- exit(2);
- }
- print " done\n";
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- }
- /**
- * Show the help message.
- */
- protected function showHelp()
- {
- $this->printVersionString();
- print <<<EOT
- Usage: phpunit [options] UnitTest [UnitTest.php]
- phpunit [options] <directory>
- Code Coverage Options:
- --coverage-clover <file> Generate code coverage report in Clover XML format.
- --coverage-crap4j <file> Generate code coverage report in Crap4J XML format.
- --coverage-html <dir> Generate code coverage report in HTML format.
- --coverage-php <file> Export PHP_CodeCoverage object to file.
- --coverage-text=<file> Generate code coverage report in text format.
- Default: Standard output.
- --coverage-xml <dir> Generate code coverage report in PHPUnit XML format.
- Logging Options:
- --log-junit <file> Log test execution in JUnit XML format to file.
- --log-tap <file> Log test execution in TAP format to file.
- --log-json <file> Log test execution in JSON format.
- --testdox-html <file> Write agile documentation in HTML format to file.
- --testdox-text <file> Write agile documentation in Text format to file.
- Test Selection Options:
- --filter <pattern> Filter which tests to run.
- --testsuite <pattern> Filter which testsuite to run.
- --group ... Only runs tests from the specified group(s).
- --exclude-group ... Exclude tests from the specified group(s).
- --list-groups List available test groups.
- --test-suffix ... Only search for test in files with specified
- suffix(es). Default: Test.php,.phpt
- Test Execution Options:
- --report-useless-tests Be strict about tests that do not test anything.
- --strict-coverage Be strict about unintentionally covered code.
- --strict-global-state Be strict about changes to global state
- --disallow-test-output Be strict about output during tests.
- --enforce-time-limit Enforce time limit based on test size.
- --disallow-todo-tests Disallow @todo-annotated tests.
- --process-isolation Run each test in a separate PHP process.
- --no-globals-backup Do not backup and restore \$GLOBALS for each test.
- --static-backup Backup and restore static attributes for each test.
- --colors=<flag> Use colors in output ("never", "auto" or "always").
- --columns <n> Number of columns to use for progress output.
- --columns max Use maximum number of columns for progress output.
- --stderr Write to STDERR instead of STDOUT.
- --stop-on-error Stop execution upon first error.
- --stop-on-failure Stop execution upon first error or failure.
- --stop-on-risky Stop execution upon first risky test.
- --stop-on-skipped Stop execution upon first skipped test.
- --stop-on-incomplete Stop execution upon first incomplete test.
- -v|--verbose Output more verbose information.
- --debug Display debugging information during test execution.
- --loader <loader> TestSuiteLoader implementation to use.
- --repeat <times> Runs the test(s) repeatedly.
- --tap Report test execution progress in TAP format.
- --testdox Report test execution progress in TestDox format.
- --printer <printer> TestListener implementation to use.
- Configuration Options:
- --bootstrap <file> A "bootstrap" PHP file that is run before the tests.
- -c|--configuration <file> Read configuration from XML file.
- --no-configuration Ignore default configuration file (phpunit.xml).
- --include-path <path(s)> Prepend PHP's include_path with given path(s).
- -d key[=value] Sets a php.ini value.
- Miscellaneous Options:
- -h|--help Prints this usage information.
- --version Prints the version and exits.
- EOT;
- if (defined('__PHPUNIT_PHAR__')) {
- print "\n --self-update Update PHPUnit to the latest version.\n";
- }
- }
- /**
- * Custom callback for test suite discovery.
- */
- protected function handleCustomTestSuite()
- {
- }
- private function printVersionString()
- {
- if ($this->versionStringPrinted) {
- return;
- }
- print PHPUnit_Runner_Version::getVersionString() . "\n\n";
- $this->versionStringPrinted = true;
- }
- /**
- */
- private function showError($message)
- {
- $this->printVersionString();
- print $message . "\n";
- exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * A TestRunner for the Command Line Interface (CLI)
- * PHP SAPI Module.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner
- {
- const SUCCESS_EXIT = 0;
- const FAILURE_EXIT = 1;
- const EXCEPTION_EXIT = 2;
- /**
- * @var PHP_CodeCoverage_Filter
- */
- protected $codeCoverageFilter;
- /**
- * @var PHPUnit_Runner_TestSuiteLoader
- */
- protected $loader = null;
- /**
- * @var PHPUnit_TextUI_ResultPrinter
- */
- protected $printer = null;
- /**
- * @var bool
- */
- protected static $versionStringPrinted = false;
- /**
- * @var array
- */
- private $missingExtensions = array();
- /**
- * @var Runtime
- */
- private $runtime;
- /**
- * @param PHPUnit_Runner_TestSuiteLoader $loader
- * @param PHP_CodeCoverage_Filter $filter
- * @since Method available since Release 3.4.0
- */
- public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, PHP_CodeCoverage_Filter $filter = null)
- {
- if ($filter === null) {
- $filter = $this->getCodeCoverageFilter();
- }
- $this->codeCoverageFilter = $filter;
- $this->loader = $loader;
- $this->runtime = new Runtime;
- }
- /**
- * @param PHPUnit_Framework_Test|ReflectionClass $test
- * @param array $arguments
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public static function run($test, array $arguments = array())
- {
- if ($test instanceof ReflectionClass) {
- $test = new PHPUnit_Framework_TestSuite($test);
- }
- if ($test instanceof PHPUnit_Framework_Test) {
- $aTestRunner = new self;
- return $aTestRunner->doRun(
- $test,
- $arguments
- );
- } else {
- throw new PHPUnit_Framework_Exception(
- 'No test case or test suite found.'
- );
- }
- }
- /**
- * @return PHPUnit_Framework_TestResult
- */
- protected function createTestResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- private function processSuiteFilters(PHPUnit_Framework_TestSuite $suite, array $arguments)
- {
- if (!$arguments['filter'] &&
- empty($arguments['groups']) &&
- empty($arguments['excludeGroups'])) {
- return;
- }
- $filterFactory = new PHPUnit_Runner_Filter_Factory();
- if (!empty($arguments['excludeGroups'])) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'),
- $arguments['excludeGroups']
- );
- }
- if (!empty($arguments['groups'])) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Group_Include'),
- $arguments['groups']
- );
- }
- if ($arguments['filter']) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Test'),
- $arguments['filter']
- );
- }
- $suite->injectFilter($filterFactory);
- }
- /**
- * @param PHPUnit_Framework_Test $suite
- * @param array $arguments
- * @return PHPUnit_Framework_TestResult
- */
- public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array())
- {
- $this->handleConfiguration($arguments);
- $this->processSuiteFilters($suite, $arguments);
- if (isset($arguments['bootstrap'])) {
- $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap'];
- }
- if ($arguments['backupGlobals'] === false) {
- $suite->setBackupGlobals(false);
- }
- if ($arguments['backupStaticAttributes'] === true) {
- $suite->setBackupStaticAttributes(true);
- }
- if ($arguments['disallowChangesToGlobalState'] === true) {
- $suite->setDisallowChangesToGlobalState(true);
- }
- if (is_integer($arguments['repeat'])) {
- $test = new PHPUnit_Extensions_RepeatedTest(
- $suite,
- $arguments['repeat'],
- $arguments['processIsolation']
- );
- $suite = new PHPUnit_Framework_TestSuite();
- $suite->addTest($test);
- }
- $result = $this->createTestResult();
- if (!$arguments['convertErrorsToExceptions']) {
- $result->convertErrorsToExceptions(false);
- }
- if (!$arguments['convertNoticesToExceptions']) {
- PHPUnit_Framework_Error_Notice::$enabled = false;
- }
- if (!$arguments['convertWarningsToExceptions']) {
- PHPUnit_Framework_Error_Warning::$enabled = false;
- }
- if ($arguments['stopOnError']) {
- $result->stopOnError(true);
- }
- if ($arguments['stopOnFailure']) {
- $result->stopOnFailure(true);
- }
- if ($arguments['stopOnIncomplete']) {
- $result->stopOnIncomplete(true);
- }
- if ($arguments['stopOnRisky']) {
- $result->stopOnRisky(true);
- }
- if ($arguments['stopOnSkipped']) {
- $result->stopOnSkipped(true);
- }
- if ($this->printer === null) {
- if (isset($arguments['printer']) &&
- $arguments['printer'] instanceof PHPUnit_Util_Printer) {
- $this->printer = $arguments['printer'];
- } else {
- $printerClass = 'PHPUnit_TextUI_ResultPrinter';
- if (isset($arguments['printer']) &&
- is_string($arguments['printer']) &&
- class_exists($arguments['printer'], false)) {
- $class = new ReflectionClass($arguments['printer']);
- if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) {
- $printerClass = $arguments['printer'];
- }
- }
- $this->printer = new $printerClass(
- isset($arguments['stderr']) ? 'php://stderr' : null,
- $arguments['verbose'],
- $arguments['colors'],
- $arguments['debug'],
- $arguments['columns']
- );
- }
- }
- if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
- $this->printer->write(
- PHPUnit_Runner_Version::getVersionString() . "\n"
- );
- self::$versionStringPrinted = true;
- if ($arguments['verbose']) {
- $this->printer->write(
- sprintf(
- "\nRuntime:\t%s",
- $this->runtime->getNameWithVersion()
- )
- );
- if ($this->runtime->hasXdebug()) {
- $this->printer->write(
- sprintf(
- ' with Xdebug %s',
- phpversion('xdebug')
- )
- );
- }
- if (isset($arguments['configuration'])) {
- $this->printer->write(
- sprintf(
- "\nConfiguration:\t%s",
- $arguments['configuration']->getFilename()
- )
- );
- }
- $this->printer->write("\n");
- }
- if (isset($arguments['deprecatedStrictModeOption'])) {
- print "Warning:\tDeprecated option \"--strict\" used\n";
- } elseif (isset($arguments['deprecatedStrictModeSetting'])) {
- print "Warning:\tDeprecated configuration setting \"strict\" used\n";
- }
- if (isset($arguments['deprecatedSeleniumConfiguration'])) {
- print "Warning:\tDeprecated configuration setting \"selenium\" used\n";
- }
- }
- foreach ($arguments['listeners'] as $listener) {
- $result->addListener($listener);
- }
- $result->addListener($this->printer);
- if (isset($arguments['testdoxHTMLFile'])) {
- $result->addListener(
- new PHPUnit_Util_TestDox_ResultPrinter_HTML(
- $arguments['testdoxHTMLFile']
- )
- );
- }
- if (isset($arguments['testdoxTextFile'])) {
- $result->addListener(
- new PHPUnit_Util_TestDox_ResultPrinter_Text(
- $arguments['testdoxTextFile']
- )
- );
- }
- $codeCoverageReports = 0;
- if (isset($arguments['coverageClover'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageCrap4J'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageHtml'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coveragePHP'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageText'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageXml'])) {
- $codeCoverageReports++;
- }
- if ($codeCoverageReports > 0 && (!extension_loaded('tokenizer') || !$this->runtime->canCollectCodeCoverage())) {
- if (!extension_loaded('tokenizer')) {
- $this->showExtensionNotLoadedWarning(
- 'tokenizer',
- 'No code coverage will be generated.'
- );
- } elseif (!extension_loaded('Xdebug')) {
- $this->showExtensionNotLoadedWarning(
- 'Xdebug',
- 'No code coverage will be generated.'
- );
- }
- $codeCoverageReports = 0;
- }
- if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
- if ($codeCoverageReports > 0 && !$this->codeCoverageFilter->hasWhitelist()) {
- $this->printer->write("Warning:\tNo whitelist configured for code coverage\n");
- }
- $this->printer->write("\n");
- }
- if ($codeCoverageReports > 0) {
- $codeCoverage = new PHP_CodeCoverage(
- null,
- $this->codeCoverageFilter
- );
- $codeCoverage->setAddUncoveredFilesFromWhitelist(
- $arguments['addUncoveredFilesFromWhitelist']
- );
- $codeCoverage->setCheckForUnintentionallyCoveredCode(
- $arguments['strictCoverage']
- );
- $codeCoverage->setProcessUncoveredFilesFromWhitelist(
- $arguments['processUncoveredFilesFromWhitelist']
- );
- if (isset($arguments['forceCoversAnnotation'])) {
- $codeCoverage->setForceCoversAnnotation(
- $arguments['forceCoversAnnotation']
- );
- }
- if (isset($arguments['mapTestClassNameToCoveredClassName'])) {
- $codeCoverage->setMapTestClassNameToCoveredClassName(
- $arguments['mapTestClassNameToCoveredClassName']
- );
- }
- $result->setCodeCoverage($codeCoverage);
- }
- if ($codeCoverageReports > 1) {
- if (isset($arguments['cacheTokens'])) {
- $codeCoverage->setCacheTokens($arguments['cacheTokens']);
- }
- }
- if (isset($arguments['jsonLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])
- );
- }
- if (isset($arguments['tapLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])
- );
- }
- if (isset($arguments['junitLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_JUnit(
- $arguments['junitLogfile'],
- $arguments['logIncompleteSkipped']
- )
- );
- }
- $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']);
- $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']);
- $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']);
- $result->beStrictAboutTestSize($arguments['enforceTimeLimit']);
- $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']);
- $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']);
- $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']);
- if ($suite instanceof PHPUnit_Framework_TestSuite) {
- $suite->setRunTestInSeparateProcess($arguments['processIsolation']);
- }
- $suite->run($result);
- unset($suite);
- $result->flushListeners();
- if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) {
- $this->printer->printResult($result);
- }
- if (isset($codeCoverage)) {
- if (isset($arguments['coverageClover'])) {
- $this->printer->write(
- "\nGenerating code coverage report in Clover XML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_Clover;
- $writer->process($codeCoverage, $arguments['coverageClover']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageCrap4J'])) {
- $this->printer->write(
- "\nGenerating Crap4J report XML file ..."
- );
- $writer = new PHP_CodeCoverage_Report_Crap4j;
- $writer->process($codeCoverage, $arguments['coverageCrap4J']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageHtml'])) {
- $this->printer->write(
- "\nGenerating code coverage report in HTML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_HTML(
- $arguments['reportLowUpperBound'],
- $arguments['reportHighLowerBound'],
- sprintf(
- ' and <a href="http://phpunit.de/">PHPUnit %s</a>',
- PHPUnit_Runner_Version::id()
- )
- );
- $writer->process($codeCoverage, $arguments['coverageHtml']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coveragePHP'])) {
- $this->printer->write(
- "\nGenerating code coverage report in PHP format ..."
- );
- $writer = new PHP_CodeCoverage_Report_PHP;
- $writer->process($codeCoverage, $arguments['coveragePHP']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageText'])) {
- if ($arguments['coverageText'] == 'php://stdout') {
- $outputStream = $this->printer;
- $colors = $arguments['colors'];
- } else {
- $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']);
- $colors = false;
- }
- $processor = new PHP_CodeCoverage_Report_Text(
- $arguments['reportLowUpperBound'],
- $arguments['reportHighLowerBound'],
- $arguments['coverageTextShowUncoveredFiles'],
- $arguments['coverageTextShowOnlySummary']
- );
- $outputStream->write(
- $processor->process($codeCoverage, $colors)
- );
- }
- if (isset($arguments['coverageXml'])) {
- $this->printer->write(
- "\nGenerating code coverage report in PHPUnit XML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_XML;
- $writer->process($codeCoverage, $arguments['coverageXml']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- }
- return $result;
- }
- /**
- * @param PHPUnit_TextUI_ResultPrinter $resultPrinter
- */
- public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter)
- {
- $this->printer = $resultPrinter;
- }
- /**
- * Override to define how to handle a failed loading of
- * a test suite.
- *
- * @param string $message
- */
- protected function runFailed($message)
- {
- $this->write($message . PHP_EOL);
- exit(self::FAILURE_EXIT);
- }
- /**
- * @param string $buffer
- * @since Method available since Release 3.1.0
- */
- protected function write($buffer)
- {
- if (PHP_SAPI != 'cli') {
- $buffer = htmlspecialchars($buffer);
- }
- if ($this->printer !== null) {
- $this->printer->write($buffer);
- } else {
- print $buffer;
- }
- }
- /**
- * Returns the loader to be used.
- *
- * @return PHPUnit_Runner_TestSuiteLoader
- * @since Method available since Release 2.2.0
- */
- public function getLoader()
- {
- if ($this->loader === null) {
- $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader;
- }
- return $this->loader;
- }
- /**
- * @param array $arguments
- * @since Method available since Release 3.2.1
- */
- protected function handleConfiguration(array &$arguments)
- {
- if (isset($arguments['configuration']) &&
- !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) {
- $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance(
- $arguments['configuration']
- );
- }
- $arguments['debug'] = isset($arguments['debug']) ? $arguments['debug'] : false;
- $arguments['filter'] = isset($arguments['filter']) ? $arguments['filter'] : false;
- $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : array();
- if (isset($arguments['configuration'])) {
- $arguments['configuration']->handlePHPConfiguration();
- $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration();
- if (isset($phpunitConfiguration['deprecatedStrictModeSetting'])) {
- $arguments['deprecatedStrictModeSetting'] = true;
- }
- if (isset($phpunitConfiguration['backupGlobals']) &&
- !isset($arguments['backupGlobals'])) {
- $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals'];
- }
- if (isset($phpunitConfiguration['backupStaticAttributes']) &&
- !isset($arguments['backupStaticAttributes'])) {
- $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes'];
- }
- if (isset($phpunitConfiguration['disallowChangesToGlobalState']) &&
- !isset($arguments['disallowChangesToGlobalState'])) {
- $arguments['disallowChangesToGlobalState'] = $phpunitConfiguration['disallowChangesToGlobalState'];
- }
- if (isset($phpunitConfiguration['bootstrap']) &&
- !isset($arguments['bootstrap'])) {
- $arguments['bootstrap'] = $phpunitConfiguration['bootstrap'];
- }
- if (isset($phpunitConfiguration['cacheTokens']) &&
- !isset($arguments['cacheTokens'])) {
- $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens'];
- }
- if (isset($phpunitConfiguration['colors']) &&
- !isset($arguments['colors'])) {
- $arguments['colors'] = $phpunitConfiguration['colors'];
- }
- if (isset($phpunitConfiguration['convertErrorsToExceptions']) &&
- !isset($arguments['convertErrorsToExceptions'])) {
- $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions'];
- }
- if (isset($phpunitConfiguration['convertNoticesToExceptions']) &&
- !isset($arguments['convertNoticesToExceptions'])) {
- $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions'];
- }
- if (isset($phpunitConfiguration['convertWarningsToExceptions']) &&
- !isset($arguments['convertWarningsToExceptions'])) {
- $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions'];
- }
- if (isset($phpunitConfiguration['processIsolation']) &&
- !isset($arguments['processIsolation'])) {
- $arguments['processIsolation'] = $phpunitConfiguration['processIsolation'];
- }
- if (isset($phpunitConfiguration['stopOnError']) &&
- !isset($arguments['stopOnError'])) {
- $arguments['stopOnError'] = $phpunitConfiguration['stopOnError'];
- }
- if (isset($phpunitConfiguration['stopOnFailure']) &&
- !isset($arguments['stopOnFailure'])) {
- $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure'];
- }
- if (isset($phpunitConfiguration['stopOnIncomplete']) &&
- !isset($arguments['stopOnIncomplete'])) {
- $arguments['stopOnIncomplete'] = $phpunitConfiguration['stopOnIncomplete'];
- }
- if (isset($phpunitConfiguration['stopOnRisky']) &&
- !isset($arguments['stopOnRisky'])) {
- $arguments['stopOnRisky'] = $phpunitConfiguration['stopOnRisky'];
- }
- if (isset($phpunitConfiguration['stopOnSkipped']) &&
- !isset($arguments['stopOnSkipped'])) {
- $arguments['stopOnSkipped'] = $phpunitConfiguration['stopOnSkipped'];
- }
- if (isset($phpunitConfiguration['timeoutForSmallTests']) &&
- !isset($arguments['timeoutForSmallTests'])) {
- $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests'];
- }
- if (isset($phpunitConfiguration['timeoutForMediumTests']) &&
- !isset($arguments['timeoutForMediumTests'])) {
- $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests'];
- }
- if (isset($phpunitConfiguration['timeoutForLargeTests']) &&
- !isset($arguments['timeoutForLargeTests'])) {
- $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests'];
- }
- if (isset($phpunitConfiguration['reportUselessTests']) &&
- !isset($arguments['reportUselessTests'])) {
- $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests'];
- }
- if (isset($phpunitConfiguration['strictCoverage']) &&
- !isset($arguments['strictCoverage'])) {
- $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage'];
- }
- if (isset($phpunitConfiguration['disallowTestOutput']) &&
- !isset($arguments['disallowTestOutput'])) {
- $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput'];
- }
- if (isset($phpunitConfiguration['enforceTimeLimit']) &&
- !isset($arguments['enforceTimeLimit'])) {
- $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit'];
- }
- if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) &&
- !isset($arguments['disallowTodoAnnotatedTests'])) {
- $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests'];
- }
- if (isset($phpunitConfiguration['verbose']) &&
- !isset($arguments['verbose'])) {
- $arguments['verbose'] = $phpunitConfiguration['verbose'];
- }
- if (isset($phpunitConfiguration['forceCoversAnnotation']) &&
- !isset($arguments['forceCoversAnnotation'])) {
- $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation'];
- }
- if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) &&
- !isset($arguments['mapTestClassNameToCoveredClassName'])) {
- $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName'];
- }
- $groupCliArgs = array();
- if (!empty($arguments['groups'])) {
- $groupCliArgs = $arguments['groups'];
- }
- $groupConfiguration = $arguments['configuration']->getGroupConfiguration();
- if (!empty($groupConfiguration['include']) &&
- !isset($arguments['groups'])) {
- $arguments['groups'] = $groupConfiguration['include'];
- }
- if (!empty($groupConfiguration['exclude']) &&
- !isset($arguments['excludeGroups'])) {
- $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs);
- }
- foreach ($arguments['configuration']->getListenerConfiguration() as $listener) {
- if (!class_exists($listener['class'], false) &&
- $listener['file'] !== '') {
- require_once $listener['file'];
- }
- if (class_exists($listener['class'])) {
- if (count($listener['arguments']) == 0) {
- $listener = new $listener['class'];
- } else {
- $listenerClass = new ReflectionClass(
- $listener['class']
- );
- $listener = $listenerClass->newInstanceArgs(
- $listener['arguments']
- );
- }
- if ($listener instanceof PHPUnit_Framework_TestListener) {
- $arguments['listeners'][] = $listener;
- }
- }
- }
- $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration();
- if (isset($loggingConfiguration['coverage-clover']) &&
- !isset($arguments['coverageClover'])) {
- $arguments['coverageClover'] = $loggingConfiguration['coverage-clover'];
- }
- if (isset($loggingConfiguration['coverage-crap4j']) &&
- !isset($arguments['coverageCrap4J'])) {
- $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j'];
- }
- if (isset($loggingConfiguration['coverage-html']) &&
- !isset($arguments['coverageHtml'])) {
- if (isset($loggingConfiguration['lowUpperBound']) &&
- !isset($arguments['reportLowUpperBound'])) {
- $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound'];
- }
- if (isset($loggingConfiguration['highLowerBound']) &&
- !isset($arguments['reportHighLowerBound'])) {
- $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound'];
- }
- $arguments['coverageHtml'] = $loggingConfiguration['coverage-html'];
- }
- if (isset($loggingConfiguration['coverage-php']) &&
- !isset($arguments['coveragePHP'])) {
- $arguments['coveragePHP'] = $loggingConfiguration['coverage-php'];
- }
- if (isset($loggingConfiguration['coverage-text']) &&
- !isset($arguments['coverageText'])) {
- $arguments['coverageText'] = $loggingConfiguration['coverage-text'];
- if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) {
- $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'];
- } else {
- $arguments['coverageTextShowUncoveredFiles'] = false;
- }
- if (isset($loggingConfiguration['coverageTextShowOnlySummary'])) {
- $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary'];
- } else {
- $arguments['coverageTextShowOnlySummary'] = false;
- }
- }
- if (isset($loggingConfiguration['coverage-xml']) &&
- !isset($arguments['coverageXml'])) {
- $arguments['coverageXml'] = $loggingConfiguration['coverage-xml'];
- }
- if (isset($loggingConfiguration['json']) &&
- !isset($arguments['jsonLogfile'])) {
- $arguments['jsonLogfile'] = $loggingConfiguration['json'];
- }
- if (isset($loggingConfiguration['plain'])) {
- $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter(
- $loggingConfiguration['plain'],
- true
- );
- }
- if (isset($loggingConfiguration['tap']) &&
- !isset($arguments['tapLogfile'])) {
- $arguments['tapLogfile'] = $loggingConfiguration['tap'];
- }
- if (isset($loggingConfiguration['junit']) &&
- !isset($arguments['junitLogfile'])) {
- $arguments['junitLogfile'] = $loggingConfiguration['junit'];
- if (isset($loggingConfiguration['logIncompleteSkipped']) &&
- !isset($arguments['logIncompleteSkipped'])) {
- $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped'];
- }
- }
- if (isset($loggingConfiguration['testdox-html']) &&
- !isset($arguments['testdoxHTMLFile'])) {
- $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html'];
- }
- if (isset($loggingConfiguration['testdox-text']) &&
- !isset($arguments['testdoxTextFile'])) {
- $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text'];
- }
- if ((isset($arguments['coverageClover']) ||
- isset($arguments['coverageCrap4J']) ||
- isset($arguments['coverageHtml']) ||
- isset($arguments['coveragePHP']) ||
- isset($arguments['coverageText']) ||
- isset($arguments['coverageXml'])) &&
- $this->runtime->canCollectCodeCoverage()) {
- $filterConfiguration = $arguments['configuration']->getFilterConfiguration();
- $arguments['addUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'];
- $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'];
- if (empty($filterConfiguration['whitelist']['include']['directory']) &&
- empty($filterConfiguration['whitelist']['include']['file'])) {
- foreach ($filterConfiguration['blacklist']['include']['directory'] as $dir) {
- $this->codeCoverageFilter->addDirectoryToBlacklist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix'],
- $dir['group']
- );
- }
- foreach ($filterConfiguration['blacklist']['include']['file'] as $file) {
- $this->codeCoverageFilter->addFileToBlacklist($file);
- }
- foreach ($filterConfiguration['blacklist']['exclude']['directory'] as $dir) {
- $this->codeCoverageFilter->removeDirectoryFromBlacklist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix'],
- $dir['group']
- );
- }
- foreach ($filterConfiguration['blacklist']['exclude']['file'] as $file) {
- $this->codeCoverageFilter->removeFileFromBlacklist($file);
- }
- }
- foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) {
- $this->codeCoverageFilter->addDirectoryToWhitelist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix']
- );
- }
- foreach ($filterConfiguration['whitelist']['include']['file'] as $file) {
- $this->codeCoverageFilter->addFileToWhitelist($file);
- }
- foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) {
- $this->codeCoverageFilter->removeDirectoryFromWhitelist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix']
- );
- }
- foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) {
- $this->codeCoverageFilter->removeFileFromWhitelist($file);
- }
- }
- }
- $arguments['addUncoveredFilesFromWhitelist'] = isset($arguments['addUncoveredFilesFromWhitelist']) ? $arguments['addUncoveredFilesFromWhitelist'] : true;
- $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : false;
- $arguments['backupGlobals'] = isset($arguments['backupGlobals']) ? $arguments['backupGlobals'] : null;
- $arguments['backupStaticAttributes'] = isset($arguments['backupStaticAttributes']) ? $arguments['backupStaticAttributes'] : null;
- $arguments['disallowChangesToGlobalState'] = isset($arguments['disallowChangesToGlobalState']) ? $arguments['disallowChangesToGlobalState'] : null;
- $arguments['cacheTokens'] = isset($arguments['cacheTokens']) ? $arguments['cacheTokens'] : false;
- $arguments['columns'] = isset($arguments['columns']) ? $arguments['columns'] : 80;
- $arguments['colors'] = isset($arguments['colors']) ? $arguments['colors'] : PHPUnit_TextUI_ResultPrinter::COLOR_DEFAULT;
- $arguments['convertErrorsToExceptions'] = isset($arguments['convertErrorsToExceptions']) ? $arguments['convertErrorsToExceptions'] : true;
- $arguments['convertNoticesToExceptions'] = isset($arguments['convertNoticesToExceptions']) ? $arguments['convertNoticesToExceptions'] : true;
- $arguments['convertWarningsToExceptions'] = isset($arguments['convertWarningsToExceptions']) ? $arguments['convertWarningsToExceptions'] : true;
- $arguments['excludeGroups'] = isset($arguments['excludeGroups']) ? $arguments['excludeGroups'] : array();
- $arguments['groups'] = isset($arguments['groups']) ? $arguments['groups'] : array();
- $arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ? $arguments['logIncompleteSkipped'] : false;
- $arguments['processIsolation'] = isset($arguments['processIsolation']) ? $arguments['processIsolation'] : false;
- $arguments['repeat'] = isset($arguments['repeat']) ? $arguments['repeat'] : false;
- $arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ? $arguments['reportHighLowerBound'] : 90;
- $arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ? $arguments['reportLowUpperBound'] : 50;
- $arguments['stopOnError'] = isset($arguments['stopOnError']) ? $arguments['stopOnError'] : false;
- $arguments['stopOnFailure'] = isset($arguments['stopOnFailure']) ? $arguments['stopOnFailure'] : false;
- $arguments['stopOnIncomplete'] = isset($arguments['stopOnIncomplete']) ? $arguments['stopOnIncomplete'] : false;
- $arguments['stopOnRisky'] = isset($arguments['stopOnRisky']) ? $arguments['stopOnRisky'] : false;
- $arguments['stopOnSkipped'] = isset($arguments['stopOnSkipped']) ? $arguments['stopOnSkipped'] : false;
- $arguments['timeoutForSmallTests'] = isset($arguments['timeoutForSmallTests']) ? $arguments['timeoutForSmallTests'] : 1;
- $arguments['timeoutForMediumTests'] = isset($arguments['timeoutForMediumTests']) ? $arguments['timeoutForMediumTests'] : 10;
- $arguments['timeoutForLargeTests'] = isset($arguments['timeoutForLargeTests']) ? $arguments['timeoutForLargeTests'] : 60;
- $arguments['reportUselessTests'] = isset($arguments['reportUselessTests']) ? $arguments['reportUselessTests'] : false;
- $arguments['strictCoverage'] = isset($arguments['strictCoverage']) ? $arguments['strictCoverage'] : false;
- $arguments['disallowTestOutput'] = isset($arguments['disallowTestOutput']) ? $arguments['disallowTestOutput'] : false;
- $arguments['enforceTimeLimit'] = isset($arguments['enforceTimeLimit']) ? $arguments['enforceTimeLimit'] : false;
- $arguments['disallowTodoAnnotatedTests'] = isset($arguments['disallowTodoAnnotatedTests']) ? $arguments['disallowTodoAnnotatedTests'] : false;
- $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false;
- }
- /**
- * @param $extension
- * @param string $message
- * @since Method available since Release 4.7.3
- */
- private function showExtensionNotLoadedWarning($extension, $message = '')
- {
- if (isset($this->missingExtensions[$extension])) {
- return;
- }
- $this->write("Warning:\t" . 'The ' . $extension . ' extension is not loaded' . "\n");
- if (!empty($message)) {
- $this->write("\t\t" . $message . "\n");
- }
- $this->missingExtensions[$extension] = true;
- }
- /**
- * @return PHP_CodeCoverage_Filter
- */
- private function getCodeCoverageFilter()
- {
- $filter = new PHP_CodeCoverage_Filter;
- if (defined('__PHPUNIT_PHAR__')) {
- $filter->addFileToBlacklist(__PHPUNIT_PHAR__);
- }
- $blacklist = new PHPUnit_Util_Blacklist;
- foreach ($blacklist->getBlacklistedDirectories() as $directory) {
- $filter->addDirectoryToBlacklist($directory);
- }
- return $filter;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Console;
- /**
- * Prints the result of a TextUI TestRunner run.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_TextUI_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- const EVENT_TEST_START = 0;
- const EVENT_TEST_END = 1;
- const EVENT_TESTSUITE_START = 2;
- const EVENT_TESTSUITE_END = 3;
- const COLOR_NEVER = 'never';
- const COLOR_AUTO = 'auto';
- const COLOR_ALWAYS = 'always';
- const COLOR_DEFAULT = self::COLOR_NEVER;
- /**
- * @var array
- */
- private static $ansiCodes = array(
- 'bold' => 1,
- 'fg-black' => 30,
- 'fg-red' => 31,
- 'fg-green' => 32,
- 'fg-yellow' => 33,
- 'fg-blue' => 34,
- 'fg-magenta' => 35,
- 'fg-cyan' => 36,
- 'fg-white' => 37,
- 'bg-black' => 40,
- 'bg-red' => 41,
- 'bg-green' => 42,
- 'bg-yellow' => 43,
- 'bg-blue' => 44,
- 'bg-magenta' => 45,
- 'bg-cyan' => 46,
- 'bg-white' => 47
- );
- /**
- * @var int
- */
- protected $column = 0;
- /**
- * @var int
- */
- protected $maxColumn;
- /**
- * @var bool
- */
- protected $lastTestFailed = false;
- /**
- * @var int
- */
- protected $numAssertions = 0;
- /**
- * @var int
- */
- protected $numTests = -1;
- /**
- * @var int
- */
- protected $numTestsRun = 0;
- /**
- * @var int
- */
- protected $numTestsWidth;
- /**
- * @var bool
- */
- protected $colors = false;
- /**
- * @var bool
- */
- protected $debug = false;
- /**
- * @var bool
- */
- protected $verbose = false;
- /**
- * @var int
- */
- private $numberOfColumns;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @param bool $verbose
- * @param string $colors
- * @param bool $debug
- * @param int|string $numberOfColumns
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- public function __construct($out = null, $verbose = false, $colors = self::COLOR_DEFAULT, $debug = false, $numberOfColumns = 80)
- {
- parent::__construct($out);
- if (!is_bool($verbose)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
- }
- $availableColors = array(self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS);
- if (!in_array($colors, $availableColors)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 3,
- vsprintf('value from "%s", "%s" or "%s"', $availableColors)
- );
- }
- if (!is_bool($debug)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
- }
- if (!is_int($numberOfColumns) && $numberOfColumns != 'max') {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'integer or "max"');
- }
- $console = new Console;
- $maxNumberOfColumns = $console->getNumberOfColumns();
- if ($numberOfColumns == 'max' || $numberOfColumns > $maxNumberOfColumns) {
- $numberOfColumns = $maxNumberOfColumns;
- }
- $this->numberOfColumns = $numberOfColumns;
- $this->verbose = $verbose;
- $this->debug = $debug;
- if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) {
- $this->colors = true;
- } else {
- $this->colors = (self::COLOR_ALWAYS === $colors);
- }
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- public function printResult(PHPUnit_Framework_TestResult $result)
- {
- $this->printHeader();
- $this->printErrors($result);
- $printSeparator = $result->errorCount() > 0;
- if ($printSeparator && $result->failureCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator || $result->failureCount() > 0;
- $this->printFailures($result);
- if ($this->verbose) {
- if ($printSeparator && $result->riskyCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator ||
- $result->riskyCount() > 0;
- $this->printRisky($result);
- if ($printSeparator && $result->notImplementedCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator ||
- $result->notImplementedCount() > 0;
- $this->printIncompletes($result);
- if ($printSeparator && $result->skippedCount() > 0) {
- $this->write("\n--\n\n");
- }
- $this->printSkipped($result);
- }
- $this->printFooter($result);
- }
- /**
- * @param array $defects
- * @param string $type
- */
- protected function printDefects(array $defects, $type)
- {
- $count = count($defects);
- if ($count == 0) {
- return;
- }
- $this->write(
- sprintf(
- "There %s %d %s%s:\n",
- ($count == 1) ? 'was' : 'were',
- $count,
- $type,
- ($count == 1) ? '' : 's'
- )
- );
- $i = 1;
- foreach ($defects as $defect) {
- $this->printDefect($defect, $i++);
- }
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- * @param int $count
- */
- protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count)
- {
- $this->printDefectHeader($defect, $count);
- $this->printDefectTrace($defect);
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- * @param int $count
- */
- protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count)
- {
- $this->write(
- sprintf(
- "\n%d) %s\n",
- $count,
- $defect->getTestName()
- )
- );
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- */
- protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect)
- {
- $e = $defect->thrownException();
- $this->write((string) $e);
- while ($e = $e->getPrevious()) {
- $this->write("\nCaused by\n" . $e);
- }
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printErrors(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->errors(), 'error');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printFailures(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->failures(), 'failure');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printIncompletes(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->notImplemented(), 'incomplete test');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 4.0.0
- */
- protected function printRisky(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->risky(), 'risky test');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 3.0.0
- */
- protected function printSkipped(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->skipped(), 'skipped test');
- }
- protected function printHeader()
- {
- $this->write("\n\n" . PHP_Timer::resourceUsage() . "\n\n");
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printFooter(PHPUnit_Framework_TestResult $result)
- {
- if (count($result) === 0) {
- $this->writeWithColor(
- 'fg-black, bg-yellow',
- 'No tests executed!'
- );
- } elseif ($result->wasSuccessful() &&
- $result->allHarmless() &&
- $result->allCompletelyImplemented() &&
- $result->noneSkipped()) {
- $this->writeWithColor(
- 'fg-black, bg-green',
- sprintf(
- 'OK (%d test%s, %d assertion%s)',
- count($result),
- (count($result) == 1) ? '' : 's',
- $this->numAssertions,
- ($this->numAssertions == 1) ? '' : 's'
- )
- );
- } else {
- if ($result->wasSuccessful()) {
- $color = 'fg-black, bg-yellow';
- if ($this->verbose) {
- $this->write("\n");
- }
- $this->writeWithColor(
- $color,
- 'OK, but incomplete, skipped, or risky tests!'
- );
- } else {
- $color = 'fg-white, bg-red';
- $this->write("\n");
- $this->writeWithColor($color, 'FAILURES!');
- }
- $this->writeCountString(count($result), 'Tests', $color, true);
- $this->writeCountString($this->numAssertions, 'Assertions', $color, true);
- $this->writeCountString($result->errorCount(), 'Errors', $color);
- $this->writeCountString($result->failureCount(), 'Failures', $color);
- $this->writeCountString($result->skippedCount(), 'Skipped', $color);
- $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color);
- $this->writeCountString($result->riskyCount(), 'Risky', $color);
- $this->writeWithColor($color, '.', true);
- }
- }
- /**
- */
- public function printWaitPrompt()
- {
- $this->write("\n<RETURN> to continue\n");
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-red, bold', 'E');
- $this->lastTestFailed = true;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeProgressWithColor('bg-red, fg-white', 'F');
- $this->lastTestFailed = true;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-yellow, bold', 'I');
- $this->lastTestFailed = true;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-yellow, bold', 'R');
- $this->lastTestFailed = true;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-cyan, bold', 'S');
- $this->lastTestFailed = true;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- if ($this->numTests == -1) {
- $this->numTests = count($suite);
- $this->numTestsWidth = strlen((string) $this->numTests);
- $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numTestsWidth);
- }
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if ($this->debug) {
- $this->write(
- sprintf(
- "\nStarting test '%s'.\n",
- PHPUnit_Util_Test::describe($test)
- )
- );
- }
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$this->lastTestFailed) {
- $this->writeProgress('.');
- }
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $this->numAssertions += $test->getNumAssertions();
- } elseif ($test instanceof PHPUnit_Extensions_PhptTestCase) {
- $this->numAssertions++;
- }
- $this->lastTestFailed = false;
- if ($test instanceof PHPUnit_Framework_TestCase) {
- if (!$test->hasExpectationOnOutput()) {
- $this->write($test->getActualOutput());
- }
- }
- }
- /**
- * @param string $progress
- */
- protected function writeProgress($progress)
- {
- $this->write($progress);
- $this->column++;
- $this->numTestsRun++;
- if ($this->column == $this->maxColumn) {
- $this->write(
- sprintf(
- ' %' . $this->numTestsWidth . 'd / %' .
- $this->numTestsWidth . 'd (%3s%%)',
- $this->numTestsRun,
- $this->numTests,
- floor(($this->numTestsRun / $this->numTests) * 100)
- )
- );
- $this->writeNewLine();
- }
- }
- protected function writeNewLine()
- {
- $this->column = 0;
- $this->write("\n");
- }
- /**
- * Formats a buffer with a specified ANSI color sequence if colors are
- * enabled.
- *
- * @param string $color
- * @param string $buffer
- * @return string
- * @since Method available since Release 4.0.0
- */
- protected function formatWithColor($color, $buffer)
- {
- if (!$this->colors) {
- return $buffer;
- }
- $codes = array_map('trim', explode(',', $color));
- $lines = explode("\n", $buffer);
- $padding = max(array_map('strlen', $lines));
- $styles = array();
- foreach ($codes as $code) {
- $styles[] = self::$ansiCodes[$code];
- }
- $style = sprintf("\x1b[%sm", implode(';', $styles));
- $styledLines = array();
- foreach ($lines as $line) {
- $styledLines[] = $style . str_pad($line, $padding) . "\x1b[0m";
- }
- return implode("\n", $styledLines);
- }
- /**
- * Writes a buffer out with a color sequence if colors are enabled.
- *
- * @param string $color
- * @param string $buffer
- * @param bool $lf
- * @since Method available since Release 4.0.0
- */
- protected function writeWithColor($color, $buffer, $lf = true)
- {
- $this->write($this->formatWithColor($color, $buffer));
- if ($lf) {
- $this->write("\n");
- }
- }
- /**
- * Writes progress with a color sequence if colors are enabled.
- *
- * @param string $color
- * @param string $buffer
- * @since Method available since Release 4.0.0
- */
- protected function writeProgressWithColor($color, $buffer)
- {
- $buffer = $this->formatWithColor($color, $buffer);
- $this->writeProgress($buffer);
- }
- /**
- * @param int $count
- * @param string $name
- * @param string $color
- * @param bool $always
- * @since Method available since Release 4.6.5
- */
- private function writeCountString($count, $name, $color, $always = false)
- {
- static $first = true;
- if ($always || $count > 0) {
- $this->writeWithColor(
- $color,
- sprintf(
- '%s%s: %d',
- !$first ? ', ' : '',
- $name,
- $count
- ),
- false
- );
- $first = false;
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- if (!function_exists('trait_exists')) {
- function trait_exists($traitname, $autoload = true)
- {
- return false;
- }
- }
- /**
- * Test helpers.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Test
- {
- const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/';
- const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m';
- const REGEX_REQUIRES_VERSION = '/@requires\s+(?P<name>PHP(?:Unit)?)\s+(?P<value>[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m';
- const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P<value>.+?)[ \t]*\r?$/m';
- const REGEX_REQUIRES = '/@requires\s+(?P<name>function|extension)\s+(?P<value>([^ ]+?))[ \t]*\r?$/m';
- const UNKNOWN = -1;
- const SMALL = 0;
- const MEDIUM = 1;
- const LARGE = 2;
- private static $annotationCache = array();
- private static $hookMethods = array();
- /**
- * @param PHPUnit_Framework_Test $test
- * @param bool $asString
- * @return mixed
- */
- public static function describe(PHPUnit_Framework_Test $test, $asString = true)
- {
- if ($asString) {
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- return $test->toString();
- } else {
- return get_class($test);
- }
- } else {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- return array(
- get_class($test), $test->getName()
- );
- } elseif ($test instanceof PHPUnit_Framework_SelfDescribing) {
- return array('', $test->toString());
- } else {
- return array('', get_class($test));
- }
- }
- }
- /**
- * @param string $className
- * @param string $methodName
- * @return array|bool
- * @throws PHPUnit_Framework_CodeCoverageException
- * @since Method available since Release 4.0.0
- */
- public static function getLinesToBeCovered($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- if (isset($annotations['class']['coversNothing']) || isset($annotations['method']['coversNothing'])) {
- return false;
- }
- return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers');
- }
- /**
- * Returns lines of code specified with the @uses annotation.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 4.0.0
- */
- public static function getLinesToBeUsed($className, $methodName)
- {
- return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses');
- }
- /**
- * @param string $className
- * @param string $methodName
- * @param string $mode
- * @return array
- * @throws PHPUnit_Framework_CodeCoverageException
- * @since Method available since Release 4.2.0
- */
- private static function getLinesToBeCoveredOrUsed($className, $methodName, $mode)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $classShortcut = null;
- if (!empty($annotations['class'][$mode . 'DefaultClass'])) {
- if (count($annotations['class'][$mode . 'DefaultClass']) > 1) {
- throw new PHPUnit_Framework_CodeCoverageException(
- sprintf(
- 'More than one @%sClass annotation in class or interface "%s".',
- $mode,
- $className
- )
- );
- }
- $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0];
- }
- $list = array();
- if (isset($annotations['class'][$mode])) {
- $list = $annotations['class'][$mode];
- }
- if (isset($annotations['method'][$mode])) {
- $list = array_merge($list, $annotations['method'][$mode]);
- }
- $codeList = array();
- foreach (array_unique($list) as $element) {
- if ($classShortcut && strncmp($element, '::', 2) === 0) {
- $element = $classShortcut . $element;
- }
- $element = preg_replace('/[\s()]+$/', '', $element);
- $codeList = array_merge(
- $codeList,
- self::resolveElementToReflectionObjects($element)
- );
- }
- return self::resolveReflectionObjectsToLines($codeList);
- }
- /**
- * Returns the requirements for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.6.0
- */
- public static function getRequirements($className, $methodName)
- {
- $reflector = new ReflectionClass($className);
- $docComment = $reflector->getDocComment();
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment .= "\n" . $reflector->getDocComment();
- $requires = array();
- if ($count = preg_match_all(self::REGEX_REQUIRES_OS, $docComment, $matches)) {
- $requires['OS'] = sprintf(
- '/%s/i',
- addcslashes($matches['value'][$count - 1], '/')
- );
- }
- if ($count = preg_match_all(self::REGEX_REQUIRES_VERSION, $docComment, $matches)) {
- for ($i = 0; $i < $count; $i++) {
- $requires[$matches['name'][$i]] = $matches['value'][$i];
- }
- }
- // https://bugs.php.net/bug.php?id=63055
- $matches = array();
- if ($count = preg_match_all(self::REGEX_REQUIRES, $docComment, $matches)) {
- for ($i = 0; $i < $count; $i++) {
- $name = $matches['name'][$i] . 's';
- if (!isset($requires[$name])) {
- $requires[$name] = array();
- }
- $requires[$name][] = $matches['value'][$i];
- }
- }
- return $requires;
- }
- /**
- * Returns the missing requirements for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 4.3.0
- */
- public static function getMissingRequirements($className, $methodName)
- {
- $required = static::getRequirements($className, $methodName);
- $missing = array();
- if (!empty($required['PHP']) && version_compare(PHP_VERSION, $required['PHP'], '<')) {
- $missing[] = sprintf('PHP %s (or later) is required.', $required['PHP']);
- }
- if (!empty($required['PHPUnit'])) {
- $phpunitVersion = PHPUnit_Runner_Version::id();
- if (version_compare($phpunitVersion, $required['PHPUnit'], '<')) {
- $missing[] = sprintf('PHPUnit %s (or later) is required.', $required['PHPUnit']);
- }
- }
- if (!empty($required['OS']) && !preg_match($required['OS'], PHP_OS)) {
- $missing[] = sprintf('Operating system matching %s is required.', $required['OS']);
- }
- if (!empty($required['functions'])) {
- foreach ($required['functions'] as $function) {
- $pieces = explode('::', $function);
- if (2 === count($pieces) && method_exists($pieces[0], $pieces[1])) {
- continue;
- }
- if (function_exists($function)) {
- continue;
- }
- $missing[] = sprintf('Function %s is required.', $function);
- }
- }
- if (!empty($required['extensions'])) {
- foreach ($required['extensions'] as $extension) {
- if (!extension_loaded($extension)) {
- $missing[] = sprintf('Extension %s is required.', $extension);
- }
- }
- }
- return $missing;
- }
- /**
- * Returns the expected exception for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.3.6
- */
- public static function getExpectedException($className, $methodName)
- {
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment = $reflector->getDocComment();
- $docComment = substr($docComment, 3, -2);
- if (preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $class = $matches[1];
- $code = null;
- $message = '';
- $messageRegExp = '';
- if (isset($matches[2])) {
- $message = trim($matches[2]);
- } elseif (isset($annotations['method']['expectedExceptionMessage'])) {
- $message = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionMessage'][0]
- );
- }
- if (isset($annotations['method']['expectedExceptionMessageRegExp'])) {
- $messageRegExp = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionMessageRegExp'][0]
- );
- }
- if (isset($matches[3])) {
- $code = $matches[3];
- } elseif (isset($annotations['method']['expectedExceptionCode'])) {
- $code = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionCode'][0]
- );
- }
- if (is_numeric($code)) {
- $code = (int) $code;
- } elseif (is_string($code) && defined($code)) {
- $code = (int) constant($code);
- }
- return array(
- 'class' => $class, 'code' => $code, 'message' => $message, 'message_regex' => $messageRegExp
- );
- }
- return false;
- }
- /**
- * Parse annotation content to use constant/class constant values
- *
- * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME
- *
- * If the constant is not found the string is used as is to ensure maximum BC.
- *
- * @param string $message
- * @return string
- */
- private static function parseAnnotationContent($message)
- {
- if (strpos($message, '::') !== false && count(explode('::', $message) == 2)) {
- if (defined($message)) {
- $message = constant($message);
- }
- }
- return $message;
- }
- /**
- * Returns the provided data for a method.
- *
- * @param string $className
- * @param string $methodName
- * @return array|Iterator when a data provider is specified and exists
- * false when a data provider is specified but does not exist
- * null when no data provider is specified
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.2.0
- */
- public static function getProvidedData($className, $methodName)
- {
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment = $reflector->getDocComment();
- $data = null;
- if (preg_match(self::REGEX_DATA_PROVIDER, $docComment, $matches)) {
- $dataProviderMethodNameNamespace = explode('\\', $matches[1]);
- $leaf = explode('::', array_pop($dataProviderMethodNameNamespace));
- $dataProviderMethodName = array_pop($leaf);
- if (!empty($dataProviderMethodNameNamespace)) {
- $dataProviderMethodNameNamespace = implode('\\', $dataProviderMethodNameNamespace) . '\\';
- } else {
- $dataProviderMethodNameNamespace = '';
- }
- if (!empty($leaf)) {
- $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf);
- } else {
- $dataProviderClassName = $className;
- }
- $dataProviderClass = new ReflectionClass($dataProviderClassName);
- $dataProviderMethod = $dataProviderClass->getMethod(
- $dataProviderMethodName
- );
- if ($dataProviderMethod->isStatic()) {
- $object = null;
- } else {
- $object = $dataProviderClass->newInstance();
- }
- if ($dataProviderMethod->getNumberOfParameters() == 0) {
- $data = $dataProviderMethod->invoke($object);
- } else {
- $data = $dataProviderMethod->invoke($object, $methodName);
- }
- }
- if ($data !== null) {
- if (is_object($data)) {
- $data = iterator_to_array($data);
- }
- foreach ($data as $key => $value) {
- if (!is_array($value)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Data set %s is invalid.',
- is_int($key) ? '#' . $key : '"' . $key . '"'
- )
- );
- }
- }
- }
- return $data;
- }
- /**
- * @param string $className
- * @param string $methodName
- * @return array
- * @throws ReflectionException
- * @since Method available since Release 3.4.0
- */
- public static function parseTestMethodAnnotations($className, $methodName = '')
- {
- if (!isset(self::$annotationCache[$className])) {
- $class = new ReflectionClass($className);
- self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment());
- }
- if (!empty($methodName) && !isset(self::$annotationCache[$className . '::' . $methodName])) {
- try {
- $method = new ReflectionMethod($className, $methodName);
- $annotations = self::parseAnnotations($method->getDocComment());
- } catch (ReflectionException $e) {
- $annotations = array();
- }
- self::$annotationCache[$className . '::' . $methodName] = $annotations;
- }
- return array(
- 'class' => self::$annotationCache[$className],
- 'method' => !empty($methodName) ? self::$annotationCache[$className . '::' . $methodName] : array()
- );
- }
- /**
- * @param string $docblock
- * @return array
- * @since Method available since Release 3.4.0
- */
- private static function parseAnnotations($docblock)
- {
- $annotations = array();
- // Strip away the docblock header and footer to ease parsing of one line annotations
- $docblock = substr($docblock, 3, -2);
- if (preg_match_all('/@(?P<name>[A-Za-z_-]+)(?:[ \t]+(?P<value>.*?))?[ \t]*\r?$/m', $docblock, $matches)) {
- $numMatches = count($matches[0]);
- for ($i = 0; $i < $numMatches; ++$i) {
- $annotations[$matches['name'][$i]][] = $matches['value'][$i];
- }
- }
- return $annotations;
- }
- /**
- * Returns the backup settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getBackupSettings($className, $methodName)
- {
- return array(
- 'backupGlobals' => self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'backupGlobals'
- ),
- 'backupStaticAttributes' => self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'backupStaticAttributes'
- )
- );
- }
- /**
- * Returns the dependencies for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getDependencies($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $dependencies = array();
- if (isset($annotations['class']['depends'])) {
- $dependencies = $annotations['class']['depends'];
- }
- if (isset($annotations['method']['depends'])) {
- $dependencies = array_merge(
- $dependencies,
- $annotations['method']['depends']
- );
- }
- return array_unique($dependencies);
- }
- /**
- * Returns the error handler settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return bool
- * @since Method available since Release 3.4.0
- */
- public static function getErrorHandlerSettings($className, $methodName)
- {
- return self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'errorHandler'
- );
- }
- /**
- * Returns the groups for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.2.0
- */
- public static function getGroups($className, $methodName = '')
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $groups = array();
- if (isset($annotations['method']['author'])) {
- $groups = $annotations['method']['author'];
- } elseif (isset($annotations['class']['author'])) {
- $groups = $annotations['class']['author'];
- }
- if (isset($annotations['class']['group'])) {
- $groups = array_merge($groups, $annotations['class']['group']);
- }
- if (isset($annotations['method']['group'])) {
- $groups = array_merge($groups, $annotations['method']['group']);
- }
- if (isset($annotations['class']['ticket'])) {
- $groups = array_merge($groups, $annotations['class']['ticket']);
- }
- if (isset($annotations['method']['ticket'])) {
- $groups = array_merge($groups, $annotations['method']['ticket']);
- }
- foreach (array('method', 'class') as $element) {
- foreach (array('small', 'medium', 'large') as $size) {
- if (isset($annotations[$element][$size])) {
- $groups[] = $size;
- break 2;
- }
- if (isset($annotations[$element][$size])) {
- $groups[] = $size;
- break 2;
- }
- }
- }
- return array_unique($groups);
- }
- /**
- * Returns the size of the test.
- *
- * @param string $className
- * @param string $methodName
- * @return int
- * @since Method available since Release 3.6.0
- */
- public static function getSize($className, $methodName)
- {
- $groups = array_flip(self::getGroups($className, $methodName));
- $size = self::UNKNOWN;
- $class = new ReflectionClass($className);
- if (isset($groups['large']) ||
- (class_exists('PHPUnit_Extensions_Database_TestCase', false) &&
- $class->isSubclassOf('PHPUnit_Extensions_Database_TestCase')) ||
- (class_exists('PHPUnit_Extensions_SeleniumTestCase', false) &&
- $class->isSubclassOf('PHPUnit_Extensions_SeleniumTestCase'))) {
- $size = self::LARGE;
- } elseif (isset($groups['medium'])) {
- $size = self::MEDIUM;
- } elseif (isset($groups['small'])) {
- $size = self::SMALL;
- }
- return $size;
- }
- /**
- * Returns the tickets for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getTickets($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $tickets = array();
- if (isset($annotations['class']['ticket'])) {
- $tickets = $annotations['class']['ticket'];
- }
- if (isset($annotations['method']['ticket'])) {
- $tickets = array_merge($tickets, $annotations['method']['ticket']);
- }
- return array_unique($tickets);
- }
- /**
- * Returns the process isolation settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return bool
- * @since Method available since Release 3.4.1
- */
- public static function getProcessIsolationSettings($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- if (isset($annotations['class']['runTestsInSeparateProcesses']) ||
- isset($annotations['method']['runInSeparateProcess'])) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * Returns the preserve global state settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return bool
- * @since Method available since Release 3.4.0
- */
- public static function getPreserveGlobalStateSettings($className, $methodName)
- {
- return self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'preserveGlobalState'
- );
- }
- /**
- * @param string $className
- * @return array
- * @since Method available since Release 4.0.8
- */
- public static function getHookMethods($className)
- {
- if (!class_exists($className, false)) {
- return self::emptyHookMethodsArray();
- }
- if (!isset(self::$hookMethods[$className])) {
- self::$hookMethods[$className] = self::emptyHookMethodsArray();
- try {
- $class = new ReflectionClass($className);
- foreach ($class->getMethods() as $method) {
- if (self::isBeforeClassMethod($method)) {
- self::$hookMethods[$className]['beforeClass'][] = $method->getName();
- }
- if (self::isBeforeMethod($method)) {
- self::$hookMethods[$className]['before'][] = $method->getName();
- }
- if (self::isAfterMethod($method)) {
- self::$hookMethods[$className]['after'][] = $method->getName();
- }
- if (self::isAfterClassMethod($method)) {
- self::$hookMethods[$className]['afterClass'][] = $method->getName();
- }
- }
- } catch (ReflectionException $e) {
- }
- }
- return self::$hookMethods[$className];
- }
- /**
- * @return array
- * @since Method available since Release 4.0.9
- */
- private static function emptyHookMethodsArray()
- {
- return array(
- 'beforeClass' => array('setUpBeforeClass'),
- 'before' => array('setUp'),
- 'after' => array('tearDown'),
- 'afterClass' => array('tearDownAfterClass')
- );
- }
- /**
- * @param string $className
- * @param string $methodName
- * @param string $settingName
- * @return bool
- * @since Method available since Release 3.4.0
- */
- private static function getBooleanAnnotationSetting($className, $methodName, $settingName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $result = null;
- if (isset($annotations['class'][$settingName])) {
- if ($annotations['class'][$settingName][0] == 'enabled') {
- $result = true;
- } elseif ($annotations['class'][$settingName][0] == 'disabled') {
- $result = false;
- }
- }
- if (isset($annotations['method'][$settingName])) {
- if ($annotations['method'][$settingName][0] == 'enabled') {
- $result = true;
- } elseif ($annotations['method'][$settingName][0] == 'disabled') {
- $result = false;
- }
- }
- return $result;
- }
- /**
- * @param string $element
- * @return array
- * @throws PHPUnit_Framework_InvalidCoversTargetException
- * @since Method available since Release 4.0.0
- */
- private static function resolveElementToReflectionObjects($element)
- {
- $codeToCoverList = array();
- if (strpos($element, '::') !== false) {
- list($className, $methodName) = explode('::', $element);
- if (isset($methodName[0]) && $methodName[0] == '<') {
- $classes = array($className);
- foreach ($classes as $className) {
- if (!class_exists($className) &&
- !interface_exists($className)) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing class or ' .
- 'interface "%s".',
- $className
- )
- );
- }
- $class = new ReflectionClass($className);
- $methods = $class->getMethods();
- $inverse = isset($methodName[1]) && $methodName[1] == '!';
- if (strpos($methodName, 'protected')) {
- $visibility = 'isProtected';
- } elseif (strpos($methodName, 'private')) {
- $visibility = 'isPrivate';
- } elseif (strpos($methodName, 'public')) {
- $visibility = 'isPublic';
- }
- foreach ($methods as $method) {
- if ($inverse && !$method->$visibility()) {
- $codeToCoverList[] = $method;
- } elseif (!$inverse && $method->$visibility()) {
- $codeToCoverList[] = $method;
- }
- }
- }
- } else {
- $classes = array($className);
- foreach ($classes as $className) {
- if ($className == '' && function_exists($methodName)) {
- $codeToCoverList[] = new ReflectionFunction(
- $methodName
- );
- } else {
- if (!((class_exists($className) ||
- interface_exists($className) ||
- trait_exists($className)) &&
- method_exists($className, $methodName))) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing method "%s::%s".',
- $className,
- $methodName
- )
- );
- }
- $codeToCoverList[] = new ReflectionMethod(
- $className,
- $methodName
- );
- }
- }
- }
- } else {
- $extended = false;
- if (strpos($element, '<extended>') !== false) {
- $element = str_replace('<extended>', '', $element);
- $extended = true;
- }
- $classes = array($element);
- if ($extended) {
- $classes = array_merge(
- $classes,
- class_implements($element),
- class_parents($element)
- );
- }
- foreach ($classes as $className) {
- if (!class_exists($className) &&
- !interface_exists($className) &&
- !trait_exists($className)) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing class or ' .
- 'interface "%s".',
- $className
- )
- );
- }
- $codeToCoverList[] = new ReflectionClass($className);
- }
- }
- return $codeToCoverList;
- }
- /**
- * @param array $reflectors
- * @return array
- */
- private static function resolveReflectionObjectsToLines(array $reflectors)
- {
- $result = array();
- foreach ($reflectors as $reflector) {
- $filename = $reflector->getFileName();
- if (!isset($result[$filename])) {
- $result[$filename] = array();
- }
- $result[$filename] = array_unique(
- array_merge(
- $result[$filename],
- range($reflector->getStartLine(), $reflector->getEndLine())
- )
- );
- }
- return $result;
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- * @since Method available since Release 4.0.8
- */
- private static function isBeforeClassMethod(ReflectionMethod $method)
- {
- return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false;
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- * @since Method available since Release 4.0.8
- */
- private static function isBeforeMethod(ReflectionMethod $method)
- {
- return preg_match('/@before\b/', $method->getDocComment());
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- * @since Method available since Release 4.0.8
- */
- private static function isAfterClassMethod(ReflectionMethod $method)
- {
- return $method->isStatic() && strpos($method->getDocComment(), '@afterClass') !== false;
- }
- /**
- * @param ReflectionMethod $method
- * @return bool
- * @since Method available since Release 4.0.8
- */
- private static function isAfterMethod(ReflectionMethod $method)
- {
- return preg_match('/@after\b/', $method->getDocComment());
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Filesystem helpers.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Filesystem
- {
- /**
- * @var array
- */
- protected static $buffer = array();
- /**
- * Maps class names to source file names:
- * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php
- * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php
- *
- * @param string $className
- * @return string
- * @since Method available since Release 3.4.0
- */
- public static function classNameToFilename($className)
- {
- return str_replace(
- array('_', '\\'),
- DIRECTORY_SEPARATOR,
- $className
- ) . '.php';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Command-line options parsing class.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Getopt
- {
- public static function getopt(array $args, $short_options, $long_options = null)
- {
- if (empty($args)) {
- return array(array(), array());
- }
- $opts = array();
- $non_opts = array();
- if ($long_options) {
- sort($long_options);
- }
- if (isset($args[0][0]) && $args[0][0] != '-') {
- array_shift($args);
- }
- reset($args);
- array_map('trim', $args);
- while (list($i, $arg) = each($args)) {
- if ($arg == '') {
- continue;
- }
- if ($arg == '--') {
- $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
- break;
- }
- if ($arg[0] != '-' ||
- (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
- $non_opts = array_merge($non_opts, array_slice($args, $i));
- break;
- } elseif (strlen($arg) > 1 && $arg[1] == '-') {
- self::parseLongOption(
- substr($arg, 2),
- $long_options,
- $opts,
- $args
- );
- } else {
- self::parseShortOption(
- substr($arg, 1),
- $short_options,
- $opts,
- $args
- );
- }
- }
- return array($opts, $non_opts);
- }
- protected static function parseShortOption($arg, $short_options, &$opts, &$args)
- {
- $argLen = strlen($arg);
- for ($i = 0; $i < $argLen; $i++) {
- $opt = $arg[$i];
- $opt_arg = null;
- if (($spec = strstr($short_options, $opt)) === false ||
- $arg[$i] == ':') {
- throw new PHPUnit_Framework_Exception(
- "unrecognized option -- $opt"
- );
- }
- if (strlen($spec) > 1 && $spec[1] == ':') {
- if (strlen($spec) > 2 && $spec[2] == ':') {
- if ($i + 1 < $argLen) {
- $opts[] = array($opt, substr($arg, $i + 1));
- break;
- }
- } else {
- if ($i + 1 < $argLen) {
- $opts[] = array($opt, substr($arg, $i + 1));
- break;
- } elseif (list(, $opt_arg) = each($args)) {
- } else {
- throw new PHPUnit_Framework_Exception(
- "option requires an argument -- $opt"
- );
- }
- }
- }
- $opts[] = array($opt, $opt_arg);
- }
- }
- protected static function parseLongOption($arg, $long_options, &$opts, &$args)
- {
- $count = count($long_options);
- $list = explode('=', $arg);
- $opt = $list[0];
- $opt_arg = null;
- if (count($list) > 1) {
- $opt_arg = $list[1];
- }
- $opt_len = strlen($opt);
- for ($i = 0; $i < $count; $i++) {
- $long_opt = $long_options[$i];
- $opt_start = substr($long_opt, 0, $opt_len);
- if ($opt_start != $opt) {
- continue;
- }
- $opt_rest = substr($long_opt, $opt_len);
- if ($opt_rest != '' && $opt[0] != '=' && $i + 1 < $count &&
- $opt == substr($long_options[$i+1], 0, $opt_len)) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt is ambiguous"
- );
- }
- if (substr($long_opt, -1) == '=') {
- if (substr($long_opt, -2) != '==') {
- if (!strlen($opt_arg) &&
- !(list(, $opt_arg) = each($args))) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt requires an argument"
- );
- }
- }
- } elseif ($opt_arg) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt doesn't allow an argument"
- );
- }
- $full_option = '--' . preg_replace('/={1,2}$/', '', $long_opt);
- $opts[] = array($full_option, $opt_arg);
- return;
- }
- throw new PHPUnit_Framework_Exception("unrecognized option --$opt");
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- // Workaround for http://bugs.php.net/bug.php?id=47987,
- // see https://github.com/sebastianbergmann/phpunit/issues#issue/125 for details
- // Use dirname(__DIR__) instead of using /../ because of https://github.com/facebook/hhvm/issues/5215
- require_once dirname(__DIR__) . '/Framework/Error.php';
- require_once dirname(__DIR__) . '/Framework/Error/Notice.php';
- require_once dirname(__DIR__) . '/Framework/Error/Warning.php';
- require_once dirname(__DIR__) . '/Framework/Error/Deprecated.php';
- /**
- * Error handler that converts PHP errors and warnings to exceptions.
- *
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Util_ErrorHandler
- {
- protected static $errorStack = array();
- /**
- * Returns the error stack.
- *
- * @return array
- */
- public static function getErrorStack()
- {
- return self::$errorStack;
- }
- /**
- * @param int $errno
- * @param string $errstr
- * @param string $errfile
- * @param int $errline
- * @throws PHPUnit_Framework_Error
- */
- public static function handleError($errno, $errstr, $errfile, $errline)
- {
- if (!($errno & error_reporting())) {
- return false;
- }
- self::$errorStack[] = array($errno, $errstr, $errfile, $errline);
- $trace = debug_backtrace(false);
- array_shift($trace);
- foreach ($trace as $frame) {
- if ($frame['function'] == '__toString') {
- return false;
- }
- }
- if ($errno == E_NOTICE || $errno == E_USER_NOTICE || $errno == E_STRICT) {
- if (PHPUnit_Framework_Error_Notice::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Notice';
- } elseif ($errno == E_WARNING || $errno == E_USER_WARNING) {
- if (PHPUnit_Framework_Error_Warning::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Warning';
- } elseif ($errno == E_DEPRECATED || $errno == E_USER_DEPRECATED) {
- if (PHPUnit_Framework_Error_Deprecated::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Deprecated';
- } else {
- $exception = 'PHPUnit_Framework_Error';
- }
- throw new $exception($errstr, $errno, $errfile, $errline);
- }
- /**
- * Registers an error handler and returns a function that will restore
- * the previous handler when invoked
- * @param int $severity PHP predefined error constant
- * @throws Exception if event of specified severity is emitted
- */
- public static function handleErrorOnce($severity = E_WARNING)
- {
- $terminator = function () {
- static $expired = false;
- if (!$expired) {
- $expired = true;
- // cleans temporary error handler
- return restore_error_handler();
- }
- };
- set_error_handler(function ($errno, $errstr) use ($severity) {
- if ($errno === $severity) {
- return;
- }
- return false;
- });
- return $terminator;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * String helpers.
- *
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Util_String
- {
- /**
- * Converts a string to UTF-8 encoding.
- *
- * @param string $string
- * @return string
- */
- public static function convertToUtf8($string)
- {
- if (!self::isUtf8($string)) {
- if (function_exists('mb_convert_encoding')) {
- $string = mb_convert_encoding($string, 'UTF-8');
- } else {
- $string = utf8_encode($string);
- }
- }
- return $string;
- }
- /**
- * Checks a string for UTF-8 encoding.
- *
- * @param string $string
- * @return bool
- */
- protected static function isUtf8($string)
- {
- $length = strlen($string);
- for ($i = 0; $i < $length; $i++) {
- if (ord($string[$i]) < 0x80) {
- $n = 0;
- } elseif ((ord($string[$i]) & 0xE0) == 0xC0) {
- $n = 1;
- } elseif ((ord($string[$i]) & 0xF0) == 0xE0) {
- $n = 2;
- } elseif ((ord($string[$i]) & 0xF0) == 0xF0) {
- $n = 3;
- } else {
- return false;
- }
- for ($j = 0; $j < $n; $j++) {
- if ((++$i == $length) || ((ord($string[$i]) & 0xC0) != 0x80)) {
- return false;
- }
- }
- }
- return true;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHPUnit_Framework_Exception objects that are used to describe
- * invalid arguments passed to a function or method.
- *
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Util_InvalidArgumentHelper
- {
- /**
- * @param int $argument
- * @param string $type
- * @param mixed $value
- * @return PHPUnit_Framework_Exception
- */
- public static function factory($argument, $type, $value = null)
- {
- $stack = debug_backtrace(false);
- return new PHPUnit_Framework_Exception(
- sprintf(
- 'Argument #%d%sof %s::%s() must be a %s',
- $argument,
- $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ',
- $stack[1]['class'],
- $stack[1]['function'],
- $type
- )
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class that can print to STDOUT or write to a file.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Util_Printer
- {
- /**
- * If true, flush output after every write.
- *
- * @var bool
- */
- protected $autoFlush = false;
- /**
- * @var resource
- */
- protected $out;
- /**
- * @var string
- */
- protected $outTarget;
- /**
- * @var bool
- */
- protected $printsHTML = false;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($out = null)
- {
- if ($out !== null) {
- if (is_string($out)) {
- if (strpos($out, 'socket://') === 0) {
- $out = explode(':', str_replace('socket://', '', $out));
- if (sizeof($out) != 2) {
- throw new PHPUnit_Framework_Exception;
- }
- $this->out = fsockopen($out[0], $out[1]);
- } else {
- if (strpos($out, 'php://') === false &&
- !is_dir(dirname($out))) {
- mkdir(dirname($out), 0777, true);
- }
- $this->out = fopen($out, 'wt');
- }
- $this->outTarget = $out;
- } else {
- $this->out = $out;
- }
- }
- }
- /**
- * Flush buffer, optionally tidy up HTML, and close output if it's not to a php stream
- */
- public function flush()
- {
- if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) {
- fclose($this->out);
- }
- if ($this->printsHTML === true &&
- $this->outTarget !== null &&
- strpos($this->outTarget, 'php://') !== 0 &&
- strpos($this->outTarget, 'socket://') !== 0 &&
- extension_loaded('tidy')) {
- file_put_contents(
- $this->outTarget,
- tidy_repair_file(
- $this->outTarget,
- array('indent' => true, 'wrap' => 0),
- 'utf8'
- )
- );
- }
- }
- /**
- * Performs a safe, incremental flush.
- *
- * Do not confuse this function with the flush() function of this class,
- * since the flush() function may close the file being written to, rendering
- * the current object no longer usable.
- *
- * @since Method available since Release 3.3.0
- */
- public function incrementalFlush()
- {
- if ($this->out) {
- fflush($this->out);
- } else {
- flush();
- }
- }
- /**
- * @param string $buffer
- */
- public function write($buffer)
- {
- if ($this->out) {
- fwrite($this->out, $buffer);
- if ($this->autoFlush) {
- $this->incrementalFlush();
- }
- } else {
- if (PHP_SAPI != 'cli') {
- $buffer = htmlspecialchars($buffer);
- }
- print $buffer;
- if ($this->autoFlush) {
- $this->incrementalFlush();
- }
- }
- }
- /**
- * Check auto-flush mode.
- *
- * @return bool
- * @since Method available since Release 3.3.0
- */
- public function getAutoFlush()
- {
- return $this->autoFlush;
- }
- /**
- * Set auto-flushing mode.
- *
- * If set, *incremental* flushes will be done after each write. This should
- * not be confused with the different effects of this class' flush() method.
- *
- * @param bool $autoFlush
- * @since Method available since Release 3.3.0
- */
- public function setAutoFlush($autoFlush)
- {
- if (is_bool($autoFlush)) {
- $this->autoFlush = $autoFlush;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for the PHPUnit XML configuration file.
- *
- * Example XML configuration file:
- * <code>
- * <?xml version="1.0" encoding="utf-8" ?>
- *
- * <phpunit backupGlobals="true"
- * backupStaticAttributes="false"
- * bootstrap="/path/to/bootstrap.php"
- * cacheTokens="false"
- * columns="80"
- * colors="false"
- * stderr="false"
- * convertErrorsToExceptions="true"
- * convertNoticesToExceptions="true"
- * convertWarningsToExceptions="true"
- * forceCoversAnnotation="false"
- * mapTestClassNameToCoveredClassName="false"
- * printerClass="PHPUnit_TextUI_ResultPrinter"
- * processIsolation="false"
- * stopOnError="false"
- * stopOnFailure="false"
- * stopOnIncomplete="false"
- * stopOnRisky="false"
- * stopOnSkipped="false"
- * testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
- * timeoutForSmallTests="1"
- * timeoutForMediumTests="10"
- * timeoutForLargeTests="60"
- * beStrictAboutTestsThatDoNotTestAnything="false"
- * beStrictAboutOutputDuringTests="false"
- * beStrictAboutTestSize="false"
- * beStrictAboutTodoAnnotatedTests="false"
- * checkForUnintentionallyCoveredCode="false"
- * disallowChangesToGlobalState="false"
- * verbose="false">
- * <testsuites>
- * <testsuite name="My Test Suite">
- * <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
- * <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
- * <exclude>/path/to/files/exclude</exclude>
- * </testsuite>
- * </testsuites>
- *
- * <groups>
- * <include>
- * <group>name</group>
- * </include>
- * <exclude>
- * <group>name</group>
- * </exclude>
- * </groups>
- *
- * <filter>
- * <blacklist>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * <exclude>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * </exclude>
- * </blacklist>
- * <whitelist addUncoveredFilesFromWhitelist="true"
- * processUncoveredFilesFromWhitelist="false">
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * <exclude>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * </exclude>
- * </whitelist>
- * </filter>
- *
- * <listeners>
- * <listener class="MyListener" file="/optional/path/to/MyListener.php">
- * <arguments>
- * <array>
- * <element key="0">
- * <string>Sebastian</string>
- * </element>
- * </array>
- * <integer>22</integer>
- * <string>April</string>
- * <double>19.78</double>
- * <null/>
- * <object class="stdClass"/>
- * <file>MyRelativeFile.php</file>
- * <directory>MyRelativeDir</directory>
- * </arguments>
- * </listener>
- * </listeners>
- *
- * <logging>
- * <log type="coverage-html" target="/tmp/report" lowUpperBound="50" highLowerBound="90"/>
- * <log type="coverage-clover" target="/tmp/clover.xml"/>
- * <log type="json" target="/tmp/logfile.json"/>
- * <log type="plain" target="/tmp/logfile.txt"/>
- * <log type="tap" target="/tmp/logfile.tap"/>
- * <log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
- * <log type="testdox-html" target="/tmp/testdox.html"/>
- * <log type="testdox-text" target="/tmp/testdox.txt"/>
- * <log type="coverage-crap4j" target="/tmp/crap.xml"/>
- * </logging>
- *
- * <php>
- * <includePath>.</includePath>
- * <ini name="foo" value="bar"/>
- * <const name="foo" value="bar"/>
- * <var name="foo" value="bar"/>
- * <env name="foo" value="bar"/>
- * <post name="foo" value="bar"/>
- * <get name="foo" value="bar"/>
- * <cookie name="foo" value="bar"/>
- * <server name="foo" value="bar"/>
- * <files name="foo" value="bar"/>
- * <request name="foo" value="bar"/>
- * </php>
- *
- * <selenium>
- * <browser name="Firefox on Linux"
- * browser="*firefox /usr/lib/firefox/firefox-bin"
- * host="my.linux.box"
- * port="4444"
- * timeout="30000"/>
- * </selenium>
- * </phpunit>
- * </code>
- *
- * @since Class available since Release 3.2.0
- */
- class PHPUnit_Util_Configuration
- {
- private static $instances = array();
- protected $document;
- protected $xpath;
- protected $filename;
- /**
- * Loads a PHPUnit configuration file.
- *
- * @param string $filename
- */
- protected function __construct($filename)
- {
- $this->filename = $filename;
- $this->document = PHPUnit_Util_XML::loadFile($filename, false, true, true);
- $this->xpath = new DOMXPath($this->document);
- }
- /**
- * @since Method available since Release 3.4.0
- */
- final private function __clone()
- {
- }
- /**
- * Returns a PHPUnit configuration object.
- *
- * @param string $filename
- * @return PHPUnit_Util_Configuration
- * @since Method available since Release 3.4.0
- */
- public static function getInstance($filename)
- {
- $realpath = realpath($filename);
- if ($realpath === false) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not read "%s".',
- $filename
- )
- );
- }
- if (!isset(self::$instances[$realpath])) {
- self::$instances[$realpath] = new self($realpath);
- }
- return self::$instances[$realpath];
- }
- /**
- * Returns the realpath to the configuration file.
- *
- * @return string
- * @since Method available since Release 3.6.0
- */
- public function getFilename()
- {
- return $this->filename;
- }
- /**
- * Returns the configuration for SUT filtering.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getFilterConfiguration()
- {
- $addUncoveredFilesFromWhitelist = true;
- $processUncoveredFilesFromWhitelist = false;
- $tmp = $this->xpath->query('filter/whitelist');
- if ($tmp->length == 1) {
- if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) {
- $addUncoveredFilesFromWhitelist = $this->getBoolean(
- (string) $tmp->item(0)->getAttribute(
- 'addUncoveredFilesFromWhitelist'
- ),
- true
- );
- }
- if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) {
- $processUncoveredFilesFromWhitelist = $this->getBoolean(
- (string) $tmp->item(0)->getAttribute(
- 'processUncoveredFilesFromWhitelist'
- ),
- false
- );
- }
- }
- return array(
- 'blacklist' => array(
- 'include' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/blacklist/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/blacklist/file'
- )
- ),
- 'exclude' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/blacklist/exclude/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/blacklist/exclude/file'
- )
- )
- ),
- 'whitelist' => array(
- 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist,
- 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist,
- 'include' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/whitelist/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/whitelist/file'
- )
- ),
- 'exclude' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/whitelist/exclude/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/whitelist/exclude/file'
- )
- )
- )
- );
- }
- /**
- * Returns the configuration for groups.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getGroupConfiguration()
- {
- $groups = array(
- 'include' => array(),
- 'exclude' => array()
- );
- foreach ($this->xpath->query('groups/include/group') as $group) {
- $groups['include'][] = (string) $group->nodeValue;
- }
- foreach ($this->xpath->query('groups/exclude/group') as $group) {
- $groups['exclude'][] = (string) $group->nodeValue;
- }
- return $groups;
- }
- /**
- * Returns the configuration for listeners.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function getListenerConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('listeners/listener') as $listener) {
- $class = (string) $listener->getAttribute('class');
- $file = '';
- $arguments = array();
- if ($listener->getAttribute('file')) {
- $file = $this->toAbsolutePath(
- (string) $listener->getAttribute('file'),
- true
- );
- }
- foreach ($listener->childNodes as $node) {
- if ($node instanceof DOMElement && $node->tagName == 'arguments') {
- foreach ($node->childNodes as $argument) {
- if ($argument instanceof DOMElement) {
- if ($argument->tagName == 'file' ||
- $argument->tagName == 'directory') {
- $arguments[] = $this->toAbsolutePath((string) $argument->nodeValue);
- } else {
- $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument);
- }
- }
- }
- }
- }
- $result[] = array(
- 'class' => $class,
- 'file' => $file,
- 'arguments' => $arguments
- );
- }
- return $result;
- }
- /**
- * Returns the logging configuration.
- *
- * @return array
- */
- public function getLoggingConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('logging/log') as $log) {
- $type = (string) $log->getAttribute('type');
- $target = (string) $log->getAttribute('target');
- if (!$target) {
- continue;
- }
- $target = $this->toAbsolutePath($target);
- if ($type == 'coverage-html') {
- if ($log->hasAttribute('lowUpperBound')) {
- $result['lowUpperBound'] = $this->getInteger(
- (string) $log->getAttribute('lowUpperBound'),
- 50
- );
- }
- if ($log->hasAttribute('highLowerBound')) {
- $result['highLowerBound'] = $this->getInteger(
- (string) $log->getAttribute('highLowerBound'),
- 90
- );
- }
- } elseif ($type == 'junit') {
- if ($log->hasAttribute('logIncompleteSkipped')) {
- $result['logIncompleteSkipped'] = $this->getBoolean(
- (string) $log->getAttribute('logIncompleteSkipped'),
- false
- );
- }
- } elseif ($type == 'coverage-text') {
- if ($log->hasAttribute('showUncoveredFiles')) {
- $result['coverageTextShowUncoveredFiles'] = $this->getBoolean(
- (string) $log->getAttribute('showUncoveredFiles'),
- false
- );
- }
- if ($log->hasAttribute('showOnlySummary')) {
- $result['coverageTextShowOnlySummary'] = $this->getBoolean(
- (string) $log->getAttribute('showOnlySummary'),
- false
- );
- }
- }
- $result[$type] = $target;
- }
- return $result;
- }
- /**
- * Returns the PHP configuration.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getPHPConfiguration()
- {
- $result = array(
- 'include_path' => array(),
- 'ini' => array(),
- 'const' => array(),
- 'var' => array(),
- 'env' => array(),
- 'post' => array(),
- 'get' => array(),
- 'cookie' => array(),
- 'server' => array(),
- 'files' => array(),
- 'request' => array()
- );
- foreach ($this->xpath->query('php/includePath') as $includePath) {
- $path = (string) $includePath->nodeValue;
- if ($path) {
- $result['include_path'][] = $this->toAbsolutePath($path);
- }
- }
- foreach ($this->xpath->query('php/ini') as $ini) {
- $name = (string) $ini->getAttribute('name');
- $value = (string) $ini->getAttribute('value');
- $result['ini'][$name] = $value;
- }
- foreach ($this->xpath->query('php/const') as $const) {
- $name = (string) $const->getAttribute('name');
- $value = (string) $const->getAttribute('value');
- $result['const'][$name] = $this->getBoolean($value, $value);
- }
- foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
- foreach ($this->xpath->query('php/' . $array) as $var) {
- $name = (string) $var->getAttribute('name');
- $value = (string) $var->getAttribute('value');
- $result[$array][$name] = $this->getBoolean($value, $value);
- }
- }
- return $result;
- }
- /**
- * Handles the PHP configuration.
- *
- * @since Method available since Release 3.2.20
- */
- public function handlePHPConfiguration()
- {
- $configuration = $this->getPHPConfiguration();
- if (! empty($configuration['include_path'])) {
- ini_set(
- 'include_path',
- implode(PATH_SEPARATOR, $configuration['include_path']) .
- PATH_SEPARATOR .
- ini_get('include_path')
- );
- }
- foreach ($configuration['ini'] as $name => $value) {
- if (defined($value)) {
- $value = constant($value);
- }
- ini_set($name, $value);
- }
- foreach ($configuration['const'] as $name => $value) {
- if (!defined($name)) {
- define($name, $value);
- }
- }
- foreach (array('var', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
- // See https://github.com/sebastianbergmann/phpunit/issues/277
- switch ($array) {
- case 'var':
- $target = &$GLOBALS;
- break;
- case 'server':
- $target = &$_SERVER;
- break;
- default:
- $target = &$GLOBALS['_' . strtoupper($array)];
- break;
- }
- foreach ($configuration[$array] as $name => $value) {
- $target[$name] = $value;
- }
- }
- foreach ($configuration['env'] as $name => $value) {
- if (false === getenv($name)) {
- putenv("{$name}={$value}");
- }
- if (!isset($_ENV[$name])) {
- $_ENV[$name] = $value;
- }
- }
- }
- /**
- * Returns the PHPUnit configuration.
- *
- * @return array
- * @since Method available since Release 3.2.14
- */
- public function getPHPUnitConfiguration()
- {
- $result = array();
- $root = $this->document->documentElement;
- if ($root->hasAttribute('cacheTokens')) {
- $result['cacheTokens'] = $this->getBoolean(
- (string) $root->getAttribute('cacheTokens'),
- false
- );
- }
- if ($root->hasAttribute('columns')) {
- $columns = (string) $root->getAttribute('columns');
- if ($columns == 'max') {
- $result['columns'] = 'max';
- } else {
- $result['columns'] = $this->getInteger($columns, 80);
- }
- }
- if ($root->hasAttribute('colors')) {
- /* only allow boolean for compatibility with previous versions
- 'always' only allowed from command line */
- if ($this->getBoolean($root->getAttribute('colors'), false)) {
- $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_AUTO;
- } else {
- $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_NEVER;
- }
- }
- /*
- * Issue #657
- */
- if ($root->hasAttribute('stderr')) {
- $result['stderr'] = $this->getBoolean(
- (string) $root->getAttribute('stderr'),
- false
- );
- }
- if ($root->hasAttribute('backupGlobals')) {
- $result['backupGlobals'] = $this->getBoolean(
- (string) $root->getAttribute('backupGlobals'),
- true
- );
- }
- if ($root->hasAttribute('backupStaticAttributes')) {
- $result['backupStaticAttributes'] = $this->getBoolean(
- (string) $root->getAttribute('backupStaticAttributes'),
- false
- );
- }
- if ($root->getAttribute('bootstrap')) {
- $result['bootstrap'] = $this->toAbsolutePath(
- (string) $root->getAttribute('bootstrap')
- );
- }
- if ($root->hasAttribute('convertErrorsToExceptions')) {
- $result['convertErrorsToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertErrorsToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('convertNoticesToExceptions')) {
- $result['convertNoticesToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertNoticesToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('convertWarningsToExceptions')) {
- $result['convertWarningsToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertWarningsToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('forceCoversAnnotation')) {
- $result['forceCoversAnnotation'] = $this->getBoolean(
- (string) $root->getAttribute('forceCoversAnnotation'),
- false
- );
- }
- if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) {
- $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean(
- (string) $root->getAttribute('mapTestClassNameToCoveredClassName'),
- false
- );
- }
- if ($root->hasAttribute('processIsolation')) {
- $result['processIsolation'] = $this->getBoolean(
- (string) $root->getAttribute('processIsolation'),
- false
- );
- }
- if ($root->hasAttribute('stopOnError')) {
- $result['stopOnError'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnError'),
- false
- );
- }
- if ($root->hasAttribute('stopOnFailure')) {
- $result['stopOnFailure'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnFailure'),
- false
- );
- }
- if ($root->hasAttribute('stopOnIncomplete')) {
- $result['stopOnIncomplete'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnIncomplete'),
- false
- );
- }
- if ($root->hasAttribute('stopOnRisky')) {
- $result['stopOnRisky'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnRisky'),
- false
- );
- }
- if ($root->hasAttribute('stopOnSkipped')) {
- $result['stopOnSkipped'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnSkipped'),
- false
- );
- }
- if ($root->hasAttribute('testSuiteLoaderClass')) {
- $result['testSuiteLoaderClass'] = (string) $root->getAttribute(
- 'testSuiteLoaderClass'
- );
- }
- if ($root->getAttribute('testSuiteLoaderFile')) {
- $result['testSuiteLoaderFile'] = $this->toAbsolutePath(
- (string) $root->getAttribute('testSuiteLoaderFile')
- );
- }
- if ($root->hasAttribute('printerClass')) {
- $result['printerClass'] = (string) $root->getAttribute(
- 'printerClass'
- );
- }
- if ($root->getAttribute('printerFile')) {
- $result['printerFile'] = $this->toAbsolutePath(
- (string) $root->getAttribute('printerFile')
- );
- }
- if ($root->hasAttribute('timeoutForSmallTests')) {
- $result['timeoutForSmallTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForSmallTests'),
- 1
- );
- }
- if ($root->hasAttribute('timeoutForMediumTests')) {
- $result['timeoutForMediumTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForMediumTests'),
- 10
- );
- }
- if ($root->hasAttribute('timeoutForLargeTests')) {
- $result['timeoutForLargeTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForLargeTests'),
- 60
- );
- }
- if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) {
- $result['reportUselessTests'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'),
- false
- );
- }
- if ($root->hasAttribute('checkForUnintentionallyCoveredCode')) {
- $result['strictCoverage'] = $this->getBoolean(
- (string) $root->getAttribute('checkForUnintentionallyCoveredCode'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutOutputDuringTests')) {
- $result['disallowTestOutput'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutOutputDuringTests'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) {
- $result['disallowChangesToGlobalState'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutChangesToGlobalState'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutTestSize')) {
- $result['enforceTimeLimit'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTestSize'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) {
- $result['disallowTodoAnnotatedTests'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'),
- false
- );
- }
- if ($root->hasAttribute('strict')) {
- $flag = $this->getBoolean(
- (string) $root->getAttribute('strict'),
- false
- );
- $result['reportUselessTests'] = $flag;
- $result['strictCoverage'] = $flag;
- $result['disallowTestOutput'] = $flag;
- $result['enforceTimeLimit'] = $flag;
- $result['disallowTodoAnnotatedTests'] = $flag;
- $result['deprecatedStrictModeSetting'] = true;
- }
- if ($root->hasAttribute('verbose')) {
- $result['verbose'] = $this->getBoolean(
- (string) $root->getAttribute('verbose'),
- false
- );
- }
- return $result;
- }
- /**
- * Returns the SeleniumTestCase browser configuration.
- *
- * @return array
- * @since Method available since Release 3.2.9
- */
- public function getSeleniumBrowserConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('selenium/browser') as $config) {
- $name = (string) $config->getAttribute('name');
- $browser = (string) $config->getAttribute('browser');
- if ($config->hasAttribute('host')) {
- $host = (string) $config->getAttribute('host');
- } else {
- $host = 'localhost';
- }
- if ($config->hasAttribute('port')) {
- $port = $this->getInteger(
- (string) $config->getAttribute('port'),
- 4444
- );
- } else {
- $port = 4444;
- }
- if ($config->hasAttribute('timeout')) {
- $timeout = $this->getInteger(
- (string) $config->getAttribute('timeout'),
- 30000
- );
- } else {
- $timeout = 30000;
- }
- $result[] = array(
- 'name' => $name,
- 'browser' => $browser,
- 'host' => $host,
- 'port' => $port,
- 'timeout' => $timeout
- );
- }
- return $result;
- }
- /**
- * Returns the test suite configuration.
- *
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.2.1
- */
- public function getTestSuiteConfiguration($testSuiteFilter = null)
- {
- $testSuiteNodes = $this->xpath->query('testsuites/testsuite');
- if ($testSuiteNodes->length == 0) {
- $testSuiteNodes = $this->xpath->query('testsuite');
- }
- if ($testSuiteNodes->length == 1) {
- return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter);
- }
- if ($testSuiteNodes->length > 1) {
- $suite = new PHPUnit_Framework_TestSuite;
- foreach ($testSuiteNodes as $testSuiteNode) {
- $suite->addTestSuite(
- $this->getTestSuite($testSuiteNode, $testSuiteFilter)
- );
- }
- return $suite;
- }
- }
- /**
- * @param DOMElement $testSuiteNode
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.4.0
- */
- protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter = null)
- {
- if ($testSuiteNode->hasAttribute('name')) {
- $suite = new PHPUnit_Framework_TestSuite(
- (string) $testSuiteNode->getAttribute('name')
- );
- } else {
- $suite = new PHPUnit_Framework_TestSuite;
- }
- $exclude = array();
- foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) {
- $excludeFile = (string) $excludeNode->nodeValue;
- if ($excludeFile) {
- $exclude[] = $this->toAbsolutePath($excludeFile);
- }
- }
- $fileIteratorFacade = new File_Iterator_Facade;
- foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) {
- if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) {
- continue;
- }
- $directory = (string) $directoryNode->nodeValue;
- if (empty($directory)) {
- continue;
- }
- if ($directoryNode->hasAttribute('phpVersion')) {
- $phpVersion = (string) $directoryNode->getAttribute('phpVersion');
- } else {
- $phpVersion = PHP_VERSION;
- }
- if ($directoryNode->hasAttribute('phpVersionOperator')) {
- $phpVersionOperator = (string) $directoryNode->getAttribute('phpVersionOperator');
- } else {
- $phpVersionOperator = '>=';
- }
- if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
- continue;
- }
- if ($directoryNode->hasAttribute('prefix')) {
- $prefix = (string) $directoryNode->getAttribute('prefix');
- } else {
- $prefix = '';
- }
- if ($directoryNode->hasAttribute('suffix')) {
- $suffix = (string) $directoryNode->getAttribute('suffix');
- } else {
- $suffix = 'Test.php';
- }
- $files = $fileIteratorFacade->getFilesAsArray(
- $this->toAbsolutePath($directory),
- $suffix,
- $prefix,
- $exclude
- );
- $suite->addTestFiles($files);
- }
- foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) {
- if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) {
- continue;
- }
- $file = (string) $fileNode->nodeValue;
- if (empty($file)) {
- continue;
- }
- // Get the absolute path to the file
- $file = $fileIteratorFacade->getFilesAsArray(
- $this->toAbsolutePath($file)
- );
- if (!isset($file[0])) {
- continue;
- }
- $file = $file[0];
- if ($fileNode->hasAttribute('phpVersion')) {
- $phpVersion = (string) $fileNode->getAttribute('phpVersion');
- } else {
- $phpVersion = PHP_VERSION;
- }
- if ($fileNode->hasAttribute('phpVersionOperator')) {
- $phpVersionOperator = (string) $fileNode->getAttribute('phpVersionOperator');
- } else {
- $phpVersionOperator = '>=';
- }
- if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
- continue;
- }
- $suite->addTestFile($file);
- }
- return $suite;
- }
- /**
- * @param string $value
- * @param bool $default
- * @return bool
- * @since Method available since Release 3.2.3
- */
- protected function getBoolean($value, $default)
- {
- if (strtolower($value) == 'false') {
- return false;
- } elseif (strtolower($value) == 'true') {
- return true;
- }
- return $default;
- }
- /**
- * @param string $value
- * @param bool $default
- * @return bool
- * @since Method available since Release 3.6.0
- */
- protected function getInteger($value, $default)
- {
- if (is_numeric($value)) {
- return (int) $value;
- }
- return $default;
- }
- /**
- * @param string $query
- * @return array
- * @since Method available since Release 3.2.3
- */
- protected function readFilterDirectories($query)
- {
- $directories = array();
- foreach ($this->xpath->query($query) as $directory) {
- $directoryPath = (string) $directory->nodeValue;
- if (!$directoryPath) {
- continue;
- }
- if ($directory->hasAttribute('prefix')) {
- $prefix = (string) $directory->getAttribute('prefix');
- } else {
- $prefix = '';
- }
- if ($directory->hasAttribute('suffix')) {
- $suffix = (string) $directory->getAttribute('suffix');
- } else {
- $suffix = '.php';
- }
- if ($directory->hasAttribute('group')) {
- $group = (string) $directory->getAttribute('group');
- } else {
- $group = 'DEFAULT';
- }
- $directories[] = array(
- 'path' => $this->toAbsolutePath($directoryPath),
- 'prefix' => $prefix,
- 'suffix' => $suffix,
- 'group' => $group
- );
- }
- return $directories;
- }
- /**
- * @param string $query
- * @return array
- * @since Method available since Release 3.2.3
- */
- protected function readFilterFiles($query)
- {
- $files = array();
- foreach ($this->xpath->query($query) as $file) {
- $filePath = (string) $file->nodeValue;
- if ($filePath) {
- $files[] = $this->toAbsolutePath($filePath);
- }
- }
- return $files;
- }
- /**
- * @param string $path
- * @param bool $useIncludePath
- * @return string
- * @since Method available since Release 3.5.0
- */
- protected function toAbsolutePath($path, $useIncludePath = false)
- {
- if ($path[0] === '/') {
- return $path;
- }
- // Matches the following on Windows:
- // - \\NetworkComputer\Path
- // - \\.\D:
- // - \\.\c:
- // - C:\Windows
- // - C:\windows
- // - C:/windows
- // - c:/windows
- if (defined('PHP_WINDOWS_VERSION_BUILD') &&
- ($path[0] === '\\' ||
- (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) {
- return $path;
- }
- // Stream
- if (strpos($path, '://') !== false) {
- return $path;
- }
- $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path;
- if ($useIncludePath && !file_exists($file)) {
- $includePathFile = stream_resolve_include_path($path);
- if ($includePathFile) {
- $file = $includePathFile;
- }
- }
- return $file;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Util_GlobalState
- {
- /**
- * @var array
- */
- protected static $superGlobalArrays = array(
- '_ENV',
- '_POST',
- '_GET',
- '_COOKIE',
- '_SERVER',
- '_FILES',
- '_REQUEST'
- );
- /**
- * @var array
- */
- protected static $superGlobalArraysLong = array(
- 'HTTP_ENV_VARS',
- 'HTTP_POST_VARS',
- 'HTTP_GET_VARS',
- 'HTTP_COOKIE_VARS',
- 'HTTP_SERVER_VARS',
- 'HTTP_POST_FILES'
- );
- public static function getIncludedFilesAsString()
- {
- return static::processIncludedFilesAsString(get_included_files());
- }
- public static function processIncludedFilesAsString(array $files)
- {
- $blacklist = new PHPUnit_Util_Blacklist;
- $prefix = false;
- $result = '';
- if (defined('__PHPUNIT_PHAR__')) {
- $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/';
- }
- for ($i = count($files) - 1; $i > 0; $i--) {
- $file = $files[$i];
- if ($prefix !== false && strpos($file, $prefix) === 0) {
- continue;
- }
- // Skip virtual file system protocols
- if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) {
- continue;
- }
- if (!$blacklist->isBlacklisted($file) && is_file($file)) {
- $result = 'require_once \'' . $file . "';\n" . $result;
- }
- }
- return $result;
- }
- public static function getIniSettingsAsString()
- {
- $result = '';
- $iniSettings = ini_get_all(null, false);
- foreach ($iniSettings as $key => $value) {
- $result .= sprintf(
- '@ini_set(%s, %s);' . "\n",
- self::exportVariable($key),
- self::exportVariable($value)
- );
- }
- return $result;
- }
- public static function getConstantsAsString()
- {
- $constants = get_defined_constants(true);
- $result = '';
- if (isset($constants['user'])) {
- foreach ($constants['user'] as $name => $value) {
- $result .= sprintf(
- 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n",
- $name,
- $name,
- self::exportVariable($value)
- );
- }
- }
- return $result;
- }
- public static function getGlobalsAsString()
- {
- $result = '';
- $superGlobalArrays = self::getSuperGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- if (isset($GLOBALS[$superGlobalArray]) &&
- is_array($GLOBALS[$superGlobalArray])) {
- foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) {
- if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) {
- continue;
- }
- $result .= sprintf(
- '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n",
- $superGlobalArray,
- $key,
- self::exportVariable($GLOBALS[$superGlobalArray][$key])
- );
- }
- }
- }
- $blacklist = $superGlobalArrays;
- $blacklist[] = 'GLOBALS';
- foreach (array_keys($GLOBALS) as $key) {
- if (!in_array($key, $blacklist) && !$GLOBALS[$key] instanceof Closure) {
- $result .= sprintf(
- '$GLOBALS[\'%s\'] = %s;' . "\n",
- $key,
- self::exportVariable($GLOBALS[$key])
- );
- }
- }
- return $result;
- }
- protected static function getSuperGlobalArrays()
- {
- if (ini_get('register_long_arrays') == '1') {
- return array_merge(
- self::$superGlobalArrays,
- self::$superGlobalArraysLong
- );
- } else {
- return self::$superGlobalArrays;
- }
- }
- protected static function exportVariable($variable)
- {
- if (is_scalar($variable) || is_null($variable) ||
- (is_array($variable) && self::arrayOnlyContainsScalars($variable))) {
- return var_export($variable, true);
- }
- return 'unserialize(' .
- var_export(serialize($variable), true) .
- ')';
- }
- protected static function arrayOnlyContainsScalars(array $array)
- {
- $result = true;
- foreach ($array as $element) {
- if (is_array($element)) {
- $result = self::arrayOnlyContainsScalars($element);
- } elseif (!is_scalar($element) && !is_null($element)) {
- $result = false;
- }
- if ($result === false) {
- break;
- }
- }
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestListener that generates JSON messages.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var string
- */
- protected $currentTestSuiteName = '';
- /**
- * @var string
- */
- protected $currentTestName = '';
- /**
- * @var bool
- */
- protected $currentTestPass = true;
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeCase(
- 'fail',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Incomplete Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Risky Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Skipped Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->currentTestSuiteName = $suite->getName();
- $this->currentTestName = '';
- $this->write(
- array(
- 'event' => 'suiteStart',
- 'suite' => $this->currentTestSuiteName,
- 'tests' => count($suite)
- )
- );
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->currentTestSuiteName = '';
- $this->currentTestName = '';
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->currentTestName = PHPUnit_Util_Test::describe($test);
- $this->currentTestPass = true;
- $this->write(
- array(
- 'event' => 'testStart',
- 'suite' => $this->currentTestSuiteName,
- 'test' => $this->currentTestName
- )
- );
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if ($this->currentTestPass) {
- $this->writeCase('pass', $time, array(), '', $test);
- }
- }
- /**
- * @param string $status
- * @param float $time
- * @param array $trace
- * @param string $message
- * @param PHPUnit_Framework_TestCase|null $test
- */
- protected function writeCase($status, $time, array $trace = array(), $message = '', $test = null)
- {
- $output = '';
- // take care of TestSuite producing error (e.g. by running into exception) as TestSuite doesn't have hasOutput
- if ($test !== null && method_exists($test, 'hasOutput') && $test->hasOutput()) {
- $output = $test->getActualOutput();
- }
- $this->write(
- array(
- 'event' => 'test',
- 'suite' => $this->currentTestSuiteName,
- 'test' => $this->currentTestName,
- 'status' => $status,
- 'time' => $time,
- 'trace' => $trace,
- 'message' => PHPUnit_Util_String::convertToUtf8($message),
- 'output' => $output,
- )
- );
- }
- /**
- * @param string $buffer
- */
- public function write($buffer)
- {
- array_walk_recursive($buffer, function (&$input) {
- if (is_string($input)) {
- $input = PHPUnit_Util_String::convertToUtf8($input);
- }
- });
- $flags = 0;
- if (defined('JSON_PRETTY_PRINT')) {
- $flags |= JSON_PRETTY_PRINT;
- }
- parent::write(json_encode($buffer, $flags));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestListener that generates a logfile of the
- * test execution using the Test Anything Protocol (TAP).
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Log_TAP extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var int
- */
- protected $testNumber = 0;
- /**
- * @var int
- */
- protected $testSuiteLevel = 0;
- /**
- * @var bool
- */
- protected $testSuccessful = true;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.3.4
- */
- public function __construct($out = null)
- {
- parent::__construct($out);
- $this->write("TAP version 13\n");
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeNotOk($test, 'Error');
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeNotOk($test, 'Failure');
- $message = explode(
- "\n",
- PHPUnit_Framework_TestFailure::exceptionToString($e)
- );
- $diagnostic = array(
- 'message' => $message[0],
- 'severity' => 'fail'
- );
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
- $cf = $e->getComparisonFailure();
- if ($cf !== null) {
- $diagnostic['data'] = array(
- 'got' => $cf->getActual(),
- 'expected' => $cf->getExpected()
- );
- }
- }
- $yaml = new Symfony\Component\Yaml\Dumper;
- $this->write(
- sprintf(
- " ---\n%s ...\n",
- $yaml->dump($diagnostic, 2, 2)
- )
- );
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeNotOk($test, '', 'TODO Incomplete Test');
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->write(
- sprintf(
- "ok %d - # RISKY%s\n",
- $this->testNumber,
- $e->getMessage() != '' ? ' ' . $e->getMessage() : ''
- )
- );
- $this->testSuccessful = false;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->write(
- sprintf(
- "ok %d - # SKIP%s\n",
- $this->testNumber,
- $e->getMessage() != '' ? ' ' . $e->getMessage() : ''
- )
- );
- $this->testSuccessful = false;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuiteLevel++;
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuiteLevel--;
- if ($this->testSuiteLevel == 0) {
- $this->write(sprintf("1..%d\n", $this->testNumber));
- }
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->testNumber++;
- $this->testSuccessful = true;
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if ($this->testSuccessful === true) {
- $this->write(
- sprintf(
- "ok %d - %s\n",
- $this->testNumber,
- PHPUnit_Util_Test::describe($test)
- )
- );
- }
- $this->writeDiagnostics($test);
- }
- /**
- * @param PHPUnit_Framework_Test $test
- * @param string $prefix
- * @param string $directive
- */
- protected function writeNotOk(PHPUnit_Framework_Test $test, $prefix = '', $directive = '')
- {
- $this->write(
- sprintf(
- "not ok %d - %s%s%s\n",
- $this->testNumber,
- $prefix != '' ? $prefix . ': ' : '',
- PHPUnit_Util_Test::describe($test),
- $directive != '' ? ' # ' . $directive : ''
- )
- );
- $this->testSuccessful = false;
- }
- /**
- * @param PHPUnit_Framework_Test $test
- */
- private function writeDiagnostics(PHPUnit_Framework_Test $test)
- {
- if (!$test instanceof PHPUnit_Framework_TestCase) {
- return;
- }
- if (!$test->hasOutput()) {
- return;
- }
- foreach (explode("\n", trim($test->getActualOutput())) as $line) {
- $this->write(
- sprintf(
- "# %s\n",
- $line
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestListener that generates a logfile of the test execution in XML markup.
- *
- * The XML markup used is the same as the one that is used by the JUnit Ant task.
- *
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_Log_JUnit extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var DOMDocument
- */
- protected $document;
- /**
- * @var DOMElement
- */
- protected $root;
- /**
- * @var bool
- */
- protected $logIncompleteSkipped = false;
- /**
- * @var bool
- */
- protected $writeDocument = true;
- /**
- * @var DOMElement[]
- */
- protected $testSuites = array();
- /**
- * @var integer[]
- */
- protected $testSuiteTests = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteAssertions = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteErrors = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteFailures = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteTimes = array(0);
- /**
- * @var int
- */
- protected $testSuiteLevel = 0;
- /**
- * @var DOMElement
- */
- protected $currentTestCase = null;
- /**
- * @var bool
- */
- protected $attachCurrentTestCase = true;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @param bool $logIncompleteSkipped
- */
- public function __construct($out = null, $logIncompleteSkipped = false)
- {
- $this->document = new DOMDocument('1.0', 'UTF-8');
- $this->document->formatOutput = true;
- $this->root = $this->document->createElement('testsuites');
- $this->document->appendChild($this->root);
- parent::__construct($out);
- $this->logIncompleteSkipped = $logIncompleteSkipped;
- }
- /**
- * Flush buffer and close output.
- */
- public function flush()
- {
- if ($this->writeDocument === true) {
- $this->write($this->getXML());
- }
- parent::flush();
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->currentTestCase === null) {
- return;
- }
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $test->toString() . "\n";
- } else {
- $buffer = '';
- }
- $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
- "\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e);
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString($buffer)
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if ($this->currentTestCase === null) {
- return;
- }
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $test->toString() . "\n";
- } else {
- $buffer = '';
- }
- $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
- "\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e);
- $failure = $this->document->createElement(
- 'failure',
- PHPUnit_Util_XML::prepareString($buffer)
- );
- $failure->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($failure);
- $this->testSuiteFailures[$this->testSuiteLevel]++;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Incomplete Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Risky Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Skipped Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $testSuite = $this->document->createElement('testsuite');
- $testSuite->setAttribute('name', $suite->getName());
- if (class_exists($suite->getName(), false)) {
- try {
- $class = new ReflectionClass($suite->getName());
- $testSuite->setAttribute('file', $class->getFileName());
- } catch (ReflectionException $e) {
- }
- }
- if ($this->testSuiteLevel > 0) {
- $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite);
- } else {
- $this->root->appendChild($testSuite);
- }
- $this->testSuiteLevel++;
- $this->testSuites[$this->testSuiteLevel] = $testSuite;
- $this->testSuiteTests[$this->testSuiteLevel] = 0;
- $this->testSuiteAssertions[$this->testSuiteLevel] = 0;
- $this->testSuiteErrors[$this->testSuiteLevel] = 0;
- $this->testSuiteFailures[$this->testSuiteLevel] = 0;
- $this->testSuiteTimes[$this->testSuiteLevel] = 0;
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'tests',
- $this->testSuiteTests[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'assertions',
- $this->testSuiteAssertions[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'failures',
- $this->testSuiteFailures[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'errors',
- $this->testSuiteErrors[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'time',
- sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel])
- );
- if ($this->testSuiteLevel > 1) {
- $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel];
- $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel];
- $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel];
- $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel];
- $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel];
- }
- $this->testSuiteLevel--;
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $testCase = $this->document->createElement('testcase');
- $testCase->setAttribute('name', $test->getName());
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $class = new ReflectionClass($test);
- $methodName = $test->getName();
- if ($class->hasMethod($methodName)) {
- $method = $class->getMethod($test->getName());
- $testCase->setAttribute('class', $class->getName());
- $testCase->setAttribute('file', $class->getFileName());
- $testCase->setAttribute('line', $method->getStartLine());
- }
- }
- $this->currentTestCase = $testCase;
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if ($this->attachCurrentTestCase) {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $numAssertions = $test->getNumAssertions();
- $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions;
- $this->currentTestCase->setAttribute(
- 'assertions',
- $numAssertions
- );
- }
- $this->currentTestCase->setAttribute(
- 'time',
- sprintf('%F', $time)
- );
- $this->testSuites[$this->testSuiteLevel]->appendChild(
- $this->currentTestCase
- );
- $this->testSuiteTests[$this->testSuiteLevel]++;
- $this->testSuiteTimes[$this->testSuiteLevel] += $time;
- if (method_exists($test, 'hasOutput') && $test->hasOutput()) {
- $systemOut = $this->document->createElement('system-out');
- $systemOut->appendChild(
- $this->document->createTextNode($test->getActualOutput())
- );
- $this->currentTestCase->appendChild($systemOut);
- }
- }
- $this->attachCurrentTestCase = true;
- $this->currentTestCase = null;
- }
- /**
- * Returns the XML as a string.
- *
- * @return string
- * @since Method available since Release 2.2.0
- */
- public function getXML()
- {
- return $this->document->saveXML();
- }
- /**
- * Enables or disables the writing of the document
- * in flush().
- *
- * This is a "hack" needed for the integration of
- * PHPUnit with Phing.
- *
- * @return string
- * @since Method available since Release 2.2.0
- */
- public function setWriteDocument($flag)
- {
- if (is_bool($flag)) {
- $this->writeDocument = $flag;
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for blacklisting PHPUnit's own source code files.
- *
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Util_Blacklist
- {
- /**
- * @var array
- */
- public static $blacklistedClassNames = array(
- 'File_Iterator' => 1,
- 'PHP_CodeCoverage' => 1,
- 'PHP_Invoker' => 1,
- 'PHP_Timer' => 1,
- 'PHP_Token' => 1,
- 'PHPUnit_Framework_TestCase' => 2,
- 'PHPUnit_Extensions_Database_TestCase' => 2,
- 'PHPUnit_Framework_MockObject_Generator' => 2,
- 'PHPUnit_Extensions_SeleniumTestCase' => 2,
- 'PHPUnit_Extensions_Story_TestCase' => 2,
- 'Text_Template' => 1,
- 'Symfony\Component\Yaml\Yaml' => 1,
- 'SebastianBergmann\Diff\Diff' => 1,
- 'SebastianBergmann\Environment\Runtime' => 1,
- 'SebastianBergmann\Comparator\Comparator' => 1,
- 'SebastianBergmann\Exporter\Exporter' => 1,
- 'SebastianBergmann\GlobalState\Snapshot' => 1,
- 'SebastianBergmann\RecursionContext\Context' => 1,
- 'SebastianBergmann\Version' => 1,
- 'Composer\Autoload\ClassLoader' => 1,
- 'Doctrine\Instantiator\Instantiator' => 1,
- 'phpDocumentor\Reflection\DocBlock' => 1,
- 'Prophecy\Prophet' => 1
- );
- /**
- * @var array
- */
- private static $directories;
- /**
- * @return array
- * @since Method available since Release 4.1.0
- */
- public function getBlacklistedDirectories()
- {
- $this->initialize();
- return self::$directories;
- }
- /**
- * @param string $file
- * @return bool
- */
- public function isBlacklisted($file)
- {
- if (defined('PHPUNIT_TESTSUITE')) {
- return false;
- }
- $this->initialize();
- foreach (self::$directories as $directory) {
- if (strpos($file, $directory) === 0) {
- return true;
- }
- }
- return false;
- }
- private function initialize()
- {
- if (self::$directories === null) {
- self::$directories = array();
- foreach (self::$blacklistedClassNames as $className => $parent) {
- if (!class_exists($className)) {
- continue;
- }
- $reflector = new ReflectionClass($className);
- $directory = $reflector->getFileName();
- for ($i = 0; $i < $parent; $i++) {
- $directory = dirname($directory);
- }
- self::$directories[] = $directory;
- }
- // Hide process isolation workaround on Windows.
- // @see PHPUnit_Util_PHP::factory()
- // @see PHPUnit_Util_PHP_Windows::process()
- if (DIRECTORY_SEPARATOR === '\\') {
- // tempnam() prefix is limited to first 3 chars.
- // @see http://php.net/manual/en/function.tempnam.php
- self::$directories[] = sys_get_temp_dir() . '\\PHP';
- }
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Iterator for test suites.
- *
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Util_TestSuiteIterator implements RecursiveIterator
- {
- /**
- * @var int
- */
- protected $position;
- /**
- * @var PHPUnit_Framework_Test[]
- */
- protected $tests;
- /**
- * @param PHPUnit_Framework_TestSuite $testSuite
- */
- public function __construct(PHPUnit_Framework_TestSuite $testSuite)
- {
- $this->tests = $testSuite->tests();
- }
- /**
- * Rewinds the Iterator to the first element.
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * Checks if there is a current element after calls to rewind() or next().
- *
- * @return bool
- */
- public function valid()
- {
- return $this->position < count($this->tests);
- }
- /**
- * Returns the key of the current element.
- *
- * @return int
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * Returns the current element.
- *
- * @return PHPUnit_Framework_Test
- */
- public function current()
- {
- return $this->valid() ? $this->tests[$this->position] : null;
- }
- /**
- * Moves forward to next element.
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * Returns the sub iterator for the current element.
- *
- * @return PHPUnit_Util_TestSuiteIterator
- */
- public function getChildren()
- {
- return new self(
- $this->tests[$this->position]
- );
- }
- /**
- * Checks whether the current element has children.
- *
- * @return bool
- */
- public function hasChildren()
- {
- return $this->tests[$this->position] instanceof PHPUnit_Framework_TestSuite;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for code filtering.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Util_Filter
- {
- /**
- * Filters stack frames from PHPUnit classes.
- *
- * @param Exception $e
- * @param bool $asString
- * @return string
- */
- public static function getFilteredStacktrace(Exception $e, $asString = true)
- {
- $prefix = false;
- $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']);
- if (defined('__PHPUNIT_PHAR_ROOT__')) {
- $prefix = __PHPUNIT_PHAR_ROOT__;
- }
- if ($asString === true) {
- $filteredStacktrace = '';
- } else {
- $filteredStacktrace = array();
- }
- if ($e instanceof PHPUnit_Framework_SyntheticError) {
- $eTrace = $e->getSyntheticTrace();
- $eFile = $e->getSyntheticFile();
- $eLine = $e->getSyntheticLine();
- } elseif ($e instanceof PHPUnit_Framework_Exception) {
- $eTrace = $e->getSerializableTrace();
- $eFile = $e->getFile();
- $eLine = $e->getLine();
- } else {
- if ($e->getPrevious()) {
- $e = $e->getPrevious();
- }
- $eTrace = $e->getTrace();
- $eFile = $e->getFile();
- $eLine = $e->getLine();
- }
- if (!self::frameExists($eTrace, $eFile, $eLine)) {
- array_unshift(
- $eTrace,
- array('file' => $eFile, 'line' => $eLine)
- );
- }
- $blacklist = new PHPUnit_Util_Blacklist;
- foreach ($eTrace as $frame) {
- if (isset($frame['file']) && is_file($frame['file']) &&
- !$blacklist->isBlacklisted($frame['file']) &&
- ($prefix === false || strpos($frame['file'], $prefix) !== 0) &&
- $frame['file'] !== $script) {
- if ($asString === true) {
- $filteredStacktrace .= sprintf(
- "%s:%s\n",
- $frame['file'],
- isset($frame['line']) ? $frame['line'] : '?'
- );
- } else {
- $filteredStacktrace[] = $frame;
- }
- }
- }
- return $filteredStacktrace;
- }
- /**
- * @param array $trace
- * @param string $file
- * @param int $line
- * @return bool
- * @since Method available since Release 3.3.2
- */
- private static function frameExists(array $trace, $file, $line)
- {
- foreach ($trace as $frame) {
- if (isset($frame['file']) && $frame['file'] == $file &&
- isset($frame['line']) && $frame['line'] == $line) {
- return true;
- }
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prints TestDox documentation in HTML format.
- *
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter
- {
- /**
- * @var bool
- */
- protected $printsHTML = true;
- /**
- * Handler for 'start run' event.
- */
- protected function startRun()
- {
- $this->write('<html><body>');
- }
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- $this->write(
- '<h2 id="' . $name . '">' . $this->currentTestClassPrettified .
- '</h2><ul>'
- );
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param bool $success
- */
- protected function onTest($name, $success = true)
- {
- if (!$success) {
- $strikeOpen = '<span style="text-decoration:line-through;">';
- $strikeClose = '</span>';
- } else {
- $strikeOpen = '';
- $strikeClose = '';
- }
- $this->write('<li>' . $strikeOpen . $name . $strikeClose . '</li>');
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- $this->write('</ul>');
- }
- /**
- * Handler for 'end run' event.
- */
- protected function endRun()
- {
- $this->write('</body></html>');
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prints TestDox documentation in text format.
- *
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_ResultPrinter_Text extends PHPUnit_Util_TestDox_ResultPrinter
- {
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- $this->write($this->currentTestClassPrettified . "\n");
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param bool $success
- */
- protected function onTest($name, $success = true)
- {
- if ($success) {
- $this->write(' [x] ');
- } else {
- $this->write(' [ ] ');
- }
- $this->write($name . "\n");
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- $this->write("\n");
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for printers of TestDox documentation.
- *
- * @since Class available since Release 2.1.0
- */
- abstract class PHPUnit_Util_TestDox_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var PHPUnit_Util_TestDox_NamePrettifier
- */
- protected $prettifier;
- /**
- * @var string
- */
- protected $testClass = '';
- /**
- * @var int
- */
- protected $testStatus = false;
- /**
- * @var array
- */
- protected $tests = array();
- /**
- * @var int
- */
- protected $successful = 0;
- /**
- * @var int
- */
- protected $failed = 0;
- /**
- * @var int
- */
- protected $risky = 0;
- /**
- * @var int
- */
- protected $skipped = 0;
- /**
- * @var int
- */
- protected $incomplete = 0;
- /**
- * @var string
- */
- protected $currentTestClassPrettified;
- /**
- * @var string
- */
- protected $currentTestMethodPrettified;
- /**
- * Constructor.
- *
- * @param resource $out
- */
- public function __construct($out = null)
- {
- parent::__construct($out);
- $this->prettifier = new PHPUnit_Util_TestDox_NamePrettifier;
- $this->startRun();
- }
- /**
- * Flush buffer and close output.
- */
- public function flush()
- {
- $this->doEndClass();
- $this->endRun();
- parent::flush();
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- $this->failed++;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->failed++;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
- $this->incomplete++;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_RISKY;
- $this->risky++;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
- $this->skipped++;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $class = get_class($test);
- if ($this->testClass != $class) {
- if ($this->testClass != '') {
- $this->doEndClass();
- }
- $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class);
- $this->startClass($class);
- $this->testClass = $class;
- $this->tests = array();
- }
- $prettified = false;
- $annotations = $test->getAnnotations();
- if (isset($annotations['method']['testdox'][0])) {
- $this->currentTestMethodPrettified = $annotations['method']['testdox'][0];
- $prettified = true;
- }
- if (!$prettified) {
- $this->currentTestMethodPrettified = $this->prettifier->prettifyTestMethod($test->getName(false));
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- if (!isset($this->tests[$this->currentTestMethodPrettified])) {
- if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $this->tests[$this->currentTestMethodPrettified]['success'] = 1;
- $this->tests[$this->currentTestMethodPrettified]['failure'] = 0;
- } else {
- $this->tests[$this->currentTestMethodPrettified]['success'] = 0;
- $this->tests[$this->currentTestMethodPrettified]['failure'] = 1;
- }
- } else {
- if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $this->tests[$this->currentTestMethodPrettified]['success']++;
- } else {
- $this->tests[$this->currentTestMethodPrettified]['failure']++;
- }
- }
- $this->currentTestClassPrettified = null;
- $this->currentTestMethodPrettified = null;
- }
- /**
- * @since Method available since Release 2.3.0
- */
- protected function doEndClass()
- {
- foreach ($this->tests as $name => $data) {
- $this->onTest($name, $data['failure'] == 0);
- }
- $this->endClass($this->testClass);
- }
- /**
- * Handler for 'start run' event.
- */
- protected function startRun()
- {
- }
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param bool $success
- */
- protected function onTest($name, $success = true)
- {
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- }
- /**
- * Handler for 'end run' event.
- */
- protected function endRun()
- {
- }
- private function isOfInterest(PHPUnit_Framework_Test $test)
- {
- return $test instanceof PHPUnit_Framework_TestCase && get_class($test) != 'PHPUnit_Framework_Warning';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prettifies class and method names for use in TestDox documentation.
- *
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_NamePrettifier
- {
- /**
- * @var string
- */
- protected $prefix = 'Test';
- /**
- * @var string
- */
- protected $suffix = 'Test';
- /**
- * @var array
- */
- protected $strings = array();
- /**
- * Prettifies the name of a test class.
- *
- * @param string $name
- * @return string
- */
- public function prettifyTestClass($name)
- {
- $title = $name;
- if ($this->suffix !== null &&
- $this->suffix == substr($name, -1 * strlen($this->suffix))) {
- $title = substr($title, 0, strripos($title, $this->suffix));
- }
- if ($this->prefix !== null &&
- $this->prefix == substr($name, 0, strlen($this->prefix))) {
- $title = substr($title, strlen($this->prefix));
- }
- if (substr($title, 0, 1) == '\\') {
- $title = substr($title, 1);
- }
- return $title;
- }
- /**
- * Prettifies the name of a test method.
- *
- * @param string $name
- * @return string
- */
- public function prettifyTestMethod($name)
- {
- $buffer = '';
- if (!is_string($name) || strlen($name) == 0) {
- return $buffer;
- }
- $string = preg_replace('#\d+$#', '', $name, -1, $count);
- if (in_array($string, $this->strings)) {
- $name = $string;
- } elseif ($count == 0) {
- $this->strings[] = $string;
- }
- if (strpos($name, '_') !== false) {
- return str_replace('_', ' ', $name);
- }
- $max = strlen($name);
- if (substr($name, 0, 4) == 'test') {
- $offset = 4;
- } else {
- $offset = 0;
- $name[0] = strtoupper($name[0]);
- }
- $wasNumeric = false;
- for ($i = $offset; $i < $max; $i++) {
- if ($i > $offset &&
- ord($name[$i]) >= 65 &&
- ord($name[$i]) <= 90) {
- $buffer .= ' ' . strtolower($name[$i]);
- } else {
- $isNumeric = is_numeric($name[$i]);
- if (!$wasNumeric && $isNumeric) {
- $buffer .= ' ';
- $wasNumeric = true;
- }
- if ($wasNumeric && !$isNumeric) {
- $wasNumeric = false;
- }
- $buffer .= $name[$i];
- }
- }
- return $buffer;
- }
- /**
- * Sets the prefix of test names.
- *
- * @param string $prefix
- */
- public function setPrefix($prefix)
- {
- $this->prefix = $prefix;
- }
- /**
- * Sets the suffix of test names.
- *
- * @param string $suffix
- */
- public function setSuffix($suffix)
- {
- $this->suffix = $suffix;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Error handler that converts PHP errors and warnings to exceptions.
- *
- * @since Class available since Release 4.2.0
- */
- class PHPUnit_Util_Regex
- {
- public static function pregMatchSafe($pattern, $subject, $matches = null, $flags = 0, $offset = 0)
- {
- $handler_terminator = PHPUnit_Util_ErrorHandler::handleErrorOnce(E_WARNING);
- $match = preg_match($pattern, $subject, $matches, $flags, $offset);
- $handler_terminator(); // cleaning
- return $match;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for textual type (and value) representation.
- *
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Type
- {
- public static function isType($type)
- {
- return in_array(
- $type,
- array(
- 'numeric',
- 'integer',
- 'int',
- 'float',
- 'string',
- 'boolean',
- 'bool',
- 'null',
- 'array',
- 'object',
- 'resource',
- 'scalar'
- )
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Default utility for PHP sub-processes.
- *
- * @since Class available since Release 3.5.12
- */
- class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP
- {
- /**
- * Runs a single job (PHP code) using a separate PHP process.
- *
- * @param string $job
- * @param array $settings
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- public function runJob($job, array $settings = array())
- {
- $runtime = new Runtime;
- $process = proc_open(
- $runtime->getBinary() . $this->settingsToParameters($settings),
- array(
- 0 => array('pipe', 'r'),
- 1 => array('pipe', 'w'),
- 2 => array('pipe', 'w')
- ),
- $pipes
- );
- if (!is_resource($process)) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to spawn worker process'
- );
- }
- $this->process($pipes[0], $job);
- fclose($pipes[0]);
- $stdout = stream_get_contents($pipes[1]);
- fclose($pipes[1]);
- $stderr = stream_get_contents($pipes[2]);
- fclose($pipes[2]);
- proc_close($process);
- $this->cleanup();
- return array('stdout' => $stdout, 'stderr' => $stderr);
- }
- /**
- * @param resource $pipe
- * @param string $job
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.12
- */
- protected function process($pipe, $job)
- {
- fwrite($pipe, $job);
- }
- /**
- * @since Method available since Release 3.5.12
- */
- protected function cleanup()
- {
- }
- }
- <?php
- if (!defined('STDOUT')) {
- // php://stdout does not obey output buffering. Any output would break
- // unserialization of child process results in the parent process.
- define('STDOUT', fopen('php://temp', 'w+b'));
- define('STDERR', fopen('php://stderr', 'wb'));
- }
- {iniSettings}
- ini_set('display_errors', 'stderr');
- set_include_path('{include_path}');
- $composerAutoload = {composerAutoload};
- $phar = {phar};
- ob_start();
- if ($composerAutoload) {
- require_once $composerAutoload;
- define('PHPUNIT_COMPOSER_INSTALL', $composerAutoload);
- } else if ($phar) {
- require $phar;
- }
- function __phpunit_run_isolated_test()
- {
- if (!class_exists('{className}')) {
- require_once '{filename}';
- }
- $result = new PHPUnit_Framework_TestResult;
- if ({collectCodeCoverageInformation}) {
- $result->setCodeCoverage(
- new PHP_CodeCoverage(
- null,
- unserialize('{codeCoverageFilter}')
- )
- );
- }
- $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything});
- $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests});
- $result->beStrictAboutTestSize({isStrictAboutTestSize});
- $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests});
- $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}');
- $test->setDependencyInput(unserialize('{dependencyInput}'));
- $test->setInIsolation(TRUE);
- ob_end_clean();
- $test->run($result);
- $output = '';
- if (!$test->hasExpectationOnOutput()) {
- $output = $test->getActualOutput();
- }
- rewind(STDOUT);
- if ($stdout = stream_get_contents(STDOUT)) {
- $output = $stdout . $output;
- }
- print serialize(
- array(
- 'testResult' => $test->getResult(),
- 'numAssertions' => $test->getNumAssertions(),
- 'result' => $result,
- 'output' => $output
- )
- );
- }
- {constants}
- {included_files}
- {globals}
- if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) {
- require_once $GLOBALS['__PHPUNIT_BOOTSTRAP'];
- unset($GLOBALS['__PHPUNIT_BOOTSTRAP']);
- }
- __phpunit_run_isolated_test();
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Windows utility for PHP sub-processes.
- *
- * @since Class available since Release 3.5.12
- */
- class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default
- {
- /**
- * @var string
- */
- private $tempFile;
- /**
- * {@inheritdoc}
- *
- * Reading from STDOUT or STDERR hangs forever on Windows if the output is
- * too large.
- *
- * @see https://bugs.php.net/bug.php?id=51800
- */
- public function runJob($job, array $settings = array())
- {
- $runtime = new Runtime;
- if (false === $stdout_handle = tmpfile()) {
- throw new PHPUnit_Framework_Exception(
- 'A temporary file could not be created; verify that your TEMP environment variable is writable'
- );
- }
- $process = proc_open(
- $runtime->getBinary() . $this->settingsToParameters($settings),
- array(
- 0 => array('pipe', 'r'),
- 1 => $stdout_handle,
- 2 => array('pipe', 'w')
- ),
- $pipes
- );
- if (!is_resource($process)) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to spawn worker process'
- );
- }
- $this->process($pipes[0], $job);
- fclose($pipes[0]);
- $stderr = stream_get_contents($pipes[2]);
- fclose($pipes[2]);
- proc_close($process);
- rewind($stdout_handle);
- $stdout = stream_get_contents($stdout_handle);
- fclose($stdout_handle);
- $this->cleanup();
- return array('stdout' => $stdout, 'stderr' => $stderr);
- }
- /**
- * @param resource $pipe
- * @param string $job
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.12
- */
- protected function process($pipe, $job)
- {
- if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) ||
- file_put_contents($this->tempFile, $job) === false) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to write temporary file'
- );
- }
- fwrite(
- $pipe,
- '<?php require_once ' . var_export($this->tempFile, true) . '; ?>'
- );
- }
- /**
- * @since Method available since Release 3.5.12
- */
- protected function cleanup()
- {
- unlink($this->tempFile);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods to load PHP sourcefiles.
- *
- * @since Class available since Release 2.3.0
- */
- class PHPUnit_Util_Fileloader
- {
- /**
- * Checks if a PHP sourcefile is readable.
- * The sourcefile is loaded through the load() method.
- *
- * @param string $filename
- * @return string
- * @throws PHPUnit_Framework_Exception
- */
- public static function checkAndLoad($filename)
- {
- $includePathFilename = stream_resolve_include_path($filename);
- if (!$includePathFilename || !is_readable($includePathFilename)) {
- throw new PHPUnit_Framework_Exception(
- sprintf('Cannot open file "%s".' . "\n", $filename)
- );
- }
- self::load($includePathFilename);
- return $includePathFilename;
- }
- /**
- * Loads a PHP sourcefile.
- *
- * @param string $filename
- * @return mixed
- * @since Method available since Release 3.0.0
- */
- public static function load($filename)
- {
- $oldVariableNames = array_keys(get_defined_vars());
- include_once $filename;
- $newVariables = get_defined_vars();
- $newVariableNames = array_diff(
- array_keys($newVariables),
- $oldVariableNames
- );
- foreach ($newVariableNames as $variableName) {
- if ($variableName != 'oldVariableNames') {
- $GLOBALS[$variableName] = $newVariables[$variableName];
- }
- }
- return $filename;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * XML helpers.
- *
- * @since Class available since Release 3.2.0
- */
- class PHPUnit_Util_XML
- {
- /**
- * Escapes a string for the use in XML documents
- * Any Unicode character is allowed, excluding the surrogate blocks, FFFE,
- * and FFFF (not even as character reference).
- * See http://www.w3.org/TR/xml/#charsets
- *
- * @param string $string
- * @return string
- * @since Method available since Release 3.4.6
- */
- public static function prepareString($string)
- {
- return preg_replace(
- '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/',
- '',
- htmlspecialchars(
- PHPUnit_Util_String::convertToUtf8($string),
- ENT_QUOTES,
- 'UTF-8'
- )
- );
- }
- /**
- * Loads an XML (or HTML) file into a DOMDocument object.
- *
- * @param string $filename
- * @param bool $isHtml
- * @param bool $xinclude
- * @param bool $strict
- * @return DOMDocument
- * @since Method available since Release 3.3.0
- */
- public static function loadFile($filename, $isHtml = false, $xinclude = false, $strict = false)
- {
- $reporting = error_reporting(0);
- $contents = file_get_contents($filename);
- error_reporting($reporting);
- if ($contents === false) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not read "%s".',
- $filename
- )
- );
- }
- return self::load($contents, $isHtml, $filename, $xinclude, $strict);
- }
- /**
- * Load an $actual document into a DOMDocument. This is called
- * from the selector assertions.
- *
- * If $actual is already a DOMDocument, it is returned with
- * no changes. Otherwise, $actual is loaded into a new DOMDocument
- * as either HTML or XML, depending on the value of $isHtml. If $isHtml is
- * false and $xinclude is true, xinclude is performed on the loaded
- * DOMDocument.
- *
- * Note: prior to PHPUnit 3.3.0, this method loaded a file and
- * not a string as it currently does. To load a file into a
- * DOMDocument, use loadFile() instead.
- *
- * @param string|DOMDocument $actual
- * @param bool $isHtml
- * @param string $filename
- * @param bool $xinclude
- * @param bool $strict
- * @return DOMDocument
- * @since Method available since Release 3.3.0
- */
- public static function load($actual, $isHtml = false, $filename = '', $xinclude = false, $strict = false)
- {
- if ($actual instanceof DOMDocument) {
- return $actual;
- }
- // Required for XInclude on Windows.
- if ($xinclude) {
- $cwd = getcwd();
- @chdir(dirname($filename));
- }
- $document = new DOMDocument;
- $internal = libxml_use_internal_errors(true);
- $message = '';
- $reporting = error_reporting(0);
- if ('' !== $filename) {
- // Necessary for xinclude
- $document->documentURI = $filename;
- }
- if ($isHtml) {
- $loaded = $document->loadHTML($actual);
- } else {
- $loaded = $document->loadXML($actual);
- }
- if (!$isHtml && $xinclude) {
- $document->xinclude();
- }
- foreach (libxml_get_errors() as $error) {
- $message .= "\n" . $error->message;
- }
- libxml_use_internal_errors($internal);
- error_reporting($reporting);
- if ($xinclude) {
- @chdir($cwd);
- }
- if ($loaded === false || ($strict && $message !== '')) {
- if ($filename !== '') {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not load "%s".%s',
- $filename,
- $message != '' ? "\n" . $message : ''
- )
- );
- } else {
- throw new PHPUnit_Framework_Exception($message);
- }
- }
- return $document;
- }
- /**
- * @param DOMNode $node
- * @return string
- * @since Method available since Release 3.4.0
- */
- public static function nodeToText(DOMNode $node)
- {
- if ($node->childNodes->length == 1) {
- return $node->nodeValue;
- }
- $result = '';
- foreach ($node->childNodes as $childNode) {
- $result .= $node->ownerDocument->saveXML($childNode);
- }
- return $result;
- }
- /**
- * @param DOMNode $node
- * @since Method available since Release 3.3.0
- */
- public static function removeCharacterDataNodes(DOMNode $node)
- {
- if ($node->hasChildNodes()) {
- for ($i = $node->childNodes->length - 1; $i >= 0; $i--) {
- if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) {
- $node->removeChild($child);
- }
- }
- }
- }
- /**
- * "Convert" a DOMElement object into a PHP variable.
- *
- * @param DOMElement $element
- * @return mixed
- * @since Method available since Release 3.4.0
- */
- public static function xmlToVariable(DOMElement $element)
- {
- $variable = null;
- switch ($element->tagName) {
- case 'array':
- $variable = array();
- foreach ($element->getElementsByTagName('element') as $element) {
- $value = self::xmlToVariable($element->childNodes->item(1));
- if ($element->hasAttribute('key')) {
- $variable[(string) $element->getAttribute('key')] = $value;
- } else {
- $variable[] = $value;
- }
- }
- break;
- case 'object':
- $className = $element->getAttribute('class');
- if ($element->hasChildNodes()) {
- $arguments = $element->childNodes->item(1)->childNodes;
- $constructorArgs = array();
- foreach ($arguments as $argument) {
- if ($argument instanceof DOMElement) {
- $constructorArgs[] = self::xmlToVariable($argument);
- }
- }
- $class = new ReflectionClass($className);
- $variable = $class->newInstanceArgs($constructorArgs);
- } else {
- $variable = new $className;
- }
- break;
- case 'boolean':
- $variable = $element->nodeValue == 'true' ? true : false;
- break;
- case 'integer':
- case 'double':
- case 'string':
- $variable = $element->nodeValue;
- settype($variable, $element->tagName);
- break;
- }
- return $variable;
- }
- /**
- * Validate list of keys in the associative array.
- *
- * @param array $hash
- * @param array $validKeys
- * @return array
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.3.0
- */
- public static function assertValidKeys(array $hash, array $validKeys)
- {
- $valids = array();
- // Normalize validation keys so that we can use both indexed and
- // associative arrays.
- foreach ($validKeys as $key => $val) {
- is_int($key) ? $valids[$val] = null : $valids[$key] = $val;
- }
- $validKeys = array_keys($valids);
- // Check for invalid keys.
- foreach ($hash as $key => $value) {
- if (!in_array($key, $validKeys)) {
- $unknown[] = $key;
- }
- }
- if (!empty($unknown)) {
- throw new PHPUnit_Framework_Exception(
- 'Unknown key(s): ' . implode(', ', $unknown)
- );
- }
- // Add default values for any valid keys that are empty.
- foreach ($valids as $key => $value) {
- if (!isset($hash[$key])) {
- $hash[$key] = $value;
- }
- }
- return $hash;
- }
- /**
- * Parse a CSS selector into an associative array suitable for
- * use with findNodes().
- *
- * @param string $selector
- * @param mixed $content
- * @return array
- * @since Method available since Release 3.3.0
- */
- public static function convertSelectToTag($selector, $content = true)
- {
- $selector = trim(preg_replace("/\s+/", ' ', $selector));
- // substitute spaces within attribute value
- while (preg_match('/\[[^\]]+"[^"]+\s[^"]+"\]/', $selector)) {
- $selector = preg_replace(
- '/(\[[^\]]+"[^"]+)\s([^"]+"\])/',
- '$1__SPACE__$2',
- $selector
- );
- }
- if (strstr($selector, ' ')) {
- $elements = explode(' ', $selector);
- } else {
- $elements = array($selector);
- }
- $previousTag = array();
- foreach (array_reverse($elements) as $element) {
- $element = str_replace('__SPACE__', ' ', $element);
- // child selector
- if ($element == '>') {
- $previousTag = array('child' => $previousTag['descendant']);
- continue;
- }
- // adjacent-sibling selector
- if ($element == '+') {
- $previousTag = array('adjacent-sibling' => $previousTag['descendant']);
- continue;
- }
- $tag = array();
- // match element tag
- preg_match("/^([^\.#\[]*)/", $element, $eltMatches);
- if (!empty($eltMatches[1])) {
- $tag['tag'] = $eltMatches[1];
- }
- // match attributes (\[[^\]]*\]*), ids (#[^\.#\[]*),
- // and classes (\.[^\.#\[]*))
- preg_match_all(
- "/(\[[^\]]*\]*|#[^\.#\[]*|\.[^\.#\[]*)/",
- $element,
- $matches
- );
- if (!empty($matches[1])) {
- $classes = array();
- $attrs = array();
- foreach ($matches[1] as $match) {
- // id matched
- if (substr($match, 0, 1) == '#') {
- $tag['id'] = substr($match, 1);
- } // class matched
- elseif (substr($match, 0, 1) == '.') {
- $classes[] = substr($match, 1);
- } // attribute matched
- elseif (substr($match, 0, 1) == '[' &&
- substr($match, -1, 1) == ']') {
- $attribute = substr($match, 1, strlen($match) - 2);
- $attribute = str_replace('"', '', $attribute);
- // match single word
- if (strstr($attribute, '~=')) {
- list($key, $value) = explode('~=', $attribute);
- $value = "regexp:/.*\b$value\b.*/";
- } // match substring
- elseif (strstr($attribute, '*=')) {
- list($key, $value) = explode('*=', $attribute);
- $value = "regexp:/.*$value.*/";
- } // exact match
- else {
- list($key, $value) = explode('=', $attribute);
- }
- $attrs[$key] = $value;
- }
- }
- if ($classes) {
- $tag['class'] = implode(' ', $classes);
- }
- if ($attrs) {
- $tag['attributes'] = $attrs;
- }
- }
- // tag content
- if (is_string($content)) {
- $tag['content'] = $content;
- }
- // determine previous child/descendants
- if (!empty($previousTag['descendant'])) {
- $tag['descendant'] = $previousTag['descendant'];
- } elseif (!empty($previousTag['child'])) {
- $tag['child'] = $previousTag['child'];
- } elseif (!empty($previousTag['adjacent-sibling'])) {
- $tag['adjacent-sibling'] = $previousTag['adjacent-sibling'];
- unset($tag['content']);
- }
- $previousTag = array('descendant' => $tag);
- }
- return $tag;
- }
- /**
- * Parse an $actual document and return an array of DOMNodes
- * matching the CSS $selector. If an error occurs, it will
- * return false.
- *
- * To only return nodes containing a certain content, give
- * the $content to match as a string. Otherwise, setting
- * $content to true will return all nodes matching $selector.
- *
- * The $actual document may be a DOMDocument or a string
- * containing XML or HTML, identified by $isHtml.
- *
- * @param array $selector
- * @param string $content
- * @param mixed $actual
- * @param bool $isHtml
- * @return bool|array
- * @since Method available since Release 3.3.0
- */
- public static function cssSelect($selector, $content, $actual, $isHtml = true)
- {
- $matcher = self::convertSelectToTag($selector, $content);
- $dom = self::load($actual, $isHtml);
- $tags = self::findNodes($dom, $matcher, $isHtml);
- return $tags;
- }
- /**
- * Parse out the options from the tag using DOM object tree.
- *
- * @param DOMDocument $dom
- * @param array $options
- * @param bool $isHtml
- * @return array
- * @since Method available since Release 3.3.0
- */
- public static function findNodes(DOMDocument $dom, array $options, $isHtml = true)
- {
- $valid = array(
- 'id', 'class', 'tag', 'content', 'attributes', 'parent',
- 'child', 'ancestor', 'descendant', 'children', 'adjacent-sibling'
- );
- $filtered = array();
- $options = self::assertValidKeys($options, $valid);
- // find the element by id
- if ($options['id']) {
- $options['attributes']['id'] = $options['id'];
- }
- if ($options['class']) {
- $options['attributes']['class'] = $options['class'];
- }
- // find the element by a tag type
- if ($options['tag']) {
- if ($isHtml) {
- $elements = self::getElementsByCaseInsensitiveTagName(
- $dom,
- $options['tag']
- );
- } else {
- $elements = $dom->getElementsByTagName($options['tag']);
- }
- foreach ($elements as $element) {
- $nodes[] = $element;
- }
- if (empty($nodes)) {
- return false;
- }
- } // no tag selected, get them all
- else {
- $tags = array(
- 'a', 'abbr', 'acronym', 'address', 'area', 'b', 'base', 'bdo',
- 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'cite',
- 'code', 'col', 'colgroup', 'dd', 'del', 'div', 'dfn', 'dl',
- 'dt', 'em', 'fieldset', 'form', 'frame', 'frameset', 'h1', 'h2',
- 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe',
- 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link',
- 'map', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup',
- 'option', 'p', 'param', 'pre', 'q', 'samp', 'script', 'select',
- 'small', 'span', 'strong', 'style', 'sub', 'sup', 'table',
- 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title',
- 'tr', 'tt', 'ul', 'var',
- // HTML5
- 'article', 'aside', 'audio', 'bdi', 'canvas', 'command',
- 'datalist', 'details', 'dialog', 'embed', 'figure', 'figcaption',
- 'footer', 'header', 'hgroup', 'keygen', 'mark', 'meter', 'nav',
- 'output', 'progress', 'ruby', 'rt', 'rp', 'track', 'section',
- 'source', 'summary', 'time', 'video', 'wbr'
- );
- foreach ($tags as $tag) {
- if ($isHtml) {
- $elements = self::getElementsByCaseInsensitiveTagName(
- $dom,
- $tag
- );
- } else {
- $elements = $dom->getElementsByTagName($tag);
- }
- foreach ($elements as $element) {
- $nodes[] = $element;
- }
- }
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by attributes
- if ($options['attributes']) {
- foreach ($nodes as $node) {
- $invalid = false;
- foreach ($options['attributes'] as $name => $value) {
- // match by regexp if like "regexp:/foo/i"
- if (preg_match('/^regexp\s*:\s*(.*)/i', $value, $matches)) {
- if (!preg_match($matches[1], $node->getAttribute($name))) {
- $invalid = true;
- }
- } // class can match only a part
- elseif ($name == 'class') {
- // split to individual classes
- $findClasses = explode(
- ' ',
- preg_replace("/\s+/", ' ', $value)
- );
- $allClasses = explode(
- ' ',
- preg_replace("/\s+/", ' ', $node->getAttribute($name))
- );
- // make sure each class given is in the actual node
- foreach ($findClasses as $findClass) {
- if (!in_array($findClass, $allClasses)) {
- $invalid = true;
- }
- }
- } // match by exact string
- else {
- if ($node->getAttribute($name) != $value) {
- $invalid = true;
- }
- }
- }
- // if every attribute given matched
- if (!$invalid) {
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by content
- if ($options['content'] !== null) {
- foreach ($nodes as $node) {
- $invalid = false;
- // match by regexp if like "regexp:/foo/i"
- if (preg_match('/^regexp\s*:\s*(.*)/i', $options['content'], $matches)) {
- if (!preg_match($matches[1], self::getNodeText($node))) {
- $invalid = true;
- }
- } // match empty string
- elseif ($options['content'] === '') {
- if (self::getNodeText($node) !== '') {
- $invalid = true;
- }
- } // match by exact string
- elseif (strstr(self::getNodeText($node), $options['content']) === false) {
- $invalid = true;
- }
- if (!$invalid) {
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by parent node
- if ($options['parent']) {
- $parentNodes = self::findNodes($dom, $options['parent'], $isHtml);
- $parentNode = isset($parentNodes[0]) ? $parentNodes[0] : null;
- foreach ($nodes as $node) {
- if ($parentNode !== $node->parentNode) {
- continue;
- }
- $filtered[] = $node;
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by child node
- if ($options['child']) {
- $childNodes = self::findNodes($dom, $options['child'], $isHtml);
- $childNodes = !empty($childNodes) ? $childNodes : array();
- foreach ($nodes as $node) {
- foreach ($node->childNodes as $child) {
- foreach ($childNodes as $childNode) {
- if ($childNode === $child) {
- $filtered[] = $node;
- }
- }
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by adjacent-sibling
- if ($options['adjacent-sibling']) {
- $adjacentSiblingNodes = self::findNodes($dom, $options['adjacent-sibling'], $isHtml);
- $adjacentSiblingNodes = !empty($adjacentSiblingNodes) ? $adjacentSiblingNodes : array();
- foreach ($nodes as $node) {
- $sibling = $node;
- while ($sibling = $sibling->nextSibling) {
- if ($sibling->nodeType !== XML_ELEMENT_NODE) {
- continue;
- }
- foreach ($adjacentSiblingNodes as $adjacentSiblingNode) {
- if ($sibling === $adjacentSiblingNode) {
- $filtered[] = $node;
- break;
- }
- }
- break;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by ancestor
- if ($options['ancestor']) {
- $ancestorNodes = self::findNodes($dom, $options['ancestor'], $isHtml);
- $ancestorNode = isset($ancestorNodes[0]) ? $ancestorNodes[0] : null;
- foreach ($nodes as $node) {
- $parent = $node->parentNode;
- while ($parent && $parent->nodeType != XML_HTML_DOCUMENT_NODE) {
- if ($parent === $ancestorNode) {
- $filtered[] = $node;
- }
- $parent = $parent->parentNode;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by descendant
- if ($options['descendant']) {
- $descendantNodes = self::findNodes($dom, $options['descendant'], $isHtml);
- $descendantNodes = !empty($descendantNodes) ? $descendantNodes : array();
- foreach ($nodes as $node) {
- foreach (self::getDescendants($node) as $descendant) {
- foreach ($descendantNodes as $descendantNode) {
- if ($descendantNode === $descendant) {
- $filtered[] = $node;
- }
- }
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by children
- if ($options['children']) {
- $validChild = array('count', 'greater_than', 'less_than', 'only');
- $childOptions = self::assertValidKeys(
- $options['children'],
- $validChild
- );
- foreach ($nodes as $node) {
- $childNodes = $node->childNodes;
- foreach ($childNodes as $childNode) {
- if ($childNode->nodeType !== XML_CDATA_SECTION_NODE &&
- $childNode->nodeType !== XML_TEXT_NODE) {
- $children[] = $childNode;
- }
- }
- // we must have children to pass this filter
- if (!empty($children)) {
- // exact count of children
- if ($childOptions['count'] !== null) {
- if (count($children) !== $childOptions['count']) {
- break;
- }
- } // range count of children
- elseif ($childOptions['less_than'] !== null &&
- $childOptions['greater_than'] !== null) {
- if (count($children) >= $childOptions['less_than'] ||
- count($children) <= $childOptions['greater_than']) {
- break;
- }
- } // less than a given count
- elseif ($childOptions['less_than'] !== null) {
- if (count($children) >= $childOptions['less_than']) {
- break;
- }
- } // more than a given count
- elseif ($childOptions['greater_than'] !== null) {
- if (count($children) <= $childOptions['greater_than']) {
- break;
- }
- }
- // match each child against a specific tag
- if ($childOptions['only']) {
- $onlyNodes = self::findNodes(
- $dom,
- $childOptions['only'],
- $isHtml
- );
- // try to match each child to one of the 'only' nodes
- foreach ($children as $child) {
- $matched = false;
- foreach ($onlyNodes as $onlyNode) {
- if ($onlyNode === $child) {
- $matched = true;
- }
- }
- if (!$matched) {
- break 2;
- }
- }
- }
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- if (empty($nodes)) {
- return;
- }
- }
- // return the first node that matches all criteria
- return !empty($nodes) ? $nodes : array();
- }
- /**
- * Recursively get flat array of all descendants of this node.
- *
- * @param DOMNode $node
- * @return array
- * @since Method available since Release 3.3.0
- */
- protected static function getDescendants(DOMNode $node)
- {
- $allChildren = array();
- $childNodes = $node->childNodes ? $node->childNodes : array();
- foreach ($childNodes as $child) {
- if ($child->nodeType === XML_CDATA_SECTION_NODE ||
- $child->nodeType === XML_TEXT_NODE) {
- continue;
- }
- $children = self::getDescendants($child);
- $allChildren = array_merge($allChildren, $children, array($child));
- }
- return isset($allChildren) ? $allChildren : array();
- }
- /**
- * Gets elements by case insensitive tagname.
- *
- * @param DOMDocument $dom
- * @param string $tag
- * @return DOMNodeList
- * @since Method available since Release 3.4.0
- */
- protected static function getElementsByCaseInsensitiveTagName(DOMDocument $dom, $tag)
- {
- $elements = $dom->getElementsByTagName(strtolower($tag));
- if ($elements->length == 0) {
- $elements = $dom->getElementsByTagName(strtoupper($tag));
- }
- return $elements;
- }
- /**
- * Get the text value of this node's child text node.
- *
- * @param DOMNode $node
- * @return string
- * @since Method available since Release 3.3.0
- */
- protected static function getNodeText(DOMNode $node)
- {
- if (!$node->childNodes instanceof DOMNodeList) {
- return '';
- }
- $result = '';
- foreach ($node->childNodes as $childNode) {
- if ($childNode->nodeType === XML_TEXT_NODE ||
- $childNode->nodeType === XML_CDATA_SECTION_NODE) {
- $result .= trim($childNode->data) . ' ';
- } else {
- $result .= self::getNodeText($childNode);
- }
- }
- return str_replace(' ', ' ', $result);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods for PHP sub-processes.
- *
- * @since Class available since Release 3.4.0
- */
- abstract class PHPUnit_Util_PHP
- {
- /**
- * @return PHPUnit_Util_PHP
- * @since Method available since Release 3.5.12
- */
- public static function factory()
- {
- if (DIRECTORY_SEPARATOR == '\\') {
- return new PHPUnit_Util_PHP_Windows;
- }
- return new PHPUnit_Util_PHP_Default;
- }
- /**
- * Runs a single test in a separate PHP process.
- *
- * @param string $job
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- * @throws PHPUnit_Framework_Exception
- */
- public function runTestJob($job, PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result)
- {
- $result->startTest($test);
- $_result = $this->runJob($job);
- $this->processChildResult(
- $test,
- $result,
- $_result['stdout'],
- $_result['stderr']
- );
- }
- /**
- * Runs a single job (PHP code) using a separate PHP process.
- *
- * @param string $job
- * @param array $settings
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- abstract public function runJob($job, array $settings = array());
- /**
- * @param array $settings
- * @return string
- * @since Method available since Release 4.0.0
- */
- protected function settingsToParameters(array $settings)
- {
- $buffer = '';
- foreach ($settings as $setting) {
- $buffer .= ' -d ' . $setting;
- }
- return $buffer;
- }
- /**
- * Processes the TestResult object from an isolated process.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- * @param string $stdout
- * @param string $stderr
- * @since Method available since Release 3.5.0
- */
- private function processChildResult(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result, $stdout, $stderr)
- {
- $time = 0;
- if (!empty($stderr)) {
- $result->addError(
- $test,
- new PHPUnit_Framework_Exception(trim($stderr)),
- $time
- );
- } else {
- set_error_handler(function ($errno, $errstr, $errfile, $errline) {
- throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);
- });
- try {
- if (strpos($stdout, "#!/usr/bin/env php\n") === 0) {
- $stdout = substr($stdout, 19);
- }
- $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout));
- restore_error_handler();
- } catch (ErrorException $e) {
- restore_error_handler();
- $childResult = false;
- $result->addError(
- $test,
- new PHPUnit_Framework_Exception(trim($stdout), 0, $e),
- $time
- );
- }
- if ($childResult !== false) {
- if (!empty($childResult['output'])) {
- $output = $childResult['output'];
- }
- $test->setResult($childResult['testResult']);
- $test->addToAssertionCount($childResult['numAssertions']);
- $childResult = $childResult['result'];
- if ($result->getCollectCodeCoverageInformation()) {
- $result->getCodeCoverage()->merge(
- $childResult->getCodeCoverage()
- );
- }
- $time = $childResult->time();
- $notImplemented = $childResult->notImplemented();
- $risky = $childResult->risky();
- $skipped = $childResult->skipped();
- $errors = $childResult->errors();
- $failures = $childResult->failures();
- if (!empty($notImplemented)) {
- $result->addError(
- $test,
- $this->getException($notImplemented[0]),
- $time
- );
- } elseif (!empty($risky)) {
- $result->addError(
- $test,
- $this->getException($risky[0]),
- $time
- );
- } elseif (!empty($skipped)) {
- $result->addError(
- $test,
- $this->getException($skipped[0]),
- $time
- );
- } elseif (!empty($errors)) {
- $result->addError(
- $test,
- $this->getException($errors[0]),
- $time
- );
- } elseif (!empty($failures)) {
- $result->addFailure(
- $test,
- $this->getException($failures[0]),
- $time
- );
- }
- }
- }
- $result->endTest($test, $time);
- if (!empty($output)) {
- print $output;
- }
- }
- /**
- * Gets the thrown exception from a PHPUnit_Framework_TestFailure.
- *
- * @param PHPUnit_Framework_TestFailure $error
- * @return Exception
- * @since Method available since Release 3.6.0
- * @see https://github.com/sebastianbergmann/phpunit/issues/74
- */
- private function getException(PHPUnit_Framework_TestFailure $error)
- {
- $exception = $error->thrownException();
- if ($exception instanceof __PHP_Incomplete_Class) {
- $exceptionArray = array();
- foreach ((array) $exception as $key => $value) {
- $key = substr($key, strrpos($key, "\0") + 1);
- $exceptionArray[$key] = $value;
- }
- $exception = new PHPUnit_Framework_SyntheticError(
- sprintf(
- '%s: %s',
- $exceptionArray['_PHP_Incomplete_Class_Name'],
- $exceptionArray['message']
- ),
- $exceptionArray['code'],
- $exceptionArray['file'],
- $exceptionArray['line'],
- $exceptionArray['trace']
- );
- }
- return $exception;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Exception extends RuntimeException implements PHPUnit_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Test extends RecursiveFilterIterator
- {
- /**
- * @var string
- */
- protected $filter = null;
- /**
- * @var int
- */
- protected $filterMin;
- /**
- * @var int
- */
- protected $filterMax;
- /**
- * @param RecursiveIterator $iterator
- * @param string $filter
- */
- public function __construct(RecursiveIterator $iterator, $filter)
- {
- parent::__construct($iterator);
- $this->setFilter($filter);
- }
- /**
- * @param string $filter
- */
- protected function setFilter($filter)
- {
- if (PHPUnit_Util_Regex::pregMatchSafe($filter, '') === false) {
- // Handles:
- // * testAssertEqualsSucceeds#4
- // * testAssertEqualsSucceeds#4-8
- if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) {
- if (isset($matches[3]) && $matches[2] < $matches[3]) {
- $filter = sprintf(
- '%s.*with data set #(\d+)$',
- $matches[1]
- );
- $this->filterMin = $matches[2];
- $this->filterMax = $matches[3];
- } else {
- $filter = sprintf(
- '%s.*with data set #%s$',
- $matches[1],
- $matches[2]
- );
- }
- } // Handles:
- // * testDetermineJsonError@JSON_ERROR_NONE
- // * testDetermineJsonError@JSON.*
- elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) {
- $filter = sprintf(
- '%s.*with data set "%s"$',
- $matches[1],
- $matches[2]
- );
- }
- // Escape delimiters in regular expression. Do NOT use preg_quote,
- // to keep magic characters.
- $filter = sprintf('/%s/', str_replace(
- '/',
- '\\/',
- $filter
- ));
- }
- $this->filter = $filter;
- }
- /**
- * @return bool
- */
- public function accept()
- {
- $test = $this->getInnerIterator()->current();
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- return true;
- }
- $tmp = PHPUnit_Util_Test::describe($test, false);
- if ($tmp[0] != '') {
- $name = implode('::', $tmp);
- } else {
- $name = $tmp[1];
- }
- $accepted = preg_match($this->filter, $name, $matches);
- if ($accepted && isset($this->filterMax)) {
- $set = end($matches);
- $accepted = $set >= $this->filterMin && $set <= $this->filterMax;
- }
- return $accepted;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Group_Exclude extends PHPUnit_Runner_Filter_GroupFilterIterator
- {
- protected function doAccept($hash)
- {
- return !in_array($hash, $this->groupTests);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Group_Include extends PHPUnit_Runner_Filter_GroupFilterIterator
- {
- protected function doAccept($hash)
- {
- return in_array($hash, $this->groupTests);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Factory
- {
- /**
- * @var array
- */
- private $filters = array();
- /**
- * @param ReflectionClass $filter
- * @param mixed $args
- */
- public function addFilter(ReflectionClass $filter, $args)
- {
- if (!$filter->isSubclassOf('RecursiveFilterIterator')) {
- throw new InvalidArgumentException(
- sprintf(
- 'Class "%s" does not extend RecursiveFilterIterator',
- $filter->name
- )
- );
- }
- $this->filters[] = array($filter, $args);
- }
- /**
- * @return FilterIterator
- */
- public function factory(Iterator $iterator, PHPUnit_Framework_TestSuite $suite)
- {
- foreach ($this->filters as $filter) {
- list($class, $args) = $filter;
- $iterator = $class->newInstance($iterator, $args, $suite);
- }
- return $iterator;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @since Class available since Release 4.0.0
- */
- abstract class PHPUnit_Runner_Filter_GroupFilterIterator extends RecursiveFilterIterator
- {
- /**
- * @var array
- */
- protected $groupTests = array();
- /**
- * @param RecursiveIterator $iterator
- * @param array $groups
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function __construct(RecursiveIterator $iterator, array $groups, PHPUnit_Framework_TestSuite $suite)
- {
- parent::__construct($iterator);
- foreach ($suite->getGroupDetails() as $group => $tests) {
- if (in_array($group, $groups)) {
- $testHashes = array_map(
- function ($test) {
- return spl_object_hash($test);
- },
- $tests
- );
- $this->groupTests = array_merge($this->groupTests, $testHashes);
- }
- }
- }
- /**
- * @return bool
- */
- public function accept()
- {
- $test = $this->getInnerIterator()->current();
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- return true;
- }
- return $this->doAccept(spl_object_hash($test));
- }
- abstract protected function doAccept($hash);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface to define how a test suite should be loaded.
- *
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Runner_TestSuiteLoader
- {
- /**
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- */
- public function load($suiteClassName, $suiteClassFile = '');
- /**
- * @param ReflectionClass $aClass
- * @return ReflectionClass
- */
- public function reload(ReflectionClass $aClass);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for all test runners.
- *
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Runner_BaseTestRunner
- {
- const STATUS_PASSED = 0;
- const STATUS_SKIPPED = 1;
- const STATUS_INCOMPLETE = 2;
- const STATUS_FAILURE = 3;
- const STATUS_ERROR = 4;
- const STATUS_RISKY = 5;
- const SUITE_METHODNAME = 'suite';
- /**
- * Returns the loader to be used.
- *
- * @return PHPUnit_Runner_TestSuiteLoader
- */
- public function getLoader()
- {
- return new PHPUnit_Runner_StandardTestSuiteLoader;
- }
- /**
- * Returns the Test corresponding to the given suite.
- * This is a template method, subclasses override
- * the runFailed() and clearStatus() methods.
- *
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @param mixed $suffixes
- * @return PHPUnit_Framework_Test
- */
- public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '')
- {
- if (is_dir($suiteClassName) &&
- !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray(
- $suiteClassName,
- $suffixes
- );
- $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
- $suite->addTestFiles($files);
- return $suite;
- }
- try {
- $testClass = $this->loadSuiteClass(
- $suiteClassName,
- $suiteClassFile
- );
- } catch (PHPUnit_Framework_Exception $e) {
- $this->runFailed($e->getMessage());
- return;
- }
- try {
- $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
- if (!$suiteMethod->isStatic()) {
- $this->runFailed(
- 'suite() method must be static.'
- );
- return;
- }
- try {
- $test = $suiteMethod->invoke(null, $testClass->getName());
- } catch (ReflectionException $e) {
- $this->runFailed(
- sprintf(
- "Failed to invoke suite() method.\n%s",
- $e->getMessage()
- )
- );
- return;
- }
- } catch (ReflectionException $e) {
- try {
- $test = new PHPUnit_Framework_TestSuite($testClass);
- } catch (PHPUnit_Framework_Exception $e) {
- $test = new PHPUnit_Framework_TestSuite;
- $test->setName($suiteClassName);
- }
- }
- $this->clearStatus();
- return $test;
- }
- /**
- * Returns the loaded ReflectionClass for a suite name.
- *
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- */
- protected function loadSuiteClass($suiteClassName, $suiteClassFile = '')
- {
- $loader = $this->getLoader();
- return $loader->load($suiteClassName, $suiteClassFile);
- }
- /**
- * Clears the status message.
- */
- protected function clearStatus()
- {
- }
- /**
- * Override to define how to handle a failed loading of
- * a test suite.
- *
- * @param string $message
- */
- abstract protected function runFailed($message);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The standard test suite loader.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Runner_StandardTestSuiteLoader implements PHPUnit_Runner_TestSuiteLoader
- {
- /**
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- * @throws PHPUnit_Framework_Exception
- */
- public function load($suiteClassName, $suiteClassFile = '')
- {
- $suiteClassName = str_replace('.php', '', $suiteClassName);
- if (empty($suiteClassFile)) {
- $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $suiteClassName
- );
- }
- if (!class_exists($suiteClassName, false)) {
- $loadedClasses = get_declared_classes();
- $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile);
- $loadedClasses = array_values(
- array_diff(get_declared_classes(), $loadedClasses)
- );
- }
- if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) {
- $offset = 0 - strlen($suiteClassName);
- foreach ($loadedClasses as $loadedClass) {
- $class = new ReflectionClass($loadedClass);
- if (substr($loadedClass, $offset) === $suiteClassName &&
- $class->getFileName() == $filename) {
- $suiteClassName = $loadedClass;
- break;
- }
- }
- }
- if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) {
- $testCaseClass = 'PHPUnit_Framework_TestCase';
- foreach ($loadedClasses as $loadedClass) {
- $class = new ReflectionClass($loadedClass);
- $classFile = $class->getFileName();
- if ($class->isSubclassOf($testCaseClass) &&
- !$class->isAbstract()) {
- $suiteClassName = $loadedClass;
- $testCaseClass = $loadedClass;
- if ($classFile == realpath($suiteClassFile)) {
- break;
- }
- }
- if ($class->hasMethod('suite')) {
- $method = $class->getMethod('suite');
- if (!$method->isAbstract() &&
- $method->isPublic() &&
- $method->isStatic()) {
- $suiteClassName = $loadedClass;
- if ($classFile == realpath($suiteClassFile)) {
- break;
- }
- }
- }
- }
- }
- if (class_exists($suiteClassName, false)) {
- $class = new ReflectionClass($suiteClassName);
- if ($class->getFileName() == realpath($suiteClassFile)) {
- return $class;
- }
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- "Class '%s' could not be found in '%s'.",
- $suiteClassName,
- $suiteClassFile
- )
- );
- }
- /**
- * @param ReflectionClass $aClass
- * @return ReflectionClass
- */
- public function reload(ReflectionClass $aClass)
- {
- return $aClass;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class defines the current version of PHPUnit.
- *
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Runner_Version
- {
- private static $pharVersion = "4.7.7";
- private static $version;
- /**
- * Returns the current version of PHPUnit.
- *
- * @return string
- */
- public static function id()
- {
- if (self::$pharVersion !== null) {
- return self::$pharVersion;
- }
- if (self::$version === null) {
- $version = new SebastianBergmann\Version('4.7.7', dirname(dirname(__DIR__)));
- self::$version = $version->getVersion();
- }
- return self::$version;
- }
- /**
- * @return string
- */
- public static function getVersionString()
- {
- return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.';
- }
- /**
- * @return string
- * @since Method available since Release 4.0.0
- */
- public static function getReleaseChannel()
- {
- if (strpos(self::$pharVersion, 'alpha') !== false) {
- return '-alpha';
- }
- if (strpos(self::$pharVersion, 'beta') !== false) {
- return '-beta';
- }
- return '';
- }
- }
- Environment
- Copyright (c) 2014-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Environment package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Environment;
- /**
- * Utility class for HHVM/PHP environment handling.
- *
- * @package Environment
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/environment
- */
- class Runtime
- {
- /**
- * @var string
- */
- private static $binary;
- /**
- * Returns true when the runtime used is HHVM or
- * the runtime used is PHP + Xdebug.
- *
- * @return boolean
- */
- public function canCollectCodeCoverage()
- {
- return $this->isHHVM() || $this->hasXdebug();
- }
- /**
- * Returns the path to the binary of the current runtime.
- * Appends ' --php' to the path when the runtime is HHVM.
- *
- * @return string
- */
- public function getBinary()
- {
- // HHVM
- if (self::$binary === null && $this->isHHVM()) {
- if ((self::$binary = getenv('PHP_BINARY')) === false) {
- self::$binary = PHP_BINARY;
- }
- self::$binary = escapeshellarg(self::$binary) . ' --php';
- }
- // PHP >= 5.4.0
- if (self::$binary === null && defined('PHP_BINARY')) {
- self::$binary = escapeshellarg(PHP_BINARY);
- }
- // PHP < 5.4.0
- if (self::$binary === null) {
- if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) {
- if (strpos($_SERVER['_'], 'phpunit') !== false) {
- $file = file($_SERVER['_']);
- if (strpos($file[0], ' ') !== false) {
- $tmp = explode(' ', $file[0]);
- self::$binary = escapeshellarg(trim($tmp[1]));
- } else {
- self::$binary = escapeshellarg(ltrim(trim($file[0]), '#!'));
- }
- } elseif (strpos(basename($_SERVER['_']), 'php') !== false) {
- self::$binary = escapeshellarg($_SERVER['_']);
- }
- }
- }
- if (self::$binary === null) {
- $possibleBinaryLocations = array(
- PHP_BINDIR . '/php',
- PHP_BINDIR . '/php-cli.exe',
- PHP_BINDIR . '/php.exe'
- );
- foreach ($possibleBinaryLocations as $binary) {
- if (is_readable($binary)) {
- self::$binary = escapeshellarg($binary);
- break;
- }
- }
- }
- if (self::$binary === null) {
- self::$binary = 'php';
- }
- return self::$binary;
- }
- /**
- * @return string
- */
- public function getNameWithVersion()
- {
- return $this->getName() . ' ' . $this->getVersion();
- }
- /**
- * @return string
- */
- public function getName()
- {
- if ($this->isHHVM()) {
- return 'HHVM';
- } else {
- return 'PHP';
- }
- }
- /**
- * @return string
- */
- public function getVendorUrl()
- {
- if ($this->isHHVM()) {
- return 'http://hhvm.com/';
- } else {
- return 'http://php.net/';
- }
- }
- /**
- * @return string
- */
- public function getVersion()
- {
- if ($this->isHHVM()) {
- return HHVM_VERSION;
- } else {
- return PHP_VERSION;
- }
- }
- /**
- * Returns true when the runtime used is PHP and Xdebug is loaded.
- *
- * @return boolean
- */
- public function hasXdebug()
- {
- return $this->isPHP() && extension_loaded('xdebug');
- }
- /**
- * Returns true when the runtime used is HHVM.
- *
- * @return boolean
- */
- public function isHHVM()
- {
- return defined('HHVM_VERSION');
- }
- /**
- * Returns true when the runtime used is PHP.
- *
- * @return boolean
- */
- public function isPHP()
- {
- return !$this->isHHVM();
- }
- }
- <?php
- /*
- * This file is part of the Environment package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Environment;
- /**
- * @package Environment
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/environment
- */
- class Console
- {
- const STDIN = 0;
- const STDOUT = 1;
- const STDERR = 2;
- /**
- * Returns true if STDOUT supports colorization.
- *
- * This code has been copied and adapted from
- * Symfony\Component\Console\Output\OutputStream.
- *
- * @return boolean
- */
- public function hasColorSupport()
- {
- if (DIRECTORY_SEPARATOR == '\\') {
- return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
- }
- if (!defined('STDOUT')) {
- return false;
- }
- return $this->isInteractive(STDOUT);
- }
- /**
- * Returns the number of columns of the terminal.
- *
- * @return integer
- */
- public function getNumberOfColumns()
- {
- // Windows terminals have a fixed size of 80
- // but one column is used for the cursor.
- if (DIRECTORY_SEPARATOR == '\\') {
- return 79;
- }
- if (!$this->isInteractive(self::STDIN)) {
- return 80;
- }
- if (preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) {
- return (int) $match[1];
- }
- if (preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) {
- return (int) $match[1];
- }
- return 80;
- }
- /**
- * Returns if the file descriptor is an interactive terminal or not.
- *
- * @param int|resource $fileDescriptor
- *
- * @return boolean
- */
- public function isInteractive($fileDescriptor = self::STDOUT)
- {
- return function_exists('posix_isatty') && @posix_isatty($fileDescriptor);
- }
- }
- The MIT License (MIT)
- Copyright (c) 2010 Mike van Riel
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection;
- use phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Context;
- use phpDocumentor\Reflection\DocBlock\Location;
- /**
- * Parses the DocBlock for any structure.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class DocBlock implements \Reflector
- {
- /** @var string The opening line for this docblock. */
- protected $short_description = '';
- /**
- * @var DocBlock\Description The actual
- * description for this docblock.
- */
- protected $long_description = null;
- /**
- * @var Tag[] An array containing all
- * the tags in this docblock; except inline.
- */
- protected $tags = array();
- /** @var Context Information about the context of this DocBlock. */
- protected $context = null;
- /** @var Location Information about the location of this DocBlock. */
- protected $location = null;
- /** @var bool Is this DocBlock (the start of) a template? */
- protected $isTemplateStart = false;
- /** @var bool Does this DocBlock signify the end of a DocBlock template? */
- protected $isTemplateEnd = false;
- /**
- * Parses the given docblock and populates the member fields.
- *
- * The constructor may also receive namespace information such as the
- * current namespace and aliases. This information is used by some tags
- * (e.g. @return, @param, etc.) to turn a relative Type into a FQCN.
- *
- * @param \Reflector|string $docblock A docblock comment (including
- * asterisks) or reflector supporting the getDocComment method.
- * @param Context $context The context in which the DocBlock
- * occurs.
- * @param Location $location The location within the file that this
- * DocBlock occurs in.
- *
- * @throws \InvalidArgumentException if the given argument does not have the
- * getDocComment method.
- */
- public function __construct(
- $docblock,
- Context $context = null,
- Location $location = null
- ) {
- if (is_object($docblock)) {
- if (!method_exists($docblock, 'getDocComment')) {
- throw new \InvalidArgumentException(
- 'Invalid object passed; the given reflector must support '
- . 'the getDocComment method'
- );
- }
- $docblock = $docblock->getDocComment();
- }
- $docblock = $this->cleanInput($docblock);
- list($templateMarker, $short, $long, $tags) = $this->splitDocBlock($docblock);
- $this->isTemplateStart = $templateMarker === '#@+';
- $this->isTemplateEnd = $templateMarker === '#@-';
- $this->short_description = $short;
- $this->long_description = new DocBlock\Description($long, $this);
- $this->parseTags($tags);
- $this->context = $context;
- $this->location = $location;
- }
- /**
- * Strips the asterisks from the DocBlock comment.
- *
- * @param string $comment String containing the comment text.
- *
- * @return string
- */
- protected function cleanInput($comment)
- {
- $comment = trim(
- preg_replace(
- '#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u',
- '$1',
- $comment
- )
- );
- // reg ex above is not able to remove */ from a single line docblock
- if (substr($comment, -2) == '*/') {
- $comment = trim(substr($comment, 0, -2));
- }
- // normalize strings
- $comment = str_replace(array("\r\n", "\r"), "\n", $comment);
- return $comment;
- }
- /**
- * Splits the DocBlock into a template marker, summary, description and block of tags.
- *
- * @param string $comment Comment to split into the sub-parts.
- *
- * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split.
- * @author Mike van Riel <me@mikevanriel.com> for extending the regex with template marker support.
- *
- * @return string[] containing the template marker (if any), summary, description and a string containing the tags.
- */
- protected function splitDocBlock($comment)
- {
- // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This
- // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the
- // performance impact of running a regular expression
- if (strpos($comment, '@') === 0) {
- return array('', '', '', $comment);
- }
- // clears all extra horizontal whitespace from the line endings to prevent parsing issues
- $comment = preg_replace('/\h*$/Sum', '', $comment);
- /*
- * Splits the docblock into a template marker, short description, long description and tags section
- *
- * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may
- * occur after it and will be stripped).
- * - The short description is started from the first character until a dot is encountered followed by a
- * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing
- * errors). This is optional.
- * - The long description, any character until a new line is encountered followed by an @ and word
- * characters (a tag). This is optional.
- * - Tags; the remaining characters
- *
- * Big thanks to RichardJ for contributing this Regular Expression
- */
- preg_match(
- '/
- \A
- # 1. Extract the template marker
- (?:(\#\@\+|\#\@\-)\n?)?
- # 2. Extract the summary
- (?:
- (?! @\pL ) # The summary may not start with an @
- (
- [^\n.]+
- (?:
- (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines
- [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line
- [^\n.]+ # Include anything else
- )*
- \.?
- )?
- )
- # 3. Extract the description
- (?:
- \s* # Some form of whitespace _must_ precede a description because a summary must be there
- (?! @\pL ) # The description may not start with an @
- (
- [^\n]+
- (?: \n+
- (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line
- [^\n]+ # Include anything else
- )*
- )
- )?
- # 4. Extract the tags (anything that follows)
- (\s+ [\s\S]*)? # everything that follows
- /ux',
- $comment,
- $matches
- );
- array_shift($matches);
- while (count($matches) < 4) {
- $matches[] = '';
- }
- return $matches;
- }
- /**
- * Creates the tag objects.
- *
- * @param string $tags Tag block to parse.
- *
- * @return void
- */
- protected function parseTags($tags)
- {
- $result = array();
- $tags = trim($tags);
- if ('' !== $tags) {
- if ('@' !== $tags[0]) {
- throw new \LogicException(
- 'A tag block started with text instead of an actual tag,'
- . ' this makes the tag block invalid: ' . $tags
- );
- }
- foreach (explode("\n", $tags) as $tag_line) {
- if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
- $result[] = $tag_line;
- } else {
- $result[count($result) - 1] .= "\n" . $tag_line;
- }
- }
- // create proper Tag objects
- foreach ($result as $key => $tag_line) {
- $result[$key] = Tag::createInstance(trim($tag_line), $this);
- }
- }
- $this->tags = $result;
- }
- /**
- * Gets the text portion of the doc block.
- *
- * Gets the text portion (short and long description combined) of the doc
- * block.
- *
- * @return string The text portion of the doc block.
- */
- public function getText()
- {
- $short = $this->getShortDescription();
- $long = $this->getLongDescription()->getContents();
- if ($long) {
- return "{$short}\n\n{$long}";
- } else {
- return $short;
- }
- }
- /**
- * Set the text portion of the doc block.
- *
- * Sets the text portion (short and long description combined) of the doc
- * block.
- *
- * @param string $docblock The new text portion of the doc block.
- *
- * @return $this This doc block.
- */
- public function setText($comment)
- {
- list(,$short, $long) = $this->splitDocBlock($comment);
- $this->short_description = $short;
- $this->long_description = new DocBlock\Description($long, $this);
- return $this;
- }
- /**
- * Returns the opening line or also known as short description.
- *
- * @return string
- */
- public function getShortDescription()
- {
- return $this->short_description;
- }
- /**
- * Returns the full description or also known as long description.
- *
- * @return DocBlock\Description
- */
- public function getLongDescription()
- {
- return $this->long_description;
- }
- /**
- * Returns whether this DocBlock is the start of a Template section.
- *
- * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker
- * (`#@+`) that is appended directly after the opening `/**` of a DocBlock.
- *
- * An example of such an opening is:
- *
- * ```
- * /**#@+
- * * My DocBlock
- * * /
- * ```
- *
- * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all
- * elements that follow until another DocBlock is found that contains the closing marker (`#@-`).
- *
- * @see self::isTemplateEnd() for the check whether a closing marker was provided.
- *
- * @return boolean
- */
- public function isTemplateStart()
- {
- return $this->isTemplateStart;
- }
- /**
- * Returns whether this DocBlock is the end of a Template section.
- *
- * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality.
- *
- * @return boolean
- */
- public function isTemplateEnd()
- {
- return $this->isTemplateEnd;
- }
- /**
- * Returns the current context.
- *
- * @return Context
- */
- public function getContext()
- {
- return $this->context;
- }
- /**
- * Returns the current location.
- *
- * @return Location
- */
- public function getLocation()
- {
- return $this->location;
- }
- /**
- * Returns the tags for this DocBlock.
- *
- * @return Tag[]
- */
- public function getTags()
- {
- return $this->tags;
- }
- /**
- * Returns an array of tags matching the given name. If no tags are found
- * an empty array is returned.
- *
- * @param string $name String to search by.
- *
- * @return Tag[]
- */
- public function getTagsByName($name)
- {
- $result = array();
- /** @var Tag $tag */
- foreach ($this->getTags() as $tag) {
- if ($tag->getName() != $name) {
- continue;
- }
- $result[] = $tag;
- }
- return $result;
- }
- /**
- * Checks if a tag of a certain type is present in this DocBlock.
- *
- * @param string $name Tag name to check for.
- *
- * @return bool
- */
- public function hasTag($name)
- {
- /** @var Tag $tag */
- foreach ($this->getTags() as $tag) {
- if ($tag->getName() == $name) {
- return true;
- }
- }
- return false;
- }
- /**
- * Appends a tag at the end of the list of tags.
- *
- * @param Tag $tag The tag to add.
- *
- * @return Tag The newly added tag.
- *
- * @throws \LogicException When the tag belongs to a different DocBlock.
- */
- public function appendTag(Tag $tag)
- {
- if (null === $tag->getDocBlock()) {
- $tag->setDocBlock($this);
- }
- if ($tag->getDocBlock() === $this) {
- $this->tags[] = $tag;
- } else {
- throw new \LogicException(
- 'This tag belongs to a different DocBlock object.'
- );
- }
- return $tag;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection and
- * implement it.
- *
- * @return string
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the exported information (we should use the export static method
- * BUT this throws an exception at this point).
- *
- * @return string
- * @codeCoverageIgnore Not yet implemented
- */
- public function __toString()
- {
- return 'Not yet implemented';
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- /**
- * The location a DocBlock occurs within a file.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Location
- {
- /** @var int Line where the DocBlock text starts. */
- protected $lineNumber = 0;
- /** @var int Column where the DocBlock text starts. */
- protected $columnNumber = 0;
-
- public function __construct(
- $lineNumber = 0,
- $columnNumber = 0
- ) {
- $this->setLineNumber($lineNumber)->setColumnNumber($columnNumber);
- }
- /**
- * @return int Line where the DocBlock text starts.
- */
- public function getLineNumber()
- {
- return $this->lineNumber;
- }
- /**
- *
- * @param type $lineNumber
- * @return $this
- */
- public function setLineNumber($lineNumber)
- {
- $this->lineNumber = (int)$lineNumber;
- return $this;
- }
- /**
- * @return int Column where the DocBlock text starts.
- */
- public function getColumnNumber()
- {
- return $this->columnNumber;
- }
- /**
- *
- * @param int $columnNumber
- * @return $this
- */
- public function setColumnNumber($columnNumber)
- {
- $this->columnNumber = (int)$columnNumber;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
- /**
- * Reflection class for a @since tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SinceTag extends VersionTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @see tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SeeTag extends Tag
- {
- /** @var string */
- protected $refers = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->refers} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- // any output is considered a type
- $this->refers = $parts[0];
- $this->setDescription(isset($parts[1]) ? $parts[1] : '');
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the structural element this tag refers to.
- *
- * @return string
- */
- public function getReference()
- {
- return $this->refers;
- }
- /**
- * Sets the structural element this tag refers to.
- *
- * @param string $refers The new type this tag refers to.
- *
- * @return $this
- */
- public function setReference($refers)
- {
- $this->refers = $refers;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @version tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class VersionTag extends Tag
- {
- /**
- * PCRE regular expression matching a version vector.
- * Assumes the "x" modifier.
- */
- const REGEX_VECTOR = '(?:
- # Normal release vectors.
- \d\S*
- |
- # VCS version vectors. Per PHPCS, they are expected to
- # follow the form of the VCS name, followed by ":", followed
- # by the version vector itself.
- # By convention, popular VCSes like CVS, SVN and GIT use "$"
- # around the actual version vector.
- [^\s\:]+\:\s*\$[^\$]+\$
- )';
- /** @var string The version vector. */
- protected $version = '';
-
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->version} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^
- # The version vector
- (' . self::REGEX_VECTOR . ')
- \s*
- # The description
- (.+)?
- $/sux',
- $this->description,
- $matches
- )) {
- $this->version = $matches[1];
- $this->setDescription(isset($matches[2]) ? $matches[2] : '');
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Gets the version section of the tag.
- *
- * @return string The version section of the tag.
- */
- public function getVersion()
- {
- return $this->version;
- }
-
- /**
- * Sets the version section of the tag.
- *
- * @param string $version The new version section of the tag.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setVersion($version)
- {
- $this->version
- = preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version)
- ? $version
- : '';
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyTag extends ParamTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Type\Collection;
- /**
- * Reflection class for a @return tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ReturnTag extends Tag
- {
- /** @var string The raw type component. */
- protected $type = '';
-
- /** @var Collection The parsed type component. */
- protected $types = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->type} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- // any output is considered a type
- $this->type = $parts[0];
- $this->types = null;
- $this->setDescription(isset($parts[1]) ? $parts[1] : '');
- $this->content = $content;
- return $this;
- }
- /**
- * Returns the unique types of the variable.
- *
- * @return string[]
- */
- public function getTypes()
- {
- return $this->getTypesCollection()->getArrayCopy();
- }
- /**
- * Returns the type section of the variable.
- *
- * @return string
- */
- public function getType()
- {
- return (string) $this->getTypesCollection();
- }
- /**
- * Returns the type collection.
- *
- * @return void
- */
- protected function getTypesCollection()
- {
- if (null === $this->types) {
- $this->types = new Collection(
- array($this->type),
- $this->docblock ? $this->docblock->getContext() : null
- );
- }
- return $this->types;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
- /**
- * Reflection class for a @deprecated tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class DeprecatedTag extends VersionTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @throws tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ThrowsTag extends ReturnTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @covers tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class CoversTag extends SeeTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @source tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SourceTag extends Tag
- {
- /**
- * @var int The starting line, relative to the structural element's
- * location.
- */
- protected $startingLine = 1;
- /**
- * @var int|null The number of lines, relative to the starting line. NULL
- * means "to the end".
- */
- protected $lineCount = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content
- = "{$this->startingLine} {$this->lineCount} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^
- # Starting line
- ([1-9]\d*)
- \s*
- # Number of lines
- (?:
- ((?1))
- \s+
- )?
- # Description
- (.*)
- $/sux',
- $this->description,
- $matches
- )) {
- $this->startingLine = (int)$matches[1];
- if (isset($matches[2]) && '' !== $matches[2]) {
- $this->lineCount = (int)$matches[2];
- }
- $this->setDescription($matches[3]);
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Gets the starting line.
- *
- * @return int The starting line, relative to the structural element's
- * location.
- */
- public function getStartingLine()
- {
- return $this->startingLine;
- }
- /**
- * Sets the starting line.
- *
- * @param int $startingLine The new starting line, relative to the
- * structural element's location.
- *
- * @return $this
- */
- public function setStartingLine($startingLine)
- {
- $this->startingLine = $startingLine;
- $this->content = null;
- return $this;
- }
- /**
- * Returns the number of lines.
- *
- * @return int|null The number of lines, relative to the starting line. NULL
- * means "to the end".
- */
- public function getLineCount()
- {
- return $this->lineCount;
- }
- /**
- * Sets the number of lines.
- *
- * @param int|null $lineCount The new number of lines, relative to the
- * starting line. NULL means "to the end".
- *
- * @return $this
- */
- public function setLineCount($lineCount)
- {
- $this->lineCount = $lineCount;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @uses tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class UsesTag extends SeeTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @method in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class MethodTag extends ReturnTag
- {
- /** @var string */
- protected $method_name = '';
- /** @var string */
- protected $arguments = '';
-
- /** @var bool */
- protected $isStatic = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = '';
- if ($this->isStatic) {
- $this->content .= 'static ';
- }
- $this->content .= $this->type .
- " {$this->method_name}({$this->arguments}) " .
- $this->description;
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- // 1. none or more whitespace
- // 2. optionally the keyword "static" followed by whitespace
- // 3. optionally a word with underscores followed by whitespace : as
- // type for the return value
- // 4. then optionally a word with underscores followed by () and
- // whitespace : as method name as used by phpDocumentor
- // 5. then a word with underscores, followed by ( and any character
- // until a ) and whitespace : as method name with signature
- // 6. any remaining text : as description
- if (preg_match(
- '/^
- # Static keyword
- # Declates a static method ONLY if type is also present
- (?:
- (static)
- \s+
- )?
- # Return type
- (?:
- ([\w\|_\\\\]+)
- \s+
- )?
- # Legacy method name (not captured)
- (?:
- [\w_]+\(\)\s+
- )?
- # Method name
- ([\w\|_\\\\]+)
- # Arguments
- \(([^\)]*)\)
- \s*
- # Description
- (.*)
- $/sux',
- $this->description,
- $matches
- )) {
- list(
- ,
- $static,
- $this->type,
- $this->method_name,
- $this->arguments,
- $this->description
- ) = $matches;
- if ($static) {
- if (!$this->type) {
- $this->type = 'static';
- } else {
- $this->isStatic = true;
- }
- } else {
- if (!$this->type) {
- $this->type = 'void';
- }
- }
- $this->parsedDescription = null;
- }
- return $this;
- }
- /**
- * Sets the name of this method.
- *
- * @param string $method_name The name of the method.
- *
- * @return $this
- */
- public function setMethodName($method_name)
- {
- $this->method_name = $method_name;
- $this->content = null;
- return $this;
- }
- /**
- * Retrieves the method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->method_name;
- }
- /**
- * Sets the arguments for this method.
- *
- * @param string $arguments A comma-separated arguments line.
- *
- * @return void
- */
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- $this->content = null;
- return $this;
- }
- /**
- * Returns an array containing each argument as array of type and name.
- *
- * Please note that the argument sub-array may only contain 1 element if no
- * type was specified.
- *
- * @return string[]
- */
- public function getArguments()
- {
- if (empty($this->arguments)) {
- return array();
- }
- $arguments = explode(',', $this->arguments);
- foreach ($arguments as $key => $value) {
- $arguments[$key] = explode(' ', trim($value));
- }
- return $arguments;
- }
-
- /**
- * Checks whether the method tag describes a static method or not.
- *
- * @return bool TRUE if the method declaration is for a static method, FALSE
- * otherwise.
- */
- public function isStatic()
- {
- return $this->isStatic;
- }
-
- /**
- * Sets a new value for whether the method is static or not.
- *
- * @param bool $isStatic The new value to set.
- *
- * @return $this
- */
- public function setIsStatic($isStatic)
- {
- $this->isStatic = $isStatic;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property-read tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyReadTag extends PropertyTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for an @author tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class AuthorTag extends Tag
- {
- /**
- * PCRE regular expression matching any valid value for the name component.
- */
- const REGEX_AUTHOR_NAME = '[^\<]*';
- /**
- * PCRE regular expression matching any valid value for the email component.
- */
- const REGEX_AUTHOR_EMAIL = '[^\>]*';
- /** @var string The name of the author */
- protected $authorName = '';
- /** @var string The email of the author */
- protected $authorEmail = '';
-
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = $this->authorName;
- if ('' != $this->authorEmail) {
- $this->content .= "<{$this->authorEmail}>";
- }
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^(' . self::REGEX_AUTHOR_NAME .
- ')(\<(' . self::REGEX_AUTHOR_EMAIL .
- ')\>)?$/u',
- $this->description,
- $matches
- )) {
- $this->authorName = trim($matches[1]);
- if (isset($matches[3])) {
- $this->authorEmail = trim($matches[3]);
- }
- }
- return $this;
- }
- /**
- * Gets the author's name.
- *
- * @return string The author's name.
- */
- public function getAuthorName()
- {
- return $this->authorName;
- }
-
- /**
- * Sets the author's name.
- *
- * @param string $authorName The new author name.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setAuthorName($authorName)
- {
- $this->content = null;
- $this->authorName
- = preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName)
- ? $authorName : '';
- return $this;
- }
- /**
- * Gets the author's email.
- *
- * @return string The author's email.
- */
- public function getAuthorEmail()
- {
- return $this->authorEmail;
- }
-
- /**
- * Sets the author's email.
- *
- * @param string $authorEmail The new author email.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setAuthorEmail($authorEmail)
- {
- $this->authorEmail
- = preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail)
- ? $authorEmail : '';
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @var tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class VarTag extends ParamTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Ben Selby <benmatselby@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @link tag in a Docblock.
- *
- * @author Ben Selby <benmatselby@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class LinkTag extends Tag
- {
- /** @var string */
- protected $link = '';
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->link} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- $this->link = $parts[0];
- $this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]);
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the link
- *
- * @return string
- */
- public function getLink()
- {
- return $this->link;
- }
- /**
- * Sets the link
- *
- * @param string $link The link
- *
- * @return $this
- */
- public function setLink($link)
- {
- $this->link = $link;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @example tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ExampleTag extends SourceTag
- {
- /**
- * @var string Path to a file to use as an example.
- * May also be an absolute URI.
- */
- protected $filePath = '';
- /**
- * @var bool Whether the file path component represents an URI.
- * This determines how the file portion appears at {@link getContent()}.
- */
- protected $isURI = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $filePath = '';
- if ($this->isURI) {
- if (false === strpos($this->filePath, ':')) {
- $filePath = str_replace(
- '%2F',
- '/',
- rawurlencode($this->filePath)
- );
- } else {
- $filePath = $this->filePath;
- }
- } else {
- $filePath = '"' . $this->filePath . '"';
- }
- $this->content = $filePath . ' ' . parent::getContent();
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- if (preg_match(
- '/^
- # File component
- (?:
- # File path in quotes
- \"([^\"]+)\"
- |
- # File URI
- (\S+)
- )
- # Remaining content (parsed by SourceTag)
- (?:\s+(.*))?
- $/sux',
- $this->description,
- $matches
- )) {
- if ('' !== $matches[1]) {
- $this->setFilePath($matches[1]);
- } else {
- $this->setFileURI($matches[2]);
- }
- if (isset($matches[3])) {
- parent::setContent($matches[3]);
- } else {
- $this->setDescription('');
- }
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Returns the file path.
- *
- * @return string Path to a file to use as an example.
- * May also be an absolute URI.
- */
- public function getFilePath()
- {
- return $this->filePath;
- }
-
- /**
- * Sets the file path.
- *
- * @param string $filePath The new file path to use for the example.
- *
- * @return $this
- */
- public function setFilePath($filePath)
- {
- $this->isURI = false;
- $this->filePath = trim($filePath);
- $this->content = null;
- return $this;
- }
-
- /**
- * Sets the file path as an URI.
- *
- * This function is equivalent to {@link setFilePath()}, except that it
- * convers an URI to a file path before that.
- *
- * There is no getFileURI(), as {@link getFilePath()} is compatible.
- *
- * @param type $uri The new file URI to use as an example.
- */
- public function setFileURI($uri)
- {
- $this->isURI = true;
- if (false === strpos($uri, ':')) {
- //Relative URL
- $this->filePath = rawurldecode(
- str_replace(array('/', '\\'), '%2F', $uri)
- );
- } else {
- //Absolute URL or URI.
- $this->filePath = $uri;
- }
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @param tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ParamTag extends ReturnTag
- {
- /** @var string */
- protected $variableName = '';
- /** @var bool determines whether this is a variadic argument */
- protected $isVariadic = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content
- = "{$this->type} {$this->variableName} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- $parts = preg_split(
- '/(\s+)/Su',
- $this->description,
- 3,
- PREG_SPLIT_DELIM_CAPTURE
- );
- // if the first item that is encountered is not a variable; it is a type
- if (isset($parts[0])
- && (strlen($parts[0]) > 0)
- && ($parts[0][0] !== '$')
- ) {
- $this->type = array_shift($parts);
- array_shift($parts);
- }
- // if the next item starts with a $ or ...$ it must be the variable name
- if (isset($parts[0])
- && (strlen($parts[0]) > 0)
- && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')
- ) {
- $this->variableName = array_shift($parts);
- array_shift($parts);
- if (substr($this->variableName, 0, 3) === '...') {
- $this->isVariadic = true;
- $this->variableName = substr($this->variableName, 3);
- }
- }
- $this->setDescription(implode('', $parts));
- $this->content = $content;
- return $this;
- }
- /**
- * Returns the variable's name.
- *
- * @return string
- */
- public function getVariableName()
- {
- return $this->variableName;
- }
- /**
- * Sets the variable's name.
- *
- * @param string $name The new name for this variable.
- *
- * @return $this
- */
- public function setVariableName($name)
- {
- $this->variableName = $name;
- $this->content = null;
- return $this;
- }
- /**
- * Returns whether this tag is variadic.
- *
- * @return boolean
- */
- public function isVariadic()
- {
- return $this->isVariadic;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property-write tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyWriteTag extends PropertyTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Barry vd. Heuvel <barryvdh@gmail.com>
- * @copyright 2013 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Serializes a DocBlock instance.
- *
- * @author Barry vd. Heuvel <barryvdh@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Serializer
- {
- /** @var string The string to indent the comment with. */
- protected $indentString = ' ';
- /** @var int The number of times the indent string is repeated. */
- protected $indent = 0;
- /** @var bool Whether to indent the first line. */
- protected $isFirstLineIndented = true;
- /** @var int|null The max length of a line. */
- protected $lineLength = null;
- /**
- * Create a Serializer instance.
- *
- * @param int $indent The number of times the indent string is
- * repeated.
- * @param string $indentString The string to indent the comment with.
- * @param bool $indentFirstLine Whether to indent the first line.
- * @param int|null $lineLength The max length of a line or NULL to
- * disable line wrapping.
- */
- public function __construct(
- $indent = 0,
- $indentString = ' ',
- $indentFirstLine = true,
- $lineLength = null
- ) {
- $this->setIndentationString($indentString);
- $this->setIndent($indent);
- $this->setIsFirstLineIndented($indentFirstLine);
- $this->setLineLength($lineLength);
- }
- /**
- * Sets the string to indent comments with.
- *
- * @param string $indentationString The string to indent comments with.
- *
- * @return $this This serializer object.
- */
- public function setIndentationString($indentString)
- {
- $this->indentString = (string)$indentString;
- return $this;
- }
- /**
- * Gets the string to indent comments with.
- *
- * @return string The indent string.
- */
- public function getIndentationString()
- {
- return $this->indentString;
- }
- /**
- * Sets the number of indents.
- *
- * @param int $indent The number of times the indent string is repeated.
- *
- * @return $this This serializer object.
- */
- public function setIndent($indent)
- {
- $this->indent = (int)$indent;
- return $this;
- }
- /**
- * Gets the number of indents.
- *
- * @return int The number of times the indent string is repeated.
- */
- public function getIndent()
- {
- return $this->indent;
- }
- /**
- * Sets whether or not the first line should be indented.
- *
- * Sets whether or not the first line (the one with the "/**") should be
- * indented.
- *
- * @param bool $indentFirstLine The new value for this setting.
- *
- * @return $this This serializer object.
- */
- public function setIsFirstLineIndented($indentFirstLine)
- {
- $this->isFirstLineIndented = (bool)$indentFirstLine;
- return $this;
- }
- /**
- * Gets whether or not the first line should be indented.
- *
- * @return bool Whether or not the first line should be indented.
- */
- public function isFirstLineIndented()
- {
- return $this->isFirstLineIndented;
- }
- /**
- * Sets the line length.
- *
- * Sets the length of each line in the serialization. Content will be
- * wrapped within this limit.
- *
- * @param int|null $lineLength The length of each line. NULL to disable line
- * wrapping altogether.
- *
- * @return $this This serializer object.
- */
- public function setLineLength($lineLength)
- {
- $this->lineLength = null === $lineLength ? null : (int)$lineLength;
- return $this;
- }
- /**
- * Gets the line length.
- *
- * @return int|null The length of each line or NULL if line wrapping is
- * disabled.
- */
- public function getLineLength()
- {
- return $this->lineLength;
- }
- /**
- * Generate a DocBlock comment.
- *
- * @param DocBlock The DocBlock to serialize.
- *
- * @return string The serialized doc block.
- */
- public function getDocComment(DocBlock $docblock)
- {
- $indent = str_repeat($this->indentString, $this->indent);
- $firstIndent = $this->isFirstLineIndented ? $indent : '';
- $text = $docblock->getText();
- if ($this->lineLength) {
- //3 === strlen(' * ')
- $wrapLength = $this->lineLength - strlen($indent) - 3;
- $text = wordwrap($text, $wrapLength);
- }
- $text = str_replace("\n", "\n{$indent} * ", $text);
- $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
- /** @var Tag $tag */
- foreach ($docblock->getTags() as $tag) {
- $tagText = (string) $tag;
- if ($this->lineLength) {
- $tagText = wordwrap($tagText, $wrapLength);
- }
- $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
- $comment .= "{$indent} * {$tagText}\n";
- }
- $comment .= $indent . ' */';
- return $comment;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- /**
- * The context in which a DocBlock occurs.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Context
- {
- /** @var string The current namespace. */
- protected $namespace = '';
- /** @var array List of namespace aliases => Fully Qualified Namespace. */
- protected $namespace_aliases = array();
-
- /** @var string Name of the structural element, within the namespace. */
- protected $lsen = '';
-
- /**
- * Cteates a new context.
- * @param string $namespace The namespace where this DocBlock
- * resides in.
- * @param array $namespace_aliases List of namespace aliases => Fully
- * Qualified Namespace.
- * @param string $lsen Name of the structural element, within
- * the namespace.
- */
- public function __construct(
- $namespace = '',
- array $namespace_aliases = array(),
- $lsen = ''
- ) {
- if (!empty($namespace)) {
- $this->setNamespace($namespace);
- }
- $this->setNamespaceAliases($namespace_aliases);
- $this->setLSEN($lsen);
- }
- /**
- * @return string The namespace where this DocBlock resides in.
- */
- public function getNamespace()
- {
- return $this->namespace;
- }
- /**
- * @return array List of namespace aliases => Fully Qualified Namespace.
- */
- public function getNamespaceAliases()
- {
- return $this->namespace_aliases;
- }
-
- /**
- * Returns the Local Structural Element Name.
- *
- * @return string Name of the structural element, within the namespace.
- */
- public function getLSEN()
- {
- return $this->lsen;
- }
-
- /**
- * Sets a new namespace.
- *
- * Sets a new namespace for the context. Leading and trailing slashes are
- * trimmed, and the keywords "global" and "default" are treated as aliases
- * to no namespace.
- *
- * @param string $namespace The new namespace to set.
- *
- * @return $this
- */
- public function setNamespace($namespace)
- {
- if ('global' !== $namespace
- && 'default' !== $namespace
- ) {
- // Srip leading and trailing slash
- $this->namespace = trim((string)$namespace, '\\');
- } else {
- $this->namespace = '';
- }
- return $this;
- }
-
- /**
- * Sets the namespace aliases, replacing all previous ones.
- *
- * @param array $namespace_aliases List of namespace aliases => Fully
- * Qualified Namespace.
- *
- * @return $this
- */
- public function setNamespaceAliases(array $namespace_aliases)
- {
- $this->namespace_aliases = array();
- foreach ($namespace_aliases as $alias => $fqnn) {
- $this->setNamespaceAlias($alias, $fqnn);
- }
- return $this;
- }
-
- /**
- * Adds a namespace alias to the context.
- *
- * @param string $alias The alias name (the part after "as", or the last
- * part of the Fully Qualified Namespace Name) to add.
- * @param string $fqnn The Fully Qualified Namespace Name for this alias.
- * Any form of leading/trailing slashes are accepted, but what will be
- * stored is a name, prefixed with a slash, and no trailing slash.
- *
- * @return $this
- */
- public function setNamespaceAlias($alias, $fqnn)
- {
- $this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\');
- return $this;
- }
-
- /**
- * Sets a new Local Structural Element Name.
- *
- * Sets a new Local Structural Element Name. A local name also contains
- * punctuation determining the kind of structural element (e.g. trailing "("
- * and ")" for functions and methods).
- *
- * @param string $lsen The new local name of a structural element.
- *
- * @return $this
- */
- public function setLSEN($lsen)
- {
- $this->lsen = (string)$lsen;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Type;
- use phpDocumentor\Reflection\DocBlock\Context;
- /**
- * Collection
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Collection extends \ArrayObject
- {
- /** @var string Definition of the OR operator for types */
- const OPERATOR_OR = '|';
- /** @var string Definition of the ARRAY operator for types */
- const OPERATOR_ARRAY = '[]';
- /** @var string Definition of the NAMESPACE operator in PHP */
- const OPERATOR_NAMESPACE = '\\';
- /** @var string[] List of recognized keywords */
- protected static $keywords = array(
- 'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double',
- 'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar',
- 'callback', 'callable', 'false', 'true', 'self', '$this', 'static'
- );
- /**
- * Current invoking location.
- *
- * This is used to prepend to type with a relative location.
- * May also be 'default' or 'global', in which case they are ignored.
- *
- * @var Context
- */
- protected $context = null;
- /**
- * Registers the namespace and aliases; uses that to add and expand the
- * given types.
- *
- * @param string[] $types Array containing a list of types to add to this
- * container.
- * @param Context $location The current invoking location.
- */
- public function __construct(
- array $types = array(),
- Context $context = null
- ) {
- $this->context = null === $context ? new Context() : $context;
- foreach ($types as $type) {
- $this->add($type);
- }
- }
- /**
- * Returns the current invoking location.
- *
- * @return Context
- */
- public function getContext()
- {
- return $this->context;
- }
- /**
- * Adds a new type to the collection and expands it if it contains a
- * relative namespace.
- *
- * If a class in the type contains a relative namespace than this collection
- * will try to expand that into a FQCN.
- *
- * @param string $type A 'Type' as defined in the phpDocumentor
- * documentation.
- *
- * @throws \InvalidArgumentException if a non-string argument is passed.
- *
- * @see http://phpdoc.org/docs/latest/for-users/types.html for the
- * definition of a type.
- *
- * @return void
- */
- public function add($type)
- {
- if (!is_string($type)) {
- throw new \InvalidArgumentException(
- 'A type should be represented by a string, received: '
- .var_export($type, true)
- );
- }
- // separate the type by the OR operator
- $type_parts = explode(self::OPERATOR_OR, $type);
- foreach ($type_parts as $part) {
- $expanded_type = $this->expand($part);
- if ($expanded_type) {
- $this[] = $expanded_type;
- }
- }
- }
-
- /**
- * Returns a string representation of the collection.
- *
- * @return string The resolved types across the collection, separated with
- * {@link self::OPERATOR_OR}.
- */
- public function __toString()
- {
- return implode(self::OPERATOR_OR, $this->getArrayCopy());
- }
- /**
- * Analyzes the given type and returns the FQCN variant.
- *
- * When a type is provided this method checks whether it is not a keyword or
- * Fully Qualified Class Name. If so it will use the given namespace and
- * aliases to expand the type to a FQCN representation.
- *
- * This method only works as expected if the namespace and aliases are set;
- * no dynamic reflection is being performed here.
- *
- * @param string $type The relative or absolute type.
- *
- * @uses getNamespace to determine with what to prefix the type name.
- * @uses getNamespaceAliases to check whether the first part of the relative
- * type name should not be replaced with another namespace.
- *
- * @return string
- */
- protected function expand($type)
- {
- $type = trim($type);
- if (!$type) {
- return '';
- }
- if ($this->isTypeAnArray($type)) {
- return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY;
- }
- if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) {
- $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2);
- $namespace_aliases = $this->context->getNamespaceAliases();
- // if the first segment is not an alias; prepend namespace name and
- // return
- if (!isset($namespace_aliases[$type_parts[0]])) {
- $namespace = $this->context->getNamespace();
- if ('' !== $namespace) {
- $namespace .= self::OPERATOR_NAMESPACE;
- }
- return self::OPERATOR_NAMESPACE . $namespace . $type;
- }
- $type_parts[0] = $namespace_aliases[$type_parts[0]];
- $type = implode(self::OPERATOR_NAMESPACE, $type_parts);
- }
- return $type;
- }
- /**
- * Detects whether the given type represents an array.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isTypeAnArray($type)
- {
- return substr($type, -2) === self::OPERATOR_ARRAY;
- }
- /**
- * Detects whether the given type represents a PHPDoc keyword.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isTypeAKeyword($type)
- {
- return in_array(strtolower($type), static::$keywords, true);
- }
- /**
- * Detects whether the given type represents a relative or absolute path.
- *
- * This method will detect keywords as being absolute; even though they are
- * not preceeded by a namespace separator.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isRelativeType($type)
- {
- return ($type[0] !== self::OPERATOR_NAMESPACE)
- || $this->isTypeAKeyword($type);
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Parses a tag definition for a DocBlock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Tag implements \Reflector
- {
- /**
- * PCRE regular expression matching a tag name.
- */
- const REGEX_TAGNAME = '[\w\-\_\\\\]+';
- /** @var string Name of the tag */
- protected $tag = '';
- /**
- * @var string|null Content of the tag.
- * When set to NULL, it means it needs to be regenerated.
- */
- protected $content = '';
- /** @var string Description of the content of this tag */
- protected $description = '';
- /**
- * @var array|null The description, as an array of strings and Tag objects.
- * When set to NULL, it means it needs to be regenerated.
- */
- protected $parsedDescription = null;
- /** @var Location Location of the tag. */
- protected $location = null;
- /** @var DocBlock The DocBlock which this tag belongs to. */
- protected $docblock = null;
-
- /**
- * @var array An array with a tag as a key, and an FQCN to a class that
- * handles it as an array value. The class is expected to inherit this
- * class.
- */
- private static $tagHandlerMappings = array(
- 'author'
- => '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag',
- 'covers'
- => '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag',
- 'deprecated'
- => '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag',
- 'example'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag',
- 'link'
- => '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag',
- 'method'
- => '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag',
- 'param'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag',
- 'property-read'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag',
- 'property'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag',
- 'property-write'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag',
- 'return'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag',
- 'see'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag',
- 'since'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag',
- 'source'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag',
- 'throw'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
- 'throws'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
- 'uses'
- => '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag',
- 'var'
- => '\phpDocumentor\Reflection\DocBlock\Tag\VarTag',
- 'version'
- => '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag'
- );
- /**
- * Factory method responsible for instantiating the correct sub type.
- *
- * @param string $tag_line The text for this tag, including description.
- * @param DocBlock $docblock The DocBlock which this tag belongs to.
- * @param Location $location Location of the tag.
- *
- * @throws \InvalidArgumentException if an invalid tag line was presented.
- *
- * @return static A new tag object.
- */
- final public static function createInstance(
- $tag_line,
- DocBlock $docblock = null,
- Location $location = null
- ) {
- if (!preg_match(
- '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us',
- $tag_line,
- $matches
- )) {
- throw new \InvalidArgumentException(
- 'Invalid tag_line detected: ' . $tag_line
- );
- }
- $handler = __CLASS__;
- if (isset(self::$tagHandlerMappings[$matches[1]])) {
- $handler = self::$tagHandlerMappings[$matches[1]];
- } elseif (isset($docblock)) {
- $tagName = (string)new Type\Collection(
- array($matches[1]),
- $docblock->getContext()
- );
- if (isset(self::$tagHandlerMappings[$tagName])) {
- $handler = self::$tagHandlerMappings[$tagName];
- }
- }
- return new $handler(
- $matches[1],
- isset($matches[2]) ? $matches[2] : '',
- $docblock,
- $location
- );
- }
- /**
- * Registers a handler for tags.
- *
- * Registers a handler for tags. The class specified is autoloaded if it's
- * not available. It must inherit from this class.
- *
- * @param string $tag Name of tag to regiser a handler for. When
- * registering a namespaced tag, the full name, along with a prefixing
- * slash MUST be provided.
- * @param string|null $handler FQCN of handler. Specifing NULL removes the
- * handler for the specified tag, if any.
- *
- * @return bool TRUE on success, FALSE on failure.
- */
- final public static function registerTagHandler($tag, $handler)
- {
- $tag = trim((string)$tag);
- if (null === $handler) {
- unset(self::$tagHandlerMappings[$tag]);
- return true;
- }
- if ('' !== $tag
- && class_exists($handler, true)
- && is_subclass_of($handler, __CLASS__)
- && !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0.
- ) {
- self::$tagHandlerMappings[$tag] = $handler;
- return true;
- }
- return false;
- }
- /**
- * Parses a tag and populates the member variables.
- *
- * @param string $name Name of the tag.
- * @param string $content The contents of the given tag.
- * @param DocBlock $docblock The DocBlock which this tag belongs to.
- * @param Location $location Location of the tag.
- */
- public function __construct(
- $name,
- $content,
- DocBlock $docblock = null,
- Location $location = null
- ) {
- $this
- ->setName($name)
- ->setContent($content)
- ->setDocBlock($docblock)
- ->setLocation($location);
- }
- /**
- * Gets the name of this tag.
- *
- * @return string The name of this tag.
- */
- public function getName()
- {
- return $this->tag;
- }
- /**
- * Sets the name of this tag.
- *
- * @param string $name The new name of this tag.
- *
- * @return $this
- * @throws \InvalidArgumentException When an invalid tag name is provided.
- */
- public function setName($name)
- {
- if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) {
- throw new \InvalidArgumentException(
- 'Invalid tag name supplied: ' . $name
- );
- }
- $this->tag = $name;
- return $this;
- }
- /**
- * Gets the content of this tag.
- *
- * @return string
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = $this->description;
- }
- return $this->content;
- }
- /**
- * Sets the content of this tag.
- *
- * @param string $content The new content of this tag.
- *
- * @return $this
- */
- public function setContent($content)
- {
- $this->setDescription($content);
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the description component of this tag.
- *
- * @return string
- */
- public function getDescription()
- {
- return $this->description;
- }
- /**
- * Sets the description component of this tag.
- *
- * @param string $description The new description component of this tag.
- *
- * @return $this
- */
- public function setDescription($description)
- {
- $this->content = null;
- $this->parsedDescription = null;
- $this->description = trim($description);
- return $this;
- }
- /**
- * Gets the parsed text of this description.
- *
- * @return array An array of strings and tag objects, in the order they
- * occur within the description.
- */
- public function getParsedDescription()
- {
- if (null === $this->parsedDescription) {
- $description = new Description($this->description, $this->docblock);
- $this->parsedDescription = $description->getParsedContents();
- }
- return $this->parsedDescription;
- }
- /**
- * Gets the docblock this tag belongs to.
- *
- * @return DocBlock The docblock this tag belongs to.
- */
- public function getDocBlock()
- {
- return $this->docblock;
- }
- /**
- * Sets the docblock this tag belongs to.
- *
- * @param DocBlock $docblock The new docblock this tag belongs to. Setting
- * NULL removes any association.
- *
- * @return $this
- */
- public function setDocBlock(DocBlock $docblock = null)
- {
- $this->docblock = $docblock;
- return $this;
- }
- /**
- * Gets the location of the tag.
- *
- * @return Location The tag's location.
- */
- public function getLocation()
- {
- return $this->location;
- }
-
- /**
- * Sets the location of the tag.
- *
- * @param Location $location The new location of the tag.
- *
- * @return $this
- */
- public function setLocation(Location $location = null)
- {
- $this->location = $location;
- return $this;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection and implement it.
- *
- * @return void
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the tag as a serialized string
- *
- * @return string
- */
- public function __toString()
- {
- return "@{$this->getName()} {$this->getContent()}";
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Parses a Description of a DocBlock or tag.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Description implements \Reflector
- {
- /** @var string */
- protected $contents = '';
- /** @var array The contents, as an array of strings and Tag objects. */
- protected $parsedContents = null;
- /** @var DocBlock The DocBlock which this description belongs to. */
- protected $docblock = null;
- /**
- * Populates the fields of a description.
- *
- * @param string $content The description's conetnts.
- * @param DocBlock $docblock The DocBlock which this description belongs to.
- */
- public function __construct($content, DocBlock $docblock = null)
- {
- $this->setContent($content)->setDocBlock($docblock);
- }
- /**
- * Gets the text of this description.
- *
- * @return string
- */
- public function getContents()
- {
- return $this->contents;
- }
- /**
- * Sets the text of this description.
- *
- * @param string $content The new text of this description.
- *
- * @return $this
- */
- public function setContent($content)
- {
- $this->contents = trim($content);
- $this->parsedContents = null;
- return $this;
- }
- /**
- * Returns the parsed text of this description.
- *
- * @return array An array of strings and tag objects, in the order they
- * occur within the description.
- */
- public function getParsedContents()
- {
- if (null === $this->parsedContents) {
- $this->parsedContents = preg_split(
- '/\{
- # "{@}" is not a valid inline tag. This ensures that
- # we do not treat it as one, but treat it literally.
- (?!@\})
- # We want to capture the whole tag line, but without the
- # inline tag delimiters.
- (\@
- # Match everything up to the next delimiter.
- [^{}]*
- # Nested inline tag content should not be captured, or
- # it will appear in the result separately.
- (?:
- # Match nested inline tags.
- (?:
- # Because we did not catch the tag delimiters
- # earlier, we must be explicit with them here.
- # Notice that this also matches "{}", as a way
- # to later introduce it as an escape sequence.
- \{(?1)?\}
- |
- # Make sure we match hanging "{".
- \{
- )
- # Match content after the nested inline tag.
- [^{}]*
- )* # If there are more inline tags, match them as well.
- # We use "*" since there may not be any nested inline
- # tags.
- )
- \}/Sux',
- $this->contents,
- null,
- PREG_SPLIT_DELIM_CAPTURE
- );
- $count = count($this->parsedContents);
- for ($i=1; $i<$count; $i += 2) {
- $this->parsedContents[$i] = Tag::createInstance(
- $this->parsedContents[$i],
- $this->docblock
- );
- }
- //In order to allow "literal" inline tags, the otherwise invalid
- //sequence "{@}" is changed to "@", and "{}" is changed to "}".
- //See unit tests for examples.
- for ($i=0; $i<$count; $i += 2) {
- $this->parsedContents[$i] = str_replace(
- array('{@}', '{}'),
- array('@', '}'),
- $this->parsedContents[$i]
- );
- }
- }
- return $this->parsedContents;
- }
- /**
- * Return a formatted variant of the Long Description using MarkDown.
- *
- * @todo this should become a more intelligent piece of code where the
- * configuration contains a setting what format long descriptions are.
- *
- * @codeCoverageIgnore Will be removed soon, in favor of adapters at
- * PhpDocumentor itself that will process text in various formats.
- *
- * @return string
- */
- public function getFormattedContents()
- {
- $result = $this->contents;
- // if the long description contains a plain HTML <code> element, surround
- // it with a pre element. Please note that we explicitly used str_replace
- // and not preg_replace to gain performance
- if (strpos($result, '<code>') !== false) {
- $result = str_replace(
- array('<code>', "<code>\r\n", "<code>\n", "<code>\r", '</code>'),
- array('<pre><code>', '<code>', '<code>', '<code>', '</code></pre>'),
- $result
- );
- }
- if (class_exists('Parsedown')) {
- $markdown = \Parsedown::instance();
- $result = $markdown->parse($result);
- } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) {
- $markdown = new \dflydev\markdown\MarkdownExtraParser();
- $result = $markdown->transformMarkdown($result);
- }
- return trim($result);
- }
- /**
- * Gets the docblock this tag belongs to.
- *
- * @return DocBlock The docblock this description belongs to.
- */
- public function getDocBlock()
- {
- return $this->docblock;
- }
- /**
- * Sets the docblock this tag belongs to.
- *
- * @param DocBlock $docblock The new docblock this description belongs to.
- * Setting NULL removes any association.
- *
- * @return $this
- */
- public function setDocBlock(DocBlock $docblock = null)
- {
- $this->docblock = $docblock;
- return $this;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection
- * and implement it.
- *
- * @return void
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the long description as a string.
- *
- * @return string
- */
- public function __toString()
- {
- return $this->getContents();
- }
- }
- Version
- Copyright (c) 2013-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Version package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann;
- /**
- * @since Class available since Release 1.0.0
- */
- class Version
- {
- private $path;
- private $release;
- private $version;
- /**
- * @param string $release
- * @param string $path
- */
- public function __construct($release, $path)
- {
- $this->release = $release;
- $this->path = $path;
- }
- /**
- * @return string
- */
- public function getVersion()
- {
- if ($this->version === null) {
- if (count(explode('.', $this->release)) == 3) {
- $this->version = $this->release;
- } else {
- $this->version = $this->release . '-dev';
- }
- $git = $this->getGitInformation($this->path);
- if ($git) {
- if (count(explode('.', $this->release)) == 3) {
- $this->version = $git;
- } else {
- $git = explode('-', $git);
- $this->version = $this->release . '-' . end($git);
- }
- }
- }
- return $this->version;
- }
- /**
- * @param string $path
- * @return bool|string
- */
- private function getGitInformation($path)
- {
- if (!is_dir($path . DIRECTORY_SEPARATOR . '.git')) {
- return false;
- }
- $dir = getcwd();
- chdir($path);
- $returnCode = 1;
- $result = @exec('git describe --tags 2>&1', $output, $returnCode);
- chdir($dir);
- if ($returnCode !== 0) {
- return false;
- }
- return $result;
- }
- }
- °=ä�kheÕ§ÃQ·Ú¼B¡í¡e{�#xça›{â[�Òg¿éì~<Þã(݆Hðn©º�1ÅÃÜeM±uÈ[���GBMB
|