brython.js 566 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316
  1. // brython.js brython.info
  2. // version [3, 3, 0, 'alpha', 0]
  3. // implementation [3, 3, 2, 'dev', 0]
  4. // version compiled from commented, indented source files at
  5. // github.com/brython-dev/brython
  6. !function(r,n){"use strict";function t(r,n,t,e){for(t=void 0!==t?t:0,e=void 0!==e?e:r.length;e>t;){var c=e+t>>1;r[c]>n?e=c:t=c+1}return t}function e(r){if(35>r)return r;var n=t(K,r);return L[n]}function c(r){var n=t(M,r);return N[n]}function u(r){switch(r.charCodeAt(0)){case 9:case 10:case 11:case 12:case 13:case 28:case 29:case 30:case 31:case 32:case 133:case 160:case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:return!0}return!1}function a(r){var n;return r>=1114112?n=0:(n=e(r>>J),n=c((n<<J)+(r&(1<<J)-1))),y[n]}function i(r,n){for(var t="",e=0;n>e;e++)t+=String.fromCharCode(I[r+e]);return t}function o(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&T)}function f(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&V)}function h(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&W)}function v(r){var n=r.charCodeAt(0),t=a(n);return t[H]&P?t[F]:-1}function s(r){return v(r)<0?0:1}function d(r){var n=r.charCodeAt(0),t=a(n);return t[H]&Q?t[G]:-1}function A(r){return d(r)<0?0:1}function l(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&Y)}function C(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&X)}function g(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&R)}function p(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&U)}function m(r){var n=r.charCodeAt(0),t=a(n);return t[H]&rn?i(65535&t[D],t[D]>>24):String.fromCharCode(n+t[D])}function S(r){var n=r.charCodeAt(0),t=a(n);return t[H]&rn?i(65535&t[E],t[E]>>24):String.fromCharCode(n+t[E])}function w(r){var n=r.charCodeAt(0),t=a(n);return t[H]&rn?i(65535&t[B],t[B]>>24):String.fromCharCode(n+t[B])}function b(r){var n=r.charCodeAt(0),t=a(n);if(t[H]&rn&&t[D]>>20&7){var e=(65535&t[D])+(t[D]>>24),c=t[D]>>20&7;return i(e,c)}return m(r)}function z(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&$)}function _(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&Z)}function j(r){var n=r.charCodeAt(0),t=a(n);return 0!=(t[H]&O)}function k(r){return j(r)||s(r)||A(r)||l(r)}function q(r,n){var t,e;for(t=n-1;t>=0&&(e=r.charAt(t),_(e));t--);var c=t>=0&&z(e);if(c){for(t=n+1;r.length>t&&(e=r.charAt(t),_(e));t++);c=t==r.length||!z(e)}return String.fromCharCode(c?962:963)}function x(r,n,t){return 931==r.charCodeAt(0)?q(n,t):m(r)}n.unicode=r;var y=[[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,32],[0,0,0,0,0,48],[0,0,0,0,0,1056],[0,0,0,0,0,1024],[0,0,0,0,0,5120],[0,0,0,0,0,3590],[0,0,0,1,1,3590],[0,0,0,2,2,3590],[0,0,0,3,3,3590],[0,0,0,4,4,3590],[0,0,0,5,5,3590],[0,0,0,6,6,3590],[0,0,0,7,7,3590],[0,0,0,8,8,3590],[0,0,0,9,9,3590],[0,32,0,0,0,10113],[0,0,0,0,0,1536],[-32,0,-32,0,0,9993],[0,0,0,0,0,9993],[0,0,0,0,0,4096],[0,0,0,0,2,3076],[0,0,0,0,3,3076],[16777218,17825792,16777218,0,0,26377],[0,0,0,0,0,5632],[0,0,0,0,1,3076],[0,0,0,0,0,3072],[33554438,18874371,33554440,0,0,26377],[121,0,121,0,0,9993],[0,1,0,0,0,10113],[-1,0,-1,0,0,9993],[16777228,33554442,16777228,0,0,26497],[-232,0,-232,0,0,9993],[33554448,18874381,33554448,0,0,26377],[0,-121,0,0,0,10113],[16777236,17825810,16777236,0,0,26377],[195,0,195,0,0,9993],[0,210,0,0,0,10113],[0,206,0,0,0,10113],[0,205,0,0,0,10113],[0,79,0,0,0,10113],[0,202,0,0,0,10113],[0,203,0,0,0,10113],[0,207,0,0,0,10113],[97,0,97,0,0,9993],[0,211,0,0,0,10113],[0,209,0,0,0,10113],[163,0,163,0,0,9993],[0,213,0,0,0,10113],[130,0,130,0,0,9993],[0,214,0,0,0,10113],[0,218,0,0,0,10113],[0,217,0,0,0,10113],[0,219,0,0,0,10113],[0,0,0,0,0,1793],[56,0,56,0,0,9993],[0,2,1,0,0,10113],[-1,1,0,0,0,10049],[-2,0,-1,0,0,9993],[-79,0,-79,0,0,9993],[33554456,18874389,33554456,0,0,26377],[0,-97,0,0,0,10113],[0,-56,0,0,0,10113],[0,-130,0,0,0,10113],[0,10795,0,0,0,10113],[0,-163,0,0,0,10113],[0,10792,0,0,0,10113],[10815,0,10815,0,0,9993],[0,-195,0,0,0,10113],[0,69,0,0,0,10113],[0,71,0,0,0,10113],[10783,0,10783,0,0,9993],[10780,0,10780,0,0,9993],[10782,0,10782,0,0,9993],[-210,0,-210,0,0,9993],[-206,0,-206,0,0,9993],[-205,0,-205,0,0,9993],[-202,0,-202,0,0,9993],[-203,0,-203,0,0,9993],[42319,0,42319,0,0,9993],[42315,0,42315,0,0,9993],[-207,0,-207,0,0,9993],[42280,0,42280,0,0,9993],[42308,0,42308,0,0,9993],[-209,0,-209,0,0,9993],[-211,0,-211,0,0,9993],[10743,0,10743,0,0,9993],[42305,0,42305,0,0,9993],[10749,0,10749,0,0,9993],[-213,0,-213,0,0,9993],[-214,0,-214,0,0,9993],[10727,0,10727,0,0,9993],[-218,0,-218,0,0,9993],[42282,0,42282,0,0,9993],[-69,0,-69,0,0,9993],[-217,0,-217,0,0,9993],[-71,0,-71,0,0,9993],[-219,0,-219,0,0,9993],[42261,0,42261,0,0,9993],[42258,0,42258,0,0,9993],[0,0,0,0,0,14089],[0,0,0,0,0,5889],[16777244,17825818,16777244,0,0,30216],[0,0,0,0,0,13321],[0,116,0,0,0,10113],[0,38,0,0,0,10113],[0,37,0,0,0,10113],[0,64,0,0,0,10113],[0,63,0,0,0,10113],[50331681,19922973,50331681,0,0,26377],[-38,0,-38,0,0,9993],[-37,0,-37,0,0,9993],[50331688,19922980,50331688,0,0,26377],[16777261,17825835,16777261,0,0,26377],[-64,0,-64,0,0,9993],[-63,0,-63,0,0,9993],[0,8,0,0,0,10113],[16777264,17825838,16777264,0,0,26377],[16777267,17825841,16777267,0,0,26377],[0,0,0,0,0,10113],[16777270,17825844,16777270,0,0,26377],[16777273,17825847,16777273,0,0,26377],[-8,0,-8,0,0,9993],[16777276,17825850,16777276,0,0,26377],[16777279,17825853,16777279,0,0,26377],[7,0,7,0,0,9993],[-116,0,-116,0,0,9993],[0,-60,0,0,0,10113],[16777282,17825856,16777282,0,0,26377],[0,-7,0,0,0,10113],[0,80,0,0,0,10113],[-80,0,-80,0,0,9993],[0,15,0,0,0,10113],[-15,0,-15,0,0,9993],[0,48,0,0,0,10113],[-48,0,-48,0,0,9993],[33554502,18874435,33554504,0,0,26377],[0,0,0,0,0,1537],[0,7264,0,0,0,10113],[0,0,0,0,1,3588],[0,0,0,0,2,3588],[0,0,0,0,3,3588],[0,0,0,0,4,3588],[0,0,0,0,5,3588],[0,0,0,0,6,3588],[0,0,0,0,7,3588],[0,0,0,0,8,3588],[0,0,0,0,9,3588],[16777292,17825866,16777292,0,0,26497],[16777295,17825869,16777295,0,0,26497],[16777298,17825872,16777298,0,0,26497],[16777301,17825875,16777301,0,0,26497],[16777304,17825878,16777304,0,0,26497],[16777307,17825881,16777307,0,0,26497],[16777310,17825884,16777310,0,0,26497],[16777313,17825887,16777313,0,0,26497],[16777316,17825890,16777316,0,0,26497],[16777319,17825893,16777319,0,0,26497],[16777322,17825896,16777322,0,0,26497],[16777325,17825899,16777325,0,0,26497],[16777328,17825902,16777328,0,0,26497],[16777331,17825905,16777331,0,0,26497],[16777334,17825908,16777334,0,0,26497],[16777337,17825911,16777337,0,0,26497],[16777340,17825914,16777340,0,0,26497],[16777343,17825917,16777343,0,0,26497],[16777346,17825920,16777346,0,0,26497],[16777349,17825923,16777349,0,0,26497],[16777352,17825926,16777352,0,0,26497],[16777355,17825929,16777355,0,0,26497],[16777358,17825932,16777358,0,0,26497],[16777361,17825935,16777361,0,0,26497],[16777364,17825938,16777364,0,0,26497],[16777367,17825941,16777367,0,0,26497],[16777370,17825944,16777370,0,0,26497],[16777373,17825947,16777373,0,0,26497],[16777376,17825950,16777376,0,0,26497],[16777379,17825953,16777379,0,0,26497],[16777382,17825956,16777382,0,0,26497],[16777385,17825959,16777385,0,0,26497],[16777388,17825962,16777388,0,0,26497],[16777391,17825965,16777391,0,0,26497],[16777394,17825968,16777394,0,0,26497],[16777397,17825971,16777397,0,0,26497],[16777400,17825974,16777400,0,0,26497],[16777403,17825977,16777403,0,0,26497],[16777406,17825980,16777406,0,0,26497],[16777409,17825983,16777409,0,0,26497],[16777412,17825986,16777412,0,0,26497],[16777415,17825989,16777415,0,0,26497],[16777418,17825992,16777418,0,0,26497],[16777421,17825995,16777421,0,0,26497],[16777424,17825998,16777424,0,0,26497],[16777427,17826001,16777427,0,0,26497],[16777430,17826004,16777430,0,0,26497],[16777433,17826007,16777433,0,0,26497],[16777436,17826010,16777436,0,0,26497],[16777439,17826013,16777439,0,0,26497],[16777442,17826016,16777442,0,0,26497],[16777445,17826019,16777445,0,0,26497],[16777448,17826022,16777448,0,0,26497],[16777451,17826025,16777451,0,0,26497],[16777454,17826028,16777454,0,0,26497],[16777457,17826031,16777457,0,0,26497],[16777460,17826034,16777460,0,0,26497],[16777463,17826037,16777463,0,0,26497],[16777466,17826040,16777466,0,0,26497],[16777469,17826043,16777469,0,0,26497],[16777472,17826046,16777472,0,0,26497],[16777475,17826049,16777475,0,0,26497],[16777478,17826052,16777478,0,0,26497],[16777481,17826055,16777481,0,0,26497],[16777484,17826058,16777484,0,0,26497],[16777487,17826061,16777487,0,0,26497],[16777490,17826064,16777490,0,0,26497],[16777493,17826067,16777493,0,0,26497],[16777496,17826070,16777496,0,0,26497],[16777499,17826073,16777499,0,0,26497],[16777502,17826076,16777502,0,0,26497],[16777505,17826079,16777505,0,0,26497],[16777508,17826082,16777508,0,0,26497],[16777511,17826085,16777511,0,0,26497],[16777514,17826088,16777514,0,0,26497],[16777517,17826091,16777517,0,0,26497],[16777520,17826094,16777520,0,0,26497],[16777523,17826097,16777523,0,0,26497],[16777526,17826100,16777526,0,0,26497],[16777529,17826103,16777529,0,0,26497],[16777532,17826106,16777532,0,0,26497],[16777535,17826109,16777535,0,0,26497],[16777538,17826112,16777538,0,0,26497],[16777541,17826115,16777541,0,0,26497],[16777544,17826118,16777544,0,0,26497],[16777547,17826121,16777547,0,0,26497],[16777550,17826124,16777550,0,0,26377],[16777553,17826127,16777553,0,0,26377],[16777556,17826130,16777556,0,0,26377],[16777559,17826133,16777559,0,0,26377],[16777562,17826136,16777562,0,0,26377],[16777565,17826139,16777565,0,0,26377],[0,0,0,0,0,3840],[35332,0,35332,0,0,9993],[3814,0,3814,0,0,9993],[33554785,18874718,33554785,0,0,26377],[33554790,18874723,33554790,0,0,26377],[33554795,18874728,33554795,0,0,26377],[33554800,18874733,33554800,0,0,26377],[33554805,18874738,33554805,0,0,26377],[16777593,17826167,16777593,0,0,26377],[16777597,18874746,16777597,0,0,26497],[8,0,8,0,0,9993],[0,-8,0,0,0,10113],[33554817,18874750,33554817,0,0,26377],[50332039,19923331,50332039,0,0,26377],[50332046,19923338,50332046,0,0,26377],[50332053,19923345,50332053,0,0,26377],[74,0,74,0,0,9993],[86,0,86,0,0,9993],[100,0,100,0,0,9993],[128,0,128,0,0,9993],[112,0,112,0,0,9993],[126,0,126,0,0,9993],[33554843,18874776,16777629,0,0,26377],[33554849,18874782,16777635,0,0,26377],[33554855,18874788,16777641,0,0,26377],[33554861,18874794,16777647,0,0,26377],[33554867,18874800,16777653,0,0,26377],[33554873,18874806,16777659,0,0,26377],[33554879,18874812,16777665,0,0,26377],[33554885,18874818,16777671,0,0,26377],[33554891,18874824,16777677,0,0,26433],[33554897,18874830,16777683,0,0,26433],[33554903,18874836,16777689,0,0,26433],[33554909,18874842,16777695,0,0,26433],[33554915,18874848,16777701,0,0,26433],[33554921,18874854,16777707,0,0,26433],[33554927,18874860,16777713,0,0,26433],[33554933,18874866,16777719,0,0,26433],[33554939,18874872,16777725,0,0,26377],[33554945,18874878,16777731,0,0,26377],[33554951,18874884,16777737,0,0,26377],[33554957,18874890,16777743,0,0,26377],[33554963,18874896,16777749,0,0,26377],[33554969,18874902,16777755,0,0,26377],[33554975,18874908,16777761,0,0,26377],[33554981,18874914,16777767,0,0,26377],[33554987,18874920,16777773,0,0,26433],[33554993,18874926,16777779,0,0,26433],[33554999,18874932,16777785,0,0,26433],[33555005,18874938,16777791,0,0,26433],[33555011,18874944,16777797,0,0,26433],[33555017,18874950,16777803,0,0,26433],[33555023,18874956,16777809,0,0,26433],[33555029,18874962,16777815,0,0,26433],[33555035,18874968,16777821,0,0,26377],[33555041,18874974,16777827,0,0,26377],[33555047,18874980,16777833,0,0,26377],[33555053,18874986,16777839,0,0,26377],[33555059,18874992,16777845,0,0,26377],[33555065,18874998,16777851,0,0,26377],[33555071,18875004,16777857,0,0,26377],[33555077,18875010,16777863,0,0,26377],[33555083,18875016,16777869,0,0,26433],[33555089,18875022,16777875,0,0,26433],[33555095,18875028,16777881,0,0,26433],[33555101,18875034,16777887,0,0,26433],[33555107,18875040,16777893,0,0,26433],[33555113,18875046,16777899,0,0,26433],[33555119,18875052,16777905,0,0,26433],[33555125,18875058,16777911,0,0,26433],[33555131,18875064,33555133,0,0,26377],[33555138,18875071,16777924,0,0,26377],[33555144,18875077,33555146,0,0,26377],[33555151,18875084,33555151,0,0,26377],[50332373,19923665,50332376,0,0,26377],[0,-74,0,0,0,10113],[33555166,18875099,16777952,0,0,26433],[16777955,17826529,16777955,0,0,26377],[33555175,18875108,33555177,0,0,26377],[33555182,18875115,16777968,0,0,26377],[33555188,18875121,33555190,0,0,26377],[33555195,18875128,33555195,0,0,26377],[50332417,19923709,50332420,0,0,26377],[0,-86,0,0,0,10113],[33555210,18875143,16777996,0,0,26433],[50332433,19923725,50332433,0,0,26377],[50332440,19923732,50332440,0,0,26377],[33555230,18875163,33555230,0,0,26377],[50332452,19923744,50332452,0,0,26377],[0,-100,0,0,0,10113],[50332459,19923751,50332459,0,0,26377],[50332466,19923758,50332466,0,0,26377],[33555256,18875189,33555256,0,0,26377],[33555261,18875194,33555261,0,0,26377],[50332483,19923775,50332483,0,0,26377],[0,-112,0,0,0,10113],[33555273,18875206,33555275,0,0,26377],[33555280,18875213,16778066,0,0,26377],[33555286,18875219,33555288,0,0,26377],[33555293,18875226,33555293,0,0,26377],[50332515,19923807,50332518,0,0,26377],[0,-128,0,0,0,10113],[0,-126,0,0,0,10113],[33555308,18875241,16778094,0,0,26433],[0,0,0,0,0,3076],[0,0,0,0,4,3076],[0,0,0,0,5,3076],[0,0,0,0,6,3076],[0,0,0,0,7,3076],[0,0,0,0,8,3076],[0,0,0,0,9,3076],[0,0,0,0,0,1792],[0,-7517,0,0,0,10113],[0,-8383,0,0,0,10113],[0,-8262,0,0,0,10113],[0,28,0,0,0,10113],[-28,0,-28,0,0,9993],[0,16,0,0,0,12160],[-16,0,-16,0,0,12040],[0,26,0,0,0,9344],[-26,0,-26,0,0,9224],[0,-10743,0,0,0,10113],[0,-3814,0,0,0,10113],[0,-10727,0,0,0,10113],[-10795,0,-10795,0,0,9993],[-10792,0,-10792,0,0,9993],[0,-10780,0,0,0,10113],[0,-10749,0,0,0,10113],[0,-10783,0,0,0,10113],[0,-10782,0,0,0,10113],[0,-10815,0,0,0,10113],[-7264,0,-7264,0,0,9993],[0,0,0,0,0,5121],[0,0,0,0,0,3841],[0,-35332,0,0,0,10113],[0,-42280,0,0,0,10113],[0,-42308,0,0,0,10113],[0,-42319,0,0,0,10113],[0,-42315,0,0,0,10113],[0,-42305,0,0,0,10113],[0,-42258,0,0,0,10113],[0,-42282,0,0,0,10113],[0,-42261,0,0,0,10113],[0,928,0,0,0,10113],[-928,0,-928,0,0,9993],[16778097,17826671,16778097,0,0,26377],[16778100,17826674,16778100,0,0,26377],[16778103,17826677,16778103,0,0,26377],[16778106,17826680,16778106,0,0,26377],[16778109,17826683,16778109,0,0,26377],[16778112,17826686,16778112,0,0,26377],[16778115,17826689,16778115,0,0,26377],[16778118,17826692,16778118,0,0,26377],[16778121,17826695,16778121,0,0,26377],[16778124,17826698,16778124,0,0,26377],[16778127,17826701,16778127,0,0,26377],[16778130,17826704,16778130,0,0,26377],[16778133,17826707,16778133,0,0,26377],[16778136,17826710,16778136,0,0,26377],[16778139,17826713,16778139,0,0,26377],[16778142,17826716,16778142,0,0,26377],[16778145,17826719,16778145,0,0,26377],[16778148,17826722,16778148,0,0,26377],[16778151,17826725,16778151,0,0,26377],[16778154,17826728,16778154,0,0,26377],[16778157,17826731,16778157,0,0,26377],[16778160,17826734,16778160,0,0,26377],[16778163,17826737,16778163,0,0,26377],[16778166,17826740,16778166,0,0,26377],[16778169,17826743,16778169,0,0,26377],[16778172,17826746,16778172,0,0,26377],[16778175,17826749,16778175,0,0,26377],[16778178,17826752,16778178,0,0,26377],[16778181,17826755,16778181,0,0,26377],[16778184,17826758,16778184,0,0,26377],[16778187,17826761,16778187,0,0,26377],[16778190,17826764,16778190,0,0,26377],[16778193,17826767,16778193,0,0,26377],[16778196,17826770,16778196,0,0,26377],[16778199,17826773,16778199,0,0,26377],[16778202,17826776,16778202,0,0,26377],[16778205,17826779,16778205,0,0,26377],[16778208,17826782,16778208,0,0,26377],[16778211,17826785,16778211,0,0,26377],[16778214,17826788,16778214,0,0,26377],[16778217,17826791,16778217,0,0,26377],[16778220,17826794,16778220,0,0,26377],[16778223,17826797,16778223,0,0,26377],[16778226,17826800,16778226,0,0,26377],[16778229,17826803,16778229,0,0,26377],[16778232,17826806,16778232,0,0,26377],[16778235,17826809,16778235,0,0,26377],[16778238,17826812,16778238,0,0,26377],[16778241,17826815,16778241,0,0,26377],[16778244,17826818,16778244,0,0,26377],[16778247,17826821,16778247,0,0,26377],[16778250,17826824,16778250,0,0,26377],[16778253,17826827,16778253,0,0,26377],[16778256,17826830,16778256,0,0,26377],[16778259,17826833,16778259,0,0,26377],[16778262,17826836,16778262,0,0,26377],[16778265,17826839,16778265,0,0,26377],[16778268,17826842,16778268,0,0,26377],[16778271,17826845,16778271,0,0,26377],[16778274,17826848,16778274,0,0,26377],[16778277,17826851,16778277,0,0,26377],[16778280,17826854,16778280,0,0,26377],[16778283,17826857,16778283,0,0,26377],[16778286,17826860,16778286,0,0,26377],[16778289,17826863,16778289,0,0,26377],[16778292,17826866,16778292,0,0,26377],[16778295,17826869,16778295,0,0,26377],[16778298,17826872,16778298,0,0,26377],[16778301,17826875,16778301,0,0,26377],[16778304,17826878,16778304,0,0,26377],[16778307,17826881,16778307,0,0,26377],[16778310,17826884,16778310,0,0,26377],[16778313,17826887,16778313,0,0,26377],[16778316,17826890,16778316,0,0,26377],[16778319,17826893,16778319,0,0,26377],[16778322,17826896,16778322,0,0,26377],[16778325,17826899,16778325,0,0,26377],[16778328,17826902,16778328,0,0,26377],[16778331,17826905,16778331,0,0,26377],[16778334,17826908,16778334,0,0,26377],[33555554,18875487,33555556,0,0,26377],[33555561,18875494,33555563,0,0,26377],[33555568,18875501,33555570,0,0,26377],[50332792,19924084,50332795,0,0,26377],[50332802,19924094,50332805,0,0,26377],[33555595,18875528,33555597,0,0,26377],[33555602,18875535,33555604,0,0,26377],[33555609,18875542,33555611,0,0,26377],[33555616,18875549,33555618,0,0,26377],[33555623,18875556,33555625,0,0,26377],[33555630,18875563,33555632,0,0,26377],[33555637,18875570,33555639,0,0,26377],[0,0,0,0,0,1025],[0,0,0,0,0,5633],[0,40,0,0,0,10113],[-40,0,-40,0,0,9993],[0,0,0,0,0,9344]],B=0,D=1,E=2,F=3,G=4,H=5,I=[181,956,924,223,115,115,83,83,83,115,105,775,304,329,700,110,700,78,383,115,83,496,106,780,74,780,837,953,921,912,953,776,769,921,776,769,944,965,776,769,933,776,769,962,963,931,976,946,914,977,952,920,981,966,934,982,960,928,1008,954,922,1009,961,929,1013,949,917,1415,1381,1410,1333,1362,1333,1410,43888,5024,5024,43889,5025,5025,43890,5026,5026,43891,5027,5027,43892,5028,5028,43893,5029,5029,43894,5030,5030,43895,5031,5031,43896,5032,5032,43897,5033,5033,43898,5034,5034,43899,5035,5035,43900,5036,5036,43901,5037,5037,43902,5038,5038,43903,5039,5039,43904,5040,5040,43905,5041,5041,43906,5042,5042,43907,5043,5043,43908,5044,5044,43909,5045,5045,43910,5046,5046,43911,5047,5047,43912,5048,5048,43913,5049,5049,43914,5050,5050,43915,5051,5051,43916,5052,5052,43917,5053,5053,43918,5054,5054,43919,5055,5055,43920,5056,5056,43921,5057,5057,43922,5058,5058,43923,5059,5059,43924,5060,5060,43925,5061,5061,43926,5062,5062,43927,5063,5063,43928,5064,5064,43929,5065,5065,43930,5066,5066,43931,5067,5067,43932,5068,5068,43933,5069,5069,43934,5070,5070,43935,5071,5071,43936,5072,5072,43937,5073,5073,43938,5074,5074,43939,5075,5075,43940,5076,5076,43941,5077,5077,43942,5078,5078,43943,5079,5079,43944,5080,5080,43945,5081,5081,43946,5082,5082,43947,5083,5083,43948,5084,5084,43949,5085,5085,43950,5086,5086,43951,5087,5087,43952,5088,5088,43953,5089,5089,43954,5090,5090,43955,5091,5091,43956,5092,5092,43957,5093,5093,43958,5094,5094,43959,5095,5095,43960,5096,5096,43961,5097,5097,43962,5098,5098,43963,5099,5099,43964,5100,5100,43965,5101,5101,43966,5102,5102,43967,5103,5103,5112,5104,5104,5113,5105,5105,5114,5106,5106,5115,5107,5107,5116,5108,5108,5117,5109,5109,5112,5104,5104,5113,5105,5105,5114,5106,5106,5115,5107,5107,5116,5108,5108,5117,5109,5109,7830,104,817,72,817,7831,116,776,84,776,7832,119,778,87,778,7833,121,778,89,778,7834,97,702,65,702,7835,7777,7776,223,115,115,7838,8016,965,787,933,787,8018,965,787,768,933,787,768,8020,965,787,769,933,787,769,8022,965,787,834,933,787,834,8064,7936,953,7944,921,8072,8065,7937,953,7945,921,8073,8066,7938,953,7946,921,8074,8067,7939,953,7947,921,8075,8068,7940,953,7948,921,8076,8069,7941,953,7949,921,8077,8070,7942,953,7950,921,8078,8071,7943,953,7951,921,8079,8064,7936,953,7944,921,8072,8065,7937,953,7945,921,8073,8066,7938,953,7946,921,8074,8067,7939,953,7947,921,8075,8068,7940,953,7948,921,8076,8069,7941,953,7949,921,8077,8070,7942,953,7950,921,8078,8071,7943,953,7951,921,8079,8080,7968,953,7976,921,8088,8081,7969,953,7977,921,8089,8082,7970,953,7978,921,8090,8083,7971,953,7979,921,8091,8084,7972,953,7980,921,8092,8085,7973,953,7981,921,8093,8086,7974,953,7982,921,8094,8087,7975,953,7983,921,8095,8080,7968,953,7976,921,8088,8081,7969,953,7977,921,8089,8082,7970,953,7978,921,8090,8083,7971,953,7979,921,8091,8084,7972,953,7980,921,8092,8085,7973,953,7981,921,8093,8086,7974,953,7982,921,8094,8087,7975,953,7983,921,8095,8096,8032,953,8040,921,8104,8097,8033,953,8041,921,8105,8098,8034,953,8042,921,8106,8099,8035,953,8043,921,8107,8100,8036,953,8044,921,8108,8101,8037,953,8045,921,8109,8102,8038,953,8046,921,8110,8103,8039,953,8047,921,8111,8096,8032,953,8040,921,8104,8097,8033,953,8041,921,8105,8098,8034,953,8042,921,8106,8099,8035,953,8043,921,8107,8100,8036,953,8044,921,8108,8101,8037,953,8045,921,8109,8102,8038,953,8046,921,8110,8103,8039,953,8047,921,8111,8114,8048,953,8122,921,8122,837,8115,945,953,913,921,8124,8116,940,953,902,921,902,837,8118,945,834,913,834,8119,945,834,953,913,834,921,913,834,837,8115,945,953,913,921,8124,8126,953,921,8130,8052,953,8138,921,8138,837,8131,951,953,919,921,8140,8132,942,953,905,921,905,837,8134,951,834,919,834,8135,951,834,953,919,834,921,919,834,837,8131,951,953,919,921,8140,8146,953,776,768,921,776,768,8147,953,776,769,921,776,769,8150,953,834,921,834,8151,953,776,834,921,776,834,8162,965,776,768,933,776,768,8163,965,776,769,933,776,769,8164,961,787,929,787,8166,965,834,933,834,8167,965,776,834,933,776,834,8178,8060,953,8186,921,8186,837,8179,969,953,937,921,8188,8180,974,953,911,921,911,837,8182,969,834,937,834,8183,969,834,953,937,834,921,937,834,837,8179,969,953,937,921,8188,43888,5024,5024,43889,5025,5025,43890,5026,5026,43891,5027,5027,43892,5028,5028,43893,5029,5029,43894,5030,5030,43895,5031,5031,43896,5032,5032,43897,5033,5033,43898,5034,5034,43899,5035,5035,43900,5036,5036,43901,5037,5037,43902,5038,5038,43903,5039,5039,43904,5040,5040,43905,5041,5041,43906,5042,5042,43907,5043,5043,43908,5044,5044,43909,5045,5045,43910,5046,5046,43911,5047,5047,43912,5048,5048,43913,5049,5049,43914,5050,5050,43915,5051,5051,43916,5052,5052,43917,5053,5053,43918,5054,5054,43919,5055,5055,43920,5056,5056,43921,5057,5057,43922,5058,5058,43923,5059,5059,43924,5060,5060,43925,5061,5061,43926,5062,5062,43927,5063,5063,43928,5064,5064,43929,5065,5065,43930,5066,5066,43931,5067,5067,43932,5068,5068,43933,5069,5069,43934,5070,5070,43935,5071,5071,43936,5072,5072,43937,5073,5073,43938,5074,5074,43939,5075,5075,43940,5076,5076,43941,5077,5077,43942,5078,5078,43943,5079,5079,43944,5080,5080,43945,5081,5081,43946,5082,5082,43947,5083,5083,43948,5084,5084,43949,5085,5085,43950,5086,5086,43951,5087,5087,43952,5088,5088,43953,5089,5089,43954,5090,5090,43955,5091,5091,43956,5092,5092,43957,5093,5093,43958,5094,5094,43959,5095,5095,43960,5096,5096,43961,5097,5097,43962,5098,5098,43963,5099,5099,43964,5100,5100,43965,5101,5101,43966,5102,5102,43967,5103,5103,64256,102,102,70,70,70,102,64257,102,105,70,73,70,105,64258,102,108,70,76,70,108,64259,102,102,105,70,70,73,70,102,105,64260,102,102,108,70,70,76,70,102,108,64261,115,116,83,84,83,116,64262,115,116,83,84,83,116,64275,1396,1398,1348,1350,1348,1398,64276,1396,1381,1348,1333,1348,1381,64277,1396,1387,1348,1339,1348,1387,64278,1406,1398,1358,1350,1358,1398,64279,1396,1389,1348,1341,1348,1389],J=7,K=[36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74,78,79,80,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,104,105,106,112,113,118,119,155,156,157,158,159,162,163,166,167,168,173,174,177,178,188,189,190,191,197,198,199,207,208,222,223,231,232,236,237,257,258,264,265,281,282,283,300,301,302,319,320,321,329,330,332,333,334,335,336,337,338,339,340,341,342,343,344,431,432,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,526,527,528,529,530,531,532,533,534,535,536,537,538,540,541,544,545,546,547,548,549,550,551,553,554,555,556,557,558,559,561,562,565,566,576,583,584,585,586,587,608,616,617,648,652,653,720,724,725,726,727,728,734,735,736,864,865,888,889,890,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,948,949,950,976,977,978,988,989,990,992,993,994,995,996,997,998,999,1e3,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1024,1025,1026,1027,1042,1043,1044,1045,1046,1047,1095,1096,1107,1108,1142,1143,1220,1221,1357,1358,1390,1391,1392,1393,1437,1438,1520,1521,1522,1524,1525,7168,7169,7170,7171,7172,7680,8191,8192,8703,8704],L=[34,35,36,37,38,39,34,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,64,68,69,64,70,71,72,73,74,75,76,77,64,78,79,80,81,82,83,84,64,85,86,34,87,34,88,34,89,90,91,92,34,93,34,94,95,34,96,34,97,34,98,99,100,34,101,102,34,103,34,104,34,105,34,101,34,104,34,106,34,107,108,34,109,110,34,111,112,34,113,34,114,115,116,117,118,119,120,121,122,123,124,125,34,126,127,128,129,130,131,132,133,134,34,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,145,34,152,145,153,154,155,156,157,158,159,160,161,162,145,163,145,164,165,166,167,168,169,170,145,171,145,172,173,174,175,145,176,145,177,145,34,178,179,34,180,145,34,181,145,34,182,145,34,183,184,185,186,145,187,188,145,189,145,190,191,145,64,192,193,194,195,145,196,145,197,198,199,200,201,202,203,204,64,205,206,145,34,207,145,208,209,145,210,211,212,213,214,145,64,215,64,216,217,64,218,219,220,221,222,223,224,145,225,226,227,34,87,228,34,229,230,34,231,34,232,34,233,34,234,34,235,34,236,34,237,34,238,145,34,231,34,239,145,240,145,241,242,145,127,243,127,243],M=[9,10,14,28,31,32,33,39,40,46,47,48,49,50,51,52,53,54,55,56,57,58,59,65,91,94,95,96,97,123,127,133,134,160,161,168,169,170,171,173,174,175,176,178,179,180,181,182,183,184,185,186,187,188,191,192,215,216,223,224,247,248,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,428,429,430,431,432,433,435,436,437,438,439,440,441,442,443,444,445,446,447,448,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,570,571,572,573,574,575,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,600,601,602,603,604,605,608,609,610,611,612,613,614,615,616,617,618,619,620,621,623,624,625,626,627,629,630,637,638,640,641,643,644,647,648,649,650,652,653,658,659,660,661,669,670,671,688,697,704,706,710,722,736,741,748,749,750,751,768,837,838,880,881,882,883,884,885,886,887,888,890,891,894,895,896,900,902,903,904,907,908,909,910,912,913,930,931,940,941,944,945,962,963,972,973,975,976,977,978,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1e3,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1024,1040,1072,1104,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1160,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1367,1369,1370,1376,1377,1415,1416,1417,1419,1421,1424,1425,1470,1471,1472,1473,1475,1476,1478,1479,1480,1488,1515,1520,1523,1524,1525,1536,1542,1552,1563,1564,1565,1566,1568,1600,1601,1611,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1646,1648,1649,1748,1749,1750,1757,1758,1759,1765,1767,1769,1770,1774,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1789,1791,1792,1806,1807,1808,1809,1810,1840,1867,1869,1958,1969,1970,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,2027,2036,2038,2042,2043,2048,2070,2074,2075,2084,2085,2088,2089,2094,2096,2111,2112,2137,2140,2142,2143,2208,2229,2275,2307,2308,2362,2363,2364,2365,2366,2369,2377,2381,2382,2384,2385,2392,2402,2404,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2433,2434,2436,2437,2445,2447,2449,2451,2473,2474,2481,2482,2483,2486,2490,2492,2493,2494,2497,2501,2503,2505,2507,2509,2510,2511,2519,2520,2524,2526,2527,2530,2532,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2546,2548,2554,2556,2561,2563,2564,2565,2571,2575,2577,2579,2601,2602,2609,2610,2612,2613,2615,2616,2618,2620,2621,2622,2625,2627,2631,2633,2635,2638,2641,2642,2649,2653,2654,2655,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2674,2677,2678,2689,2691,2692,2693,2702,2703,2706,2707,2729,2730,2737,2738,2740,2741,2746,2748,2749,2750,2753,2758,2759,2761,2762,2763,2765,2766,2768,2769,2784,2786,2788,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2802,2809,2810,2817,2818,2820,2821,2829,2831,2833,2835,2857,2858,2865,2866,2868,2869,2874,2876,2877,2878,2879,2880,2881,2885,2887,2889,2891,2893,2894,2902,2903,2904,2908,2910,2911,2914,2916,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2936,2946,2947,2948,2949,2955,2958,2961,2962,2966,2969,2971,2972,2973,2974,2976,2979,2981,2984,2987,2990,3002,3006,3008,3009,3011,3014,3017,3018,3021,3022,3024,3025,3031,3032,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3059,3067,3072,3073,3076,3077,3085,3086,3089,3090,3113,3114,3130,3133,3134,3137,3141,3142,3145,3146,3150,3157,3159,3160,3163,3168,3170,3172,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3192,3199,3200,3201,3202,3204,3205,3213,3214,3217,3218,3241,3242,3252,3253,3258,3260,3261,3262,3263,3264,3269,3270,3271,3273,3274,3276,3278,3285,3287,3294,3295,3296,3298,3300,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3315,3329,3330,3332,3333,3341,3342,3345,3346,3387,3389,3390,3393,3397,3398,3401,3402,3405,3406,3407,3415,3416,3423,3426,3428,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3446,3449,3450,3456,3458,3460,3461,3479,3482,3506,3507,3516,3517,3518,3520,3527,3530,3531,3535,3538,3541,3542,3543,3544,3552,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3570,3572,3573,3585,3633,3634,3635,3636,3643,3647,3648,3654,3655,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3676,3713,3715,3716,3717,3719,3721,3722,3723,3725,3726,3732,3736,3737,3744,3745,3748,3749,3750,3751,3752,3754,3756,3757,3761,3762,3763,3764,3770,3771,3773,3774,3776,3781,3782,3783,3784,3790,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3804,3808,3840,3841,3864,3866,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3892,3893,3894,3895,3896,3897,3898,3902,3904,3912,3913,3949,3953,3967,3968,3973,3974,3976,3981,3992,3993,4029,4030,4038,4039,4045,4046,4059,4096,4139,4141,4145,4146,4152,4153,4155,4157,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4176,4182,4184,4186,4190,4193,4194,4197,4199,4206,4209,4213,4226,4227,4229,4231,4237,4238,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4253,4254,4256,4294,4295,4296,4301,4302,4304,4347,4348,4349,4553,4554,4558,4560,4567,4568,4569,4570,4574,4576,4617,4618,4622,4624,4657,4658,4662,4664,4671,4672,4673,4674,4678,4680,4695,4696,4753,4754,4758,4760,4827,4829,4832,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4861,4864,4880,4890,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,4981,4982,4984,4985,4986,4987,4988,4989,4990,4992,4993,5229,5231,5248,5249,5275,5277,5280,5355,5358,5361,5369,5376,5389,5390,5394,5397,5408,5426,5429,5431,5440,5458,5460,5472,5485,5486,5489,5490,5492,5504,5556,5558,5559,5566,5574,5575,5577,5588,5591,5592,5596,5597,5598,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5616,5626,5632,5643,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5664,5699,5700,5752,5760,5801,5802,5803,5808,5878,5888,5919,5920,5923,5927,5929,5932,5936,5938,5939,5945,5948,5952,5953,5956,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5998,6e3,6005,6016,6060,6064,6090,6096,6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6110,6144,6167,6169,6171,6172,6174,6176,6229,6230,6231,6232,6239,6240,6241,6242,6243,6245,6253,6259,6269,6271,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6304,6311,6312,6318,6320,6334,6335,6400,6404,6405,6452,6453,6454,6459,6460,6461,6466,6467,6469,6476,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6507,6516,6525,6528,6530,6531,6561,6562,6566,6568,6570,6571,6574,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6630,6631,6632,6634,6637,6638,6639,6642,6644,6652,6656,6692,6700,6708,6710,6712,6715,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6733,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6776,6782,6784,6848,6856,6864,6867,6868,6881,6882,6889,6893,6894,6898,6900,6901,6903,6904,6906,6912,6956,7019,7032,7033,7034,7037,7038,7067,7104,7158,7164,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,7424,7432,7440,7446,7448,7454,7456,7464,7472,7480,7488,7494,7496,7502,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7528,7536,7538,7542,7544,7546,7548,7550,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7602,7603,7604,7605,7606,7607,7608,7610,7612,7613,7614,7615,7618,7619,7620,7621,7622,7623,7624,7628,7629,7632,7634,7635,7636,7638,7639,7640,7642,7644,7645,7648,7650,7651,7652,7653,7654,7655,7656,7658,7660,7661,7664,7666,7667,7668,7669,7670,7671,7672,7674,7676,7677,7679,7680,7691,7696,7704,7706,7716,7717,7719,7720,7722,7727,7728,7743,7745,7764,7765,7775,7776,7781,7782,7792,7793,7794,7796,7797,7798,7799,7800,7801,7802,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7823,7824,7837,7840,7871,7888,7901,7905,7906,7909,7921,7936,7938,7939,7943,7944,7946,7947,7950,7952,7955,7956,7957,7958,7960,7961,7966,7972,7973,7974,7975,7976,7977,7978,7979,7980,7982,7983,7984,7986,7987,7988,7989,7993,7994,7996,7998,8e3,8005,8006,8010,8014,8015,8016,8032,8048,8064,8067,8068,8069,8073,8074,8076,8080,8443,8448,8487,8512,8523,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8604,8630,8656,8682,8683,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,9076,9078,9110,9112,9146,9149,9161,9162,9170,9196,9200,9216,9263,9264,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9340,9342,9344,9345,9346,9347,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9451,9452,9453,9454,9455,9458,9459,9460,9465,9469,9470,9472,9510,9511,9512,9517,9518,9520,9576,9583,9584,9585,9599,9600,9623,9632,9639,9640,9647,9648,9655,9656,9663,9664,9671,9672,9679,9680,9687,9688,9695,9696,9728,9775,9776,9795,9856,9882,9883,9972,9984,10070,10096,10108,10112,10113,10117,10118,10119,10120,10145,10154,10158,10160,10161,10166,10168,10171,10172,10173,10176,10177,10263,10265,10267,10269,10271,10272,10273,10363,10364,10367,10368,10373,10414,10417,10511,10512,10514,10518,10528,10555,10560,10596,10608,10624,10655,10656,10666,10696,10704,10705,10720,10752,10762,10801,10816,10879,10880,10885,10886,11011,11012,11178,11179,11341,11342,11446,11456,11520,11521,11523,11524,11527,11528,11529,11530,11613,11614,11660,11661,11668,11669,11670,11671,11711,11713,11743,11744,11752,11753,11789,11790,11888,11889,11908,11909,11974,11975,12009,12010,12011,12012,12013,12014,12097,12098,12099,12102,12108,12109,12225,12229,12379,12380,12529,12530,12537,12538,12666,12667,12798,12800,12812,12815,12816,12817,13054,13055,13132,13133,13266,13267,13318,13319,13462,13463,13612,13613,13742,13743,13747,13748,13872,13873,13985,13986,14022,14023,14028,14029,14072,14073,14198,14199,14294,14336,14357,14358,14477,14480,14535,14544,14584,14590,14592,14604,14605,14608,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14636,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14707,14708,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14750,14752,14822,14832,14834,14840,14848,14871,14880,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14998,14999,15e3,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15024,15025,15026,15027,15028,15029,15030,15031,15032,15095,15096,15098,15099,15106,15107,15110,15111,15115,15116,15139,15141,15143,15144,15148,15152,15158,15162,15168,15220,15224,15232,15234,15284,15300,15301,15310,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15328,15346,15352,15355,15356,15357,15358,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15398,15406,15408,15431,15442,15444,15455,15456,15485,15488,15491,15492,15539,15540,15542,15546,15548,15549,15553,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15582,15584,15589,15590,15591,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15615,15616,15657,15663,15665,15667,15669,15671,15680,15683,15684,15692,15693,15694,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15708,15712,15728,15729,15735,15738,15739,15740,15741,15742,15792,15793,15794,15797,15799,15801,15806,15808,15809,15810,15811,15835,15837,15838,15840,15851,15852,15854,15856,15858,15859,15861,15862,15863,15873,15879,15881,15887,15889,15895,15904,15911,15912,15919,15920,15955,15956,15963,15964,15968,15974,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16e3,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16099,16101,16102,16104,16105,16107,16108,16109,16110,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16128,16164,16176,16199,16203,16252,16256,16384,16491,16492,16499,16500,16504,16505,16562,16563,16593,16594,16595,16596,16637,16638,16750,16752,16858,16896,16897,16898,16899,16900,16901,16902,16903,16915,16916,16917,16918,16919,16920,16925,16926,16927,16937,16938,16951,16952,16957,16958,16959,16960,16962,16963,16965,16966,17074,17090,17107,17246,17252,17342,17344,17360,17424,17426,17480,17520,17530,17532,17534,17536,17552,17555,17556,17562,17568,17584,17587,17589,17613,17616,17618,17619,17620,17621,17622,17639,17640,17644,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17789,17791,17792,17793,17799,17800,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17825,17851,17854,17855,17856,17857,17883,17894,17904,17905,17950,17952,17983,17986,17992,17994,18e3,18002,18008,18010,18013,18016,18019,18020,18023,18024,18031,18041,18044,18046,18048,18060,18061,18087,18088,18107,18108,18110,18111,18126,18128,18142,18176,18299,18304,18307,18311,18356,18359,18368,18421,18425,18442,18444,18445,18448,18460,18464,18465,18512,18557,18558,18688,18717,18720,18769,18784,18785,18812,18816,18848,18852,18864,18881,18882,18890,18891,18896,18934,18939,18944,18974,18975,18976,19012,19016,19024,19025,19030,19072,19112,19152,19230,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19328,19368,19376,19428,19439,19440,19456,19511,19520,19542,19552,19560,19584,19590,19592,19593,19594,19638,19639,19641,19644,19645,19647,19670,19671,19672,19680,19703,19705,19712,19743,19751,19760,19808,19827,19828,19830,19835,19840,19862,19868,19871,19872,19898,19903,19904,19968,20024,20028,20030,20032,20048,20050,20096,20097,20100,20101,20103,20108,20112,20116,20117,20120,20121,20148,20152,20155,20159,20160,20161,20162,20163,20164,20168,20176,20185,20192,20221,20223,20224,20253,20256,20288,20296,20297,20325,20327,20331,20336,20343,20352,20406,20409,20416,20438,20440,20448,20467,20472,20480,20498,20505,20509,20521,20528,20608,20681,20736,20787,20800,20851,20858,20864,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20991,20992,20993,20994,20995,21048,21063,21070,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21119,21122,21123,21168,21171,21175,21177,21179,21181,21182,21186,21200,21225,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21248,21251,21287,21292,21293,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21316,21328,21363,21364,21366,21367,21376,21378,21379,21427,21430,21439,21441,21445,21450,21453,21454,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21472,21473,21493,21504,21522,21523,21548,21551,21554,21556,21557,21558,21560,21566,21632,21639,21640,21641,21642,21646,21647,21662,21663,21673,21674,21680,21727,21728,21731,21739,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21760,21762,21764,21765,21773,21775,21777,21779,21801,21802,21809,21810,21812,21813,21818,21820,21821,21822,21824,21825,21829,21831,21833,21835,21838,21840,21841,21847,21848,21853,21858,21860,21862,21869,21872,21877,21888,21936,21939,21945,21946,21947,21951,21953,21954,21956,21958,21959,21960,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,22016,22063,22066,22070,22072,22076,22078,22079,22081,22104,22108,22110,22144,22192,22195,22203,22205,22206,22207,22209,22212,22213,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22272,22315,22316,22317,22318,22320,22326,22327,22328,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22400,22426,22429,22432,22434,22438,22439,22444,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22460,22464,22560,22592,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22643,22655,22656,22720,22777,22784,22810,22912,23023,23024,23029,23040,23108,23168,23215,23296,23367,23424,23481,23488,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23534,23536,23632,23662,23664,23669,23670,23680,23728,23735,23744,23748,23750,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23778,23779,23800,23805,23824,23936,24005,24016,24017,24063,24079,24083,24096,24192,24194,24320,24427,24432,24445,24448,24457,24464,24474,24476,24477,24479,24480,24484,24576,24694,24704,24743,24745,24805,24807,24810,24813,24819,24827,24835,24837,24844,24874,24878,24937,24960,25026,25029,25030,25088,25175,25184,25202,25216,25242,25268,25294,25301,25302,25320,25346,25372,25373,25374,25376,25378,25379,25381,25383,25385,25389,25390,25398,25402,25403,25404,25405,25412,25413,25424,25450,25476,25478,25479,25483,25485,25493,25494,25501,25502,25528,25530,25531,25535,25536,25541,25542,25543,25546,25553,25554,25580,25606,25632,25658,25684,25710,25736,25762,25788,25814,25840,25866,25894,25896,25921,25922,25947,25948,25954,25979,25980,26005,26006,26012,26037,26038,26063,26064,26070,26095,26096,26121,26122,26128,26153,26154,26179,26180,26186,26187,26188,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26295,26299,26349,26357,26358,26372,26373,26380,26395,26400,26401,26416,26496,26565,26567,26576,26583,26624,26628,26629,26656,26657,26659,26660,26661,26663,26664,26665,26675,26676,26680,26681,26682,26683,26684,26690,26691,26695,26696,26697,26698,26699,26700,26701,26704,26705,26707,26708,26709,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26723,26724,26725,26727,26731,26732,26739,26740,26744,26745,26749,26750,26751,26752,26762,26763,26780,26785,26788,26789,26794,26795,26812,26864,26866,26880,26924,26928,27028,27040,27055,27057,27072,27073,27088,27089,27126,27136,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27149,27152,27183,27184,27210,27216,27242,27244,27248,27274,27291,27366,27395,27408,27451,27456,27465,27472,27474,27520,27643,27648,27770,27771,27812,27813,27985,28e3,28013,28016,28020,28032,28148,28160,28245,28288,28300,28304,28360,28368,28378,28384,28424,28432,28462,28560,28569,28672,28677,28736,28737,28800,28801,28802,28900,28901,29026,29027,29089,29090,29187,29188,29196,29197,29212,29213,29418,29419,29437,29438,29465,29466,29584,29585,29720,29721,29851,29852,30061,30062,30167,30208,30261,30272,30366,30368,30498,30592,30622,30721,30722,30752,30848,31088,31104,31230,31232],N=[1,2,3,1,3,2,4,5,6,5,6,5,7,8,9,10,11,12,13,14,15,16,6,5,17,5,6,18,6,19,5,1,3,1,2,5,6,5,20,5,21,5,6,5,22,23,6,24,5,25,6,26,20,5,27,5,17,5,17,28,19,5,19,29,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,32,33,30,31,30,31,30,31,20,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,34,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,35,30,31,30,31,30,31,36,37,38,30,31,30,31,39,30,31,40,30,31,20,41,42,43,30,31,40,44,45,46,47,30,31,48,20,46,49,50,51,30,31,30,31,30,31,52,30,31,52,20,30,31,52,30,31,53,30,31,30,31,54,30,31,20,55,30,31,20,56,55,57,58,59,57,58,59,57,58,59,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,60,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,61,57,58,59,30,31,62,63,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,64,20,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,20,65,30,31,66,67,68,30,31,69,70,71,30,31,30,31,30,31,30,31,30,31,72,73,74,75,76,20,77,20,78,20,79,80,20,77,81,20,82,20,83,84,20,85,86,20,87,88,20,86,20,89,90,20,91,20,92,20,93,20,93,20,94,93,95,96,97,20,98,20,55,20,99,100,20,101,102,101,6,102,6,101,6,102,6,102,6,25,103,25,30,31,30,31,102,6,30,31,0,104,50,5,105,0,6,106,25,107,0,108,0,109,110,17,0,17,111,112,113,19,114,19,115,116,117,118,119,120,121,122,123,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,124,125,126,127,128,129,5,30,31,130,30,31,20,64,131,17,19,132,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,5,25,6,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,133,30,31,30,31,30,31,30,31,30,31,30,31,30,31,134,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,0,135,0,102,5,0,136,137,0,5,0,5,0,25,5,25,5,25,5,25,5,25,0,55,0,55,5,6,0,21,5,25,5,21,0,5,55,102,55,25,7,8,9,10,11,12,13,14,15,16,5,55,25,55,5,55,25,21,5,25,102,25,5,25,55,7,8,9,10,11,12,13,14,15,16,55,5,55,5,0,21,55,25,55,25,0,55,25,55,0,7,8,9,10,11,12,13,14,15,16,55,25,102,5,102,0,55,25,102,25,102,25,102,25,0,5,0,55,25,0,5,0,55,0,25,18,55,25,18,25,55,18,25,18,25,18,55,25,55,25,5,7,8,9,10,11,12,13,14,15,16,5,102,55,25,18,0,55,0,55,0,55,0,55,0,55,0,55,0,25,55,18,25,0,18,0,18,25,55,0,18,0,55,0,55,25,0,7,8,9,10,11,12,13,14,15,16,55,5,27,5,0,25,18,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,25,0,18,25,0,25,0,25,0,25,0,55,0,55,0,7,8,9,10,11,12,13,14,15,16,25,55,25,0,25,18,0,55,0,55,0,55,0,55,0,55,0,55,0,25,55,18,25,0,25,18,0,18,25,0,55,0,55,25,0,7,8,9,10,11,12,13,14,15,16,5,0,55,0,25,18,0,55,0,55,0,55,0,55,0,55,0,55,0,25,55,18,25,18,25,0,18,0,18,25,0,25,18,0,55,0,55,25,0,7,8,9,10,11,12,13,14,15,16,5,55,27,0,25,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,18,25,18,0,18,0,18,25,0,55,0,18,0,7,8,9,10,11,12,13,14,15,16,27,5,0,25,18,0,55,0,55,0,55,0,55,0,55,25,18,0,25,0,25,0,25,0,55,0,55,25,0,7,8,9,10,11,12,13,14,15,16,0,27,5,0,25,18,0,55,0,55,0,55,0,55,0,55,0,25,55,18,25,18,0,25,18,0,18,25,0,18,0,55,0,55,25,0,7,8,9,10,11,12,13,14,15,16,0,55,0,25,18,0,55,0,55,0,55,0,55,18,25,0,18,0,18,25,55,0,18,0,55,25,0,7,8,9,10,11,12,13,14,15,16,27,0,5,55,0,18,0,55,0,55,0,55,0,55,0,55,0,25,0,18,25,0,25,0,18,0,7,8,9,10,11,12,13,14,15,16,0,18,5,0,55,25,55,138,25,0,5,55,102,25,5,7,8,9,10,11,12,13,14,15,16,5,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,25,55,138,25,0,25,55,0,55,0,102,0,25,0,7,8,9,10,11,12,13,14,15,16,0,55,0,55,5,25,5,7,8,9,10,11,12,13,14,15,16,27,5,25,5,25,5,25,5,18,55,0,55,0,25,18,25,5,25,55,25,0,25,0,5,25,5,0,5,0,55,18,25,18,25,18,25,18,25,55,7,8,9,10,11,12,13,14,15,16,5,55,18,25,55,25,55,18,55,18,55,25,55,25,18,25,18,25,55,18,7,8,9,10,11,12,13,14,15,16,18,25,5,139,0,139,0,139,0,55,5,102,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,25,5,140,141,142,143,144,145,146,147,148,27,0,55,5,0,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,0,235,236,237,238,239,240,0,5,55,5,55,2,55,5,0,55,5,241,55,0,55,0,55,25,0,55,25,5,0,55,25,0,55,0,55,0,25,0,55,25,18,25,18,25,18,25,5,102,5,55,25,0,7,8,9,10,11,12,13,14,15,16,0,27,0,5,25,21,0,7,8,9,10,11,12,13,14,15,16,0,55,102,55,0,55,25,55,0,55,0,55,0,25,18,25,18,0,18,25,18,25,0,5,0,5,7,8,9,10,11,12,13,14,15,16,55,0,55,0,55,0,55,0,7,8,9,10,11,12,13,14,15,16,140,0,5,55,25,18,25,0,5,55,18,25,18,25,0,25,18,25,18,25,18,25,0,25,7,8,9,10,11,12,13,14,15,16,0,7,8,9,10,11,12,13,14,15,16,0,5,102,5,0,25,6,0,25,18,55,25,18,25,18,25,18,25,18,55,0,7,8,9,10,11,12,13,14,15,16,5,25,5,0,25,18,55,18,25,18,25,18,25,55,7,8,9,10,11,12,13,14,15,16,55,25,18,25,18,25,18,25,18,0,5,55,18,25,18,25,0,5,7,8,9,10,11,12,13,14,15,16,0,55,7,8,9,10,11,12,13,14,15,16,55,102,5,0,5,0,25,5,25,18,25,55,25,55,18,25,55,0,25,0,20,101,20,101,242,20,243,20,101,25,0,25,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,244,245,246,247,248,249,20,250,20,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,251,252,251,0,252,0,251,252,251,252,251,0,252,0,253,251,254,251,255,251,256,251,0,252,0,252,0,252,0,252,251,252,257,258,259,260,261,262,0,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,251,311,312,313,0,314,315,252,316,317,6,318,6,319,320,321,0,322,323,324,325,6,251,326,327,0,328,329,252,330,0,6,251,331,332,333,126,334,335,252,336,130,6,0,337,338,339,0,340,341,342,343,344,6,0,2,21,5,6,5,6,5,6,3,21,2,5,18,5,18,5,2,21,0,21,345,101,0,346,347,348,349,350,351,5,101,345,26,22,23,346,347,348,349,350,351,5,0,101,0,5,0,25,6,25,6,25,0,5,120,5,120,5,20,120,20,120,20,5,120,5,352,120,5,120,5,353,5,120,5,354,355,120,352,20,120,356,120,20,55,20,5,20,120,5,120,20,5,357,5,27,358,359,241,30,31,241,27,5,0,5,0,5,0,5,0,26,22,23,346,347,348,349,350,351,27,26,22,23,346,347,348,349,350,351,27,26,22,23,346,347,348,349,350,351,27,5,360,361,345,27,26,22,23,346,347,348,349,350,351,27,345,5,26,22,23,346,347,348,349,350,351,27,26,22,23,346,347,348,349,350,351,27,26,22,23,346,347,348,349,350,351,27,5,0,5,0,5,0,5,0,5,0,5,0,135,0,136,0,30,31,362,363,364,365,366,30,31,30,31,30,31,367,368,369,370,20,30,31,20,30,31,20,101,371,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,20,5,30,31,30,31,25,30,31,0,5,27,5,372,0,372,0,372,0,55,0,102,5,0,25,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,25,5,373,5,0,5,0,5,0,5,0,5,0,2,5,102,55,241,5,241,25,18,5,102,5,241,102,55,5,0,55,0,25,6,102,55,5,55,5,102,55,0,55,0,55,0,5,27,5,55,0,5,0,55,5,0,27,5,27,5,27,5,27,5,27,5,0,55,374,55,374,55,374,55,374,55,0,5,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,0,55,102,55,0,5,0,55,102,5,55,102,5,55,7,8,9,10,11,12,13,14,15,16,55,0,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,55,25,6,5,25,5,102,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,101,25,55,241,25,5,0,6,102,6,30,31,30,31,30,31,30,31,30,31,30,31,30,31,20,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,101,20,30,31,30,31,375,30,31,30,31,30,31,30,31,30,31,102,6,30,31,376,20,55,30,31,30,31,20,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,30,31,377,378,379,380,0,381,382,383,384,30,31,30,31,0,55,101,20,55,25,55,25,55,25,55,18,25,18,5,0,27,5,0,55,5,0,18,55,18,25,0,5,7,8,9,10,11,12,13,14,15,16,0,25,55,5,55,5,55,0,7,8,9,10,11,12,13,14,15,16,55,25,5,55,25,18,0,5,55,0,25,18,55,25,18,25,18,25,18,5,0,102,7,8,9,10,11,12,13,14,15,16,0,5,55,25,102,55,7,8,9,10,11,12,13,14,15,16,55,0,55,25,18,25,18,25,0,55,25,55,25,18,0,7,8,9,10,11,12,13,14,15,16,0,5,55,102,55,5,55,18,25,18,55,25,55,25,55,25,55,25,55,25,55,0,55,102,5,55,18,25,18,5,55,102,18,25,0,55,0,55,0,55,0,55,0,55,0,20,385,20,6,101,20,0,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,55,18,25,18,25,18,5,18,25,0,7,8,9,10,11,12,13,14,15,16,0,55,0,55,0,55,0,1,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,0,55,0,466,467,468,469,470,471,472,0,473,474,475,476,477,0,55,25,55,5,55,0,55,0,55,0,55,0,55,0,55,6,0,55,478,55,5,0,55,0,55,0,55,478,5,0,25,5,6,5,0,25,5,18,5,18,5,6,0,5,6,5,0,5,0,478,55,478,55,478,0,478,55,478,55,478,55,478,55,478,55,0,21,0,5,6,5,6,5,7,8,9,10,11,12,13,14,15,16,6,5,17,5,6,18,6,19,5,55,102,55,479,55,0,55,0,55,0,55,0,55,0,5,6,5,0,5,0,21,5,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,5,0,27,0,5,241,27,5,27,5,0,5,0,5,0,5,25,0,55,0,55,0,25,27,0,55,27,0,55,241,55,241,0,55,25,0,55,0,5,55,0,55,5,241,0,480,481,55,0,7,8,9,10,11,12,13,14,15,16,0,55,0,55,0,5,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,5,27,55,5,27,55,0,27,0,55,0,55,0,27,55,27,0,5,55,0,5,0,55,0,27,55,27,0,27,55,25,0,25,0,25,55,0,55,0,55,0,25,0,25,26,22,23,346,27,0,5,0,55,27,5,55,27,0,55,5,55,25,0,27,5,0,55,0,5,55,0,27,55,0,27,55,0,5,0,27,0,55,0,108,0,115,0,27,0,26,22,23,346,347,348,349,350,351,27,0,18,25,18,55,25,5,0,26,22,23,346,347,348,349,350,351,27,7,8,9,10,11,12,13,14,15,16,0,25,18,55,18,25,18,25,5,21,5,0,55,0,7,8,9,10,11,12,13,14,15,16,0,25,55,25,18,25,0,7,8,9,10,11,12,13,14,15,16,5,0,55,25,5,55,0,25,18,55,18,25,18,55,5,25,5,0,7,8,9,10,11,12,13,14,15,16,55,5,55,5,0,27,0,55,0,55,18,25,18,25,18,25,5,0,55,0,55,0,55,0,55,0,55,5,0,55,25,18,25,0,7,8,9,10,11,12,13,14,15,16,0,25,18,0,55,0,55,0,55,0,55,0,55,0,55,0,25,55,18,25,18,0,18,0,18,0,55,0,18,0,55,18,0,25,0,25,0,55,18,25,18,25,18,25,18,25,55,5,55,0,7,8,9,10,11,12,13,14,15,16,0,55,18,25,0,18,25,18,25,5,55,25,0,55,18,25,18,25,18,25,5,55,0,7,8,9,10,11,12,13,14,15,16,0,55,25,18,25,18,25,18,25,0,7,8,9,10,11,12,13,14,15,16,0,55,0,25,18,25,18,25,0,7,8,9,10,11,12,13,14,15,16,27,5,0,17,19,7,8,9,10,11,12,13,14,15,16,27,0,55,0,55,0,55,0,241,0,5,0,55,0,55,0,55,0,55,0,55,0,7,8,9,10,11,12,13,14,15,16,0,5,0,55,0,25,5,0,55,25,5,102,5,0,7,8,9,10,11,12,13,14,15,16,0,27,0,55,0,55,0,55,0,55,18,0,25,102,0,55,0,55,0,55,0,55,0,55,0,5,25,5,21,0,5,0,5,0,5,18,25,5,18,21,25,5,25,5,25,5,0,5,25,5,0,5,0,27,0,120,20,120,20,0,20,120,20,120,0,120,0,120,0,120,0,120,0,120,20,0,20,0,20,0,20,120,20,120,0,120,0,120,0,120,0,20,120,0,120,0,120,0,120,0,120,0,20,120,20,120,20,120,20,120,20,120,20,120,20,0,120,5,20,5,20,120,5,20,5,20,120,5,20,5,20,120,5,20,5,20,120,5,20,5,20,120,20,0,7,8,9,10,11,12,13,14,15,16,7,8,9,10,11,12,13,14,15,16,7,8,9,10,11,12,13,14,15,16,7,8,9,10,11,12,13,14,15,16,7,8,9,10,11,12,13,14,15,16,25,5,25,5,25,5,25,5,0,25,0,25,0,55,0,27,25,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,55,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,345,26,22,23,346,347,348,349,350,351,27,0,5,0,482,5,482,5,0,482,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,374,55,0,55,0,55,0,55,0,55,0,21,0,21,25,0,1,0],O=1,P=2,Q=4,R=8,T=64,U=128,V=256,W=512,X=1024,Y=2048,Z=4096,$=8192,rn=16384;
  7. unicode=unicode||{},unicode.title=function(r){for(var n="",t=!1,e=0;r.length>e;e++){var c=r.charAt(e);n+=t?x(c,r,e):S(c),t=z(c)}return n},unicode.capitalize=function(r){var n="";n+=w(r.charAt(0));for(var t=1;r.length>t;t++)n+=x(r.charAt(t),r,t);return n},unicode.casefold=function(r){for(var n="",t=0;r.length>t;t++)n+=b(r.charAt(t));return n},unicode.islower=function(r){if(""==r)return!1;for(var n=!1,t=0;r.length>t;t++){var e=r.charAt(t);if(p(e)||o(e))return!1;n||(n=g(e))}return n},unicode.isupper=function(r){if(""==r)return!1;for(var n=!1,t=0;r.length>t;t++){var e=r.charAt(t);if(g(e)||o(e))return!1;n||(n=p(e))}return n},unicode.istitle=function(r){if(""==r)return!1;for(var n=!1,t=!1,e=0;r.length>e;e++){var c=r.charAt(e);if(p(c)||o(c)){if(t)return!1;t=!0,n=!0}else if(g(c)){if(!t)return!1;t=!0,n=!0}else t=!1}return n},unicode.isspace=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!u(t))return!1}return!0},unicode.isalpha=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!j(t))return!1}return!0},unicode.isalnum=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!k(t))return!1}return!0},unicode.isdecimal=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!s(t))return!1}return!0},unicode.isdigit=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!A(t))return!1}return!0},unicode.isnumeric=function(r){if(""==r)return!1;for(var n=0;r.length>n;n++){var t=r.charAt(n);if(!l(t))return!1}return!0},unicode.isidentifier=function(r){if(""==r)return!1;if("_"!=r.charAt(0)&&!f(r.charAt(0)))return!1;for(var n=1;r.length>n;n++)if(!h(r.charAt(n)))return!1;return!0},unicode.isprintable=function(r){for(var n=0;r.length>n;n++)if(!C(r.charAt(n)))return!1;return!0},unicode.lower=function(r){for(var n="",t=0;r.length>t;t++){var e=r.charAt(t);n+=x(e,r,t)}return n},unicode.swapcase=function(r){for(var n="",t=0;r.length>t;t++){var e=r.charAt(t);n+=p(e)?x(e,r,t):g(e)?w(e):e}return n},unicode.upper=function(r){for(var n="",t=0;r.length>t;t++){var e=r.charAt(t);n+=w(e)}return n}}({},function(){return this}());
  8. var __BRYTHON__=__BRYTHON__ ||{}
  9. ;(function($B){
  10. var scripts=document.getElementsByTagName('script')
  11. var this_url=scripts[scripts.length-1].src
  12. var elts=this_url.split('/')
  13. elts.pop()
  14. var $path=$B.brython_path=elts.join('/')+'/'
  15. var $href=$B.script_path=window.location.href
  16. var $href_elts=$href.split('/')
  17. $href_elts.pop()
  18. var $script_dir=$B.script_dir=$href_elts.join('/')
  19. $B.$py_module_path={}
  20. $B.$py_src={}
  21. $B.path=[$path+'Lib',$path+'libs',$script_dir,$path+'Lib/site-packages']
  22. $B.bound={}
  23. $B.async_enabled=false
  24. if($B.async_enabled)$B.block={}
  25. $B.modules={}
  26. $B.imported={}
  27. $B.vars={}
  28. $B._globals={}
  29. $B.frames_stack=[]
  30. $B.builtins={__repr__:function(){return "<module 'builtins>'"},__str__:function(){return "<module 'builtins'>"},}
  31. $B.builtins_block={id:'__builtins__',module:'__builtins__'}
  32. $B.modules['__builtins__']=$B.builtins_block
  33. $B.bound['__builtins__']={'__BRYTHON__':true,'$eval':true,'$open': true}
  34. $B.bound['__builtins__']['BaseException']=true
  35. $B.builtin_funcs={}
  36. $B.__getattr__=function(attr){return this[attr]}
  37. $B.__setattr__=function(attr,value){
  38. if(['debug','stdout','stderr'].indexOf(attr)>-1){$B[attr]=value}
  39. else{throw $B.builtins.AttributeError('__BRYTHON__ object has no attribute '+attr)}}
  40. $B.language=window.navigator.userLanguage ||window.navigator.language
  41. $B.charset=document.characterSet ||document.inputEncoding ||"utf-8"
  42. $B.max_int=Math.pow(2,53)-1
  43. $B.min_int=-$B.max_int
  44. $B.$py_next_hash=Math.pow(2,53)-1
  45. $B.$py_UUID=0
  46. $B.lambda_magic=Math.random().toString(36).substr(2,8)
  47. $B.callbacks={}
  48. var has_storage=typeof(Storage)!=="undefined"
  49. if(has_storage){$B.has_local_storage=false
  50. try{
  51. if(localStorage){$B.local_storage=localStorage
  52. $B.has_local_storage=true}}catch(err){}
  53. $B.has_session_storage=false
  54. try{
  55. if(sessionStorage){$B.session_storage=sessionStorage
  56. $B.has_session_storage=true}}catch(err){}}else{
  57. $B.has_local_storage=false
  58. $B.has_session_storage=false}
  59. $B.globals=function(){
  60. return $B.frames_stack[$B.frames_stack.length-1][3]}
  61. $B.regexIdentifier=/^(?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])*$/})(__BRYTHON__)
  62. __BRYTHON__.implementation=[3,3,2,'dev',0]
  63. __BRYTHON__.__MAGIC__="3.3.2"
  64. __BRYTHON__.version_info=[3,3,0,'alpha',0]
  65. __BRYTHON__.compiled_date="2017-05-15 15:18:49.317950"
  66. __BRYTHON__.builtin_module_names=["posix","sys","errno","time","_ajax","_base64","_jsre","_multiprocessing","_posixsubprocess","_profile","_svg","_sys","builtins","dis","hashlib","json","long_int","math","modulefinder","random","_abcoll","_codecs","_collections","_csv","_functools","_imp","_io","_random","_socket","_sre","_string","_struct","_sysconfigdata","_testcapi","_thread","_warnings","_weakref"]
  67. ;(function($B){var js,$pos,res,$op
  68. var _b_=$B.builtins
  69. var keys=$B.keys=function(obj){var res=[],pos=0
  70. for(var attr in obj){res[pos++]=attr}
  71. res.sort()
  72. return res}
  73. var clone=$B.clone=function(obj){var res={}
  74. for(var attr in obj){res[attr]=obj[attr]}
  75. return res}
  76. $B.last=function(table){return table[table.length-1]}
  77. $B.list2obj=function(list,value){var res={},i=list.length
  78. if(value===undefined){value=true}
  79. while(i-->0){res[list[i]]=value}
  80. return res}
  81. var $operators={"//=":"ifloordiv",">>=":"irshift","<<=":"ilshift","**=":"ipow","**":"pow","//":"floordiv","<<":"lshift",">>":"rshift","+=":"iadd","-=":"isub","*=":"imul","/=":"itruediv","%=":"imod","&=":"iand","|=":"ior","^=":"ixor","+":"add","-":"sub","*":"mul","/":"truediv","%":"mod","&":"and","|":"or","~":"invert","^":"xor","<":"lt",">":"gt","<=":"le",">=":"ge","==":"eq","!=":"ne","or":"or","and":"and","in":"in","not": "not","is":"is","not_in":"not_in","is_not":"is_not" }
  82. var $augmented_assigns=$B.augmented_assigns={"//=":"ifloordiv",">>=":"irshift","<<=":"ilshift","**=":"ipow","+=":"iadd","-=":"isub","*=":"imul","/=":"itruediv","%=":"imod","&=":"iand","|=":"ior","^=":"ixor"}
  83. var noassign=$B.list2obj(['True','False','None','__debug__'])
  84. var $op_order=[['or'],['and'],['not'],['in','not_in'],['<','<=','>','>=','!=','==','is','is_not'],['|'],['^'],['&'],['>>','<<'],['+'],['-'],['*','/','//','%'],['unary_neg','unary_inv','unary_pos'],['**']
  85. ]
  86. var $op_weight={}
  87. var $weight=1
  88. for(var $i=0;$i<$op_order.length;$i++){var _tmp=$op_order[$i]
  89. for(var $j=0;$j<_tmp.length;$j++){$op_weight[_tmp[$j]]=$weight}
  90. $weight++}
  91. var $loop_num=0
  92. var chained_comp_num=0
  93. function $_SyntaxError(C,msg,indent){
  94. var ctx_node=C
  95. while(ctx_node.type!=='node'){ctx_node=ctx_node.parent}
  96. var tree_node=ctx_node.node,root=tree_node
  97. while(root.parent!==undefined){root=root.parent}
  98. var module=tree_node.module
  99. var line_num=tree_node.line_num
  100. if(root.line_info){line_num=root.line_info}
  101. if(indent!==undefined){line_num++}
  102. if(indent===undefined){if(Array.isArray(msg)){$B.$SyntaxError(module,msg[0],$pos)}
  103. if(msg==="Triple string end not found"){
  104. $B.$SyntaxError(module,'invalid syntax : triple string end not found',$pos,line_num,root)}
  105. $B.$SyntaxError(module,'invalid syntax',$pos,line_num,root)}else{throw $B.$IndentationError(module,msg,$pos)}}
  106. function $Node(type){this.type=type
  107. this.children=[]
  108. this.yield_atoms=[]
  109. this.add=function(child){
  110. this.children[this.children.length]=child
  111. child.parent=this
  112. child.module=this.module}
  113. this.insert=function(pos,child){
  114. this.children.splice(pos,0,child)
  115. child.parent=this
  116. child.module=this.module}
  117. this.toString=function(){return "<object 'Node'>"}
  118. this.show=function(indent){
  119. var res=''
  120. if(this.type==='module'){for(var i=0;i<this.children.length;i++){res +=this.children[i].show(indent)}
  121. return res}
  122. indent=indent ||0
  123. res +=' '.repeat(indent)
  124. res +=this.C
  125. if(this.children.length>0)res +='{'
  126. res +='\n'
  127. for(var i=0;i<this.children.length;i++){res +='['+i+'] '+this.children[i].show(indent+4)}
  128. if(this.children.length>0){res +=' '.repeat(indent)
  129. res+='}\n'}
  130. return res}
  131. this.to_js=function(indent){
  132. if(this.js!==undefined)return this.js
  133. this.res=[]
  134. var pos=0
  135. this.unbound=[]
  136. if(this.type==='module'){for(var i=0;i<this.children.length;i++){this.res[pos++]=this.children[i].to_js()
  137. this.children[i].js_index=pos }
  138. this.js=this.res.join('')
  139. return this.js}
  140. indent=indent ||0
  141. var ctx_js=this.C.to_js()
  142. if(ctx_js){
  143. this.res[pos++]=' '.repeat(indent)
  144. this.res[pos++]=ctx_js
  145. this.js_index=pos
  146. if(this.children.length>0)this.res[pos++]='{'
  147. this.res[pos++]='\n'
  148. for(var i=0;i<this.children.length;i++){this.res[pos++]=this.children[i].to_js(indent+4)
  149. this.children[i].js_index=pos }
  150. if(this.children.length>0){this.res[pos++]=' '.repeat(indent)
  151. this.res[pos++]='}\n'}}
  152. this.js=this.res.join('')
  153. return this.js}
  154. this.transform=function(rank){
  155. if(this.yield_atoms.length>0){
  156. this.parent.children.splice(rank,1)
  157. var offset=0
  158. for(var i=0;i<this.yield_atoms.length;i++){var atom=this.yield_atoms[i]
  159. if(atom.from){
  160. atom.transform(this,rank)
  161. continue}else{
  162. var temp_node=new $Node()
  163. var js='var $yield_value'+$loop_num
  164. js +='='+(this.yield_atoms[i].to_js()||'None')
  165. new $NodeJSCtx(temp_node,js)
  166. this.parent.insert(rank+offset,temp_node)
  167. var yield_node=new $Node()
  168. this.parent.insert(rank+offset+1,yield_node)
  169. var yield_expr=new $YieldCtx(new $NodeCtx(yield_node))
  170. new $StringCtx(yield_expr,'$yield_value'+$loop_num)
  171. var set_yield=new $Node()
  172. set_yield.is_set_yield_value=true
  173. js=$loop_num
  174. new $NodeJSCtx(set_yield,js)
  175. this.parent.insert(rank+offset+2,set_yield)
  176. this.yield_atoms[i].to_js=(function(x){return function(){return '$yield_value'+x}})($loop_num)
  177. $loop_num++
  178. offset +=3}}
  179. this.parent.insert(rank+offset,this)
  180. this.yield_atoms=[]
  181. return offset+1}
  182. if(this.type==='module'){
  183. this.doc_string=$get_docstring(this)
  184. var i=0
  185. while(i<this.children.length){var offset=this.children[i].transform(i)
  186. if(offset===undefined){offset=1}
  187. i +=offset}}else{var elt=this.C.tree[0],ctx_offset
  188. if(elt.transform !==undefined){ctx_offset=elt.transform(this,rank)}
  189. var i=0
  190. while(i<this.children.length){var offset=this.children[i].transform(i)
  191. if(offset===undefined){offset=1}
  192. i +=offset}
  193. if(ctx_offset===undefined){ctx_offset=1}
  194. if(this.C && this.C.tree!==undefined &&
  195. this.C.tree[0].type=="generator"){var def_node=this,def_ctx=def_node.C.tree[0]
  196. var blocks=[],node=def_node.parent_block,is_comp=node.is_comp
  197. while(true){var node_id=node.id.replace(/\./g,'_'),block='"$locals_'+node_id+'": '
  198. if(is_comp){block +='$B.clone($locals_'+node_id+')'}else{block +='$locals_'+node_id}
  199. blocks.push(block)
  200. node=node.parent_block
  201. if(node===undefined ||node.id=='__builtins__'){break}}
  202. blocks='{'+blocks+'}'
  203. var parent=this.parent
  204. while(parent!==undefined && parent.id===undefined){parent=parent.parent}
  205. var g=$B.$BRgenerator(def_ctx.name,blocks,def_ctx.id,def_node),block_id=parent.id.replace(/\./g,'_'),name=def_ctx.decorated ? def_ctx.alias :
  206. def_ctx.name+def_ctx.num,res='var '+def_ctx.name+def_ctx.num + ' = '+
  207. '$locals_'+block_id+'["'+def_ctx.name+
  208. '"] = $B.genfunc("'+
  209. def_ctx.name+'", '+blocks+',['+g+'],'+
  210. def_ctx.default_str+')'
  211. this.parent.children.splice(rank,1)
  212. this.parent.insert(rank+offset-1,$NodeJS(res))}
  213. return ctx_offset}}
  214. this.clone=function(){var res=new $Node(this.type)
  215. for(var attr in this){res[attr]=this[attr]}
  216. return res}}
  217. function $AbstractExprCtx(C,with_commas){this.type='abstract_expr'
  218. this.with_commas=with_commas
  219. this.parent=C
  220. this.tree=[]
  221. C.tree[C.tree.length]=this
  222. this.toString=function(){return '(abstract_expr '+with_commas+') '+this.tree}
  223. this.to_js=function(){this.js_processed=true
  224. if(this.type==='list')return '['+$to_js(this.tree)+']'
  225. return $to_js(this.tree)}}
  226. function $AliasCtx(C){
  227. this.type='ctx_manager_alias'
  228. this.parent=C
  229. this.tree=[]
  230. C.tree[C.tree.length-1].alias=this}
  231. function $AnnotationCtx(C){
  232. this.type='annotation'
  233. this.parent=C
  234. this.tree=[]
  235. C.annotation=this
  236. this.toString=function(){return '(annotation) '+this.tree}
  237. this.to_js=function(){return $to_js(this.tree)}}
  238. function $AssertCtx(C){
  239. this.type='assert'
  240. this.toString=function(){return '(assert) '+this.tree}
  241. this.parent=C
  242. this.tree=[]
  243. C.tree[C.tree.length]=this
  244. this.transform=function(node,rank){if(this.tree[0].type==='list_or_tuple'){
  245. var condition=this.tree[0].tree[0]
  246. var message=this.tree[0].tree[1]}else{var condition=this.tree[0]
  247. var message=null}
  248. var new_ctx=new $ConditionCtx(node.C,'if')
  249. var not_ctx=new $NotCtx(new_ctx)
  250. not_ctx.tree=[condition]
  251. node.C=new_ctx
  252. var new_node=new $Node()
  253. var js='throw AssertionError("AssertionError")'
  254. if(message !==null){js='throw AssertionError(str('+message.to_js()+'))'}
  255. new $NodeJSCtx(new_node,js)
  256. node.add(new_node)}}
  257. function $AssignCtx(C){
  258. var ctx=C
  259. while(ctx){if(ctx.type=='assert'){$_SyntaxError(C,'invalid syntax - assign')}
  260. ctx=ctx.parent}
  261. this.type='assign'
  262. C.parent.tree.pop()
  263. C.parent.tree[C.parent.tree.length]=this
  264. this.parent=C.parent
  265. this.tree=[C]
  266. var scope=$get_scope(this),level=$get_level(this)
  267. if(C.type=='expr' && C.tree[0].type=='call'){$_SyntaxError(C,["can't assign to function call "])}else if(C.type=='list_or_tuple' ||
  268. (C.type=='expr' && C.tree[0].type=='list_or_tuple')){if(C.type=='expr'){C=C.tree[0]}
  269. for(var name in C.ids()){$bind(name,scope.id,level)}}else if(C.type=='assign'){for(var i=0;i<C.tree.length;i++){var assigned=C.tree[i].tree[0]
  270. if(assigned.type=='id'){$bind(assigned.value,scope.id,level)}}}else{var assigned=C.tree[0]
  271. if(assigned && assigned.type=='id'){if(noassign[assigned.value]===true){$_SyntaxError(C,["can't assign to keyword"])}
  272. assigned.bound=true
  273. if(!$B._globals[scope.id]||
  274. $B._globals[scope.id][assigned.value]===undefined){
  275. var node=$get_node(this)
  276. node.bound_before=$B.keys($B.bound[scope.id])
  277. $bind(assigned.value,scope.id,level)}}}
  278. this.guess_type=function(){return}
  279. this.toString=function(){return '(assign) '+this.tree[0]+'='+this.tree[1]}
  280. this.transform=function(node,rank){
  281. var scope=$get_scope(this)
  282. var left=this.tree[0],right=this.tree[1],assigned=[]
  283. while(left.type=='assign'){assigned.push(left.tree[1])
  284. left=left.tree[0]}
  285. if(assigned.length>0){assigned.push(left)
  286. var ctx=node.C
  287. ctx.tree=[]
  288. var nleft=new $RawJSCtx(ctx,'var $temp'+$loop_num)
  289. nleft.tree=ctx.tree
  290. nassign=new $AssignCtx(nleft)
  291. nassign.tree[1]=right
  292. for(var i=0;i<assigned.length;i++){var new_node=new $Node(),node_ctx=new $NodeCtx(new_node)
  293. new_node.locals=node.locals
  294. node.parent.insert(rank+1,new_node)
  295. assigned[i].parent=node_ctx
  296. var assign=new $AssignCtx(assigned[i])
  297. new $RawJSCtx(assign,'$temp'+$loop_num)}
  298. return assigned.length-1}
  299. var left_items=null
  300. switch(left.type){case 'expr':
  301. if(left.tree.length>1){left_items=left.tree}else if(left.tree[0].type==='list_or_tuple'||left.tree[0].type==='target_list'){left_items=left.tree[0].tree}else if(left.tree[0].type=='id'){
  302. var name=left.tree[0].value
  303. if($B._globals && $B._globals[scope.id]
  304. && $B._globals[scope.id][name]){}else{left.tree[0].bound=true}}
  305. break
  306. case 'target_list':
  307. case 'list_or_tuple':
  308. left_items=left.tree}
  309. if(left_items===null){return}
  310. var right=this.tree[1]
  311. var right_items=null
  312. if(right.type==='list'||right.type==='tuple'||
  313. (right.type==='expr' && right.tree.length>1)){right_items=right.tree}
  314. if(right_items!==null){
  315. if(right_items.length>left_items.length){throw Error('ValueError : too many values to unpack (expected '+left_items.length+')')}else if(right_items.length<left_items.length){throw Error('ValueError : need more than '+right_items.length+' to unpack')}
  316. var new_nodes=[],pos=0
  317. var new_node=new $Node()
  318. new $NodeJSCtx(new_node,'void(0)')
  319. new_nodes[pos++]=new_node
  320. var $var='$temp'+$loop_num
  321. var new_node=new $Node()
  322. new $NodeJSCtx(new_node,'var '+$var+'=[], $pos=0')
  323. new_nodes[pos++]=new_node
  324. for(var i=0;i<right_items.length;i++){var js=$var+'[$pos++]='+right_items[i].to_js()
  325. var new_node=new $Node()
  326. new $NodeJSCtx(new_node,js)
  327. new_nodes[pos++]=new_node}
  328. for(var i=0;i<left_items.length;i++){var new_node=new $Node(),this_node=$get_node(this)
  329. new_node.id=this_node.module
  330. new_node.locals=this.node.locals
  331. var C=new $NodeCtx(new_node)
  332. left_items[i].parent=C
  333. var assign=new $AssignCtx(left_items[i],false)
  334. assign.tree[1]=new $JSCode($var+'['+i+']')
  335. new_nodes[pos++]=new_node}
  336. node.parent.children.splice(rank,1)
  337. for(var i=new_nodes.length-1;i>=0;i--){node.parent.insert(rank,new_nodes[i])}
  338. $loop_num++}else{
  339. var new_node=new $Node()
  340. new_node.line_num=node.line_num
  341. var rname='$right'+$loop_num
  342. var js='var '+rname+' = getattr'
  343. js +='(iter('+right.to_js()+'),"__next__");'
  344. new $NodeJSCtx(new_node,js)
  345. var new_nodes=[new_node],pos=1
  346. var rlist_node=new $Node()
  347. var rlname='$rlist'+$loop_num
  348. js='var '+rlname+'=[], $pos=0;'+'while(1){try{'+rlname+
  349. '[$pos++] = '+rname+'()}catch(err){break}};'
  350. new $NodeJSCtx(rlist_node,js)
  351. new_nodes[pos++]=rlist_node
  352. var packed=null
  353. for(var i=0;i<left_items.length;i++){var expr=left_items[i]
  354. if(expr.type=='packed' ||
  355. (expr.type=='expr' && expr.tree[0].type=='packed')){packed=i
  356. break}}
  357. var check_node=new $Node()
  358. var min_length=left_items.length
  359. if(packed!==null){min_length--}
  360. js='if('+rlname+'.length<'+min_length+')'+
  361. '{throw ValueError("need more than "+'+rlname+
  362. '.length+" value" + ('+rlname+'.length>1 ?'+
  363. ' "s" : "")+" to unpack")}'
  364. new $NodeJSCtx(check_node,js)
  365. new_nodes[pos++]=check_node
  366. if(packed==null){var check_node=new $Node()
  367. var min_length=left_items.length
  368. js='if('+rlname+'.length>'+min_length+')'+
  369. '{throw ValueError("too many values to unpack '+
  370. '(expected '+left_items.length+')")}'
  371. new $NodeJSCtx(check_node,js)
  372. new_nodes[pos++]=check_node}
  373. for(var i=0;i<left_items.length;i++){var new_node=new $Node()
  374. new_node.id=scope.id
  375. var C=new $NodeCtx(new_node)
  376. left_items[i].parent=C
  377. var assign=new $AssignCtx(left_items[i],false)
  378. var js=rlname
  379. if(packed==null ||i<packed){js +='['+i+']'}else if(i==packed){js +='.slice('+i+','+rlname+'.length-'+
  380. (left_items.length-i-1)+')'}else{js +='['+rlname+'.length-'+(left_items.length-i)+']'}
  381. assign.tree[1]=new $JSCode(js)
  382. new_nodes[pos++]=new_node}
  383. node.parent.children.splice(rank,1)
  384. for(var i=new_nodes.length-1;i>=0;i--){node.parent.insert(rank,new_nodes[i])}
  385. $loop_num++}}
  386. this.to_js=function(){this.js_processed=true
  387. if(this.parent.type==='call'){
  388. return '{$nat:"kw",name:'+this.tree[0].to_js()+',value:'+this.tree[1].to_js()+'}'}
  389. var left=this.tree[0]
  390. if(left.type==='expr')left=left.tree[0]
  391. var right=this.tree[1]
  392. if(left.type=='attribute' ||left.type=='sub'){
  393. var right_js=right.to_js()
  394. var res='',rvar='',$var='$temp'+$loop_num
  395. if(right.type=='expr' && right.tree[0]!==undefined &&
  396. right.tree[0].type=='call' &&
  397. ('eval'==right.tree[0].func.value ||
  398. 'exec'==right.tree[0].func.value)){res +='var '+$var+'='+right_js+';\n'
  399. rvar=$var}else if(right.type=='expr' && right.tree[0]!==undefined &&
  400. right.tree[0].type=='sub'){res +='var '+$var+'='+right_js+';\n'
  401. rvar=$var}else{rvar=right_js}
  402. if(left.type==='attribute'){
  403. $loop_num++
  404. left.func='setattr'
  405. res +=left.to_js()
  406. left.func='getattr'
  407. res=res.substr(0,res.length-1)
  408. return res + ','+rvar+');None;'}
  409. if(left.type==='sub'){
  410. var seq=left.value.to_js(),temp='$temp'+$loop_num,type
  411. if(left.value.type=='id'){type=$get_node(this).locals[left.value.value]}
  412. $loop_num++
  413. var res='var '+temp+'='+seq+'\n'
  414. if(type!=='list'){res +='if(Array.isArray('+temp+') && !'+temp+'.__class__){'}
  415. if(left.tree.length==1){res +='$B.set_list_key('+temp+','+
  416. (left.tree[0].to_js()+''||'null')+','+
  417. right.to_js()+')'}else if(left.tree.length==2){res +='$B.set_list_slice('+temp+','+
  418. (left.tree[0].to_js()+''||'null')+','+
  419. (left.tree[1].to_js()+''||'null')+','+
  420. right.to_js()+')'}else if(left.tree.length==3){res +='$B.set_list_slice_step('+temp+','+
  421. (left.tree[0].to_js()+''||'null')+','+
  422. (left.tree[1].to_js()+''||'null')+','+
  423. (left.tree[2].to_js()+''||'null')+','+
  424. right.to_js()+')'}
  425. if(type=='list'){return res}
  426. res +='\n}else{'
  427. if(left.tree.length==1){res +='$B.$setitem('+left.value.to_js()
  428. res +=','+left.tree[0].to_js()+','+right_js+')};None;'}else{left.func='setitem'
  429. res +=left.to_js()
  430. res=res.substr(0,res.length-1)
  431. left.func='getitem'
  432. res +=','+right_js+')};None;'}
  433. return res}}
  434. return left.to_js()+'='+right.to_js()}}
  435. function $AttrCtx(C){
  436. this.type='attribute'
  437. this.value=C.tree[0]
  438. this.parent=C
  439. C.tree.pop()
  440. C.tree[C.tree.length]=this
  441. this.tree=[]
  442. this.func='getattr'
  443. this.toString=function(){return '(attr) '+this.value+'.'+this.name}
  444. this.to_js=function(){this.js_processed=true
  445. return this.func+'('+this.value.to_js()+',"'+this.name+'")'}}
  446. function $AugmentedAssignCtx(C,op){
  447. this.type='augm_assign'
  448. this.parent=C.parent
  449. C.parent.tree.pop()
  450. C.parent.tree[C.parent.tree.length]=this
  451. this.op=op
  452. this.tree=[C]
  453. var scope=this.scope=$get_scope(this)
  454. if(C.type=='expr' && C.tree[0].type=='id'){var name=C.tree[0].value
  455. if(noassign[name]===true){$_SyntaxError(C,["can't assign to keyword"])}else if((scope.ntype=='def'||scope.ntype=='generator')&&
  456. $B.bound[scope.id][name]===undefined){if(scope.globals===undefined ||scope.globals.indexOf(name)==-1){
  457. C.tree[0].unbound=true}}}
  458. $get_node(this).bound_before=$B.keys($B.bound[scope.id])
  459. this.module=scope.module
  460. this.toString=function(){return '(augm assign) '+this.tree}
  461. this.transform=function(node,rank){var func='__'+$operators[op]+'__'
  462. var offset=0,parent=node.parent
  463. var line_num=node.line_num,lnum_set=false
  464. parent.children.splice(rank,1)
  465. var left_is_id=(this.tree[0].type=='expr' &&
  466. this.tree[0].tree[0].type=='id')
  467. if(left_is_id){
  468. this.tree[0].tree[0].augm_assign=true
  469. if($B.debug>0){var check_node=$NodeJS('if('+this.tree[0].to_js()+
  470. '===undefined){throw NameError("name \''+
  471. this.tree[0].tree[0].value+'\' is not defined")}')
  472. node.parent.insert(rank,check_node)
  473. offset++}
  474. var left_id=this.tree[0].tree[0].value,was_bound=$B.bound[this.scope.id][left_id]!==undefined,left_id_unbound=this.tree[0].tree[0].unbound}
  475. var right_is_int=(this.tree[1].type=='expr' &&
  476. this.tree[1].tree[0].type=='int')
  477. var right=right_is_int ? this.tree[1].tree[0].to_js(): '$temp'
  478. if(!right_is_int){
  479. var new_node=new $Node()
  480. new_node.line_num=line_num
  481. lnum_set=true
  482. new $NodeJSCtx(new_node,'var $temp,$left;')
  483. parent.insert(rank,new_node)
  484. offset++
  485. var new_node=new $Node()
  486. new_node.id=this.scope.id
  487. var new_ctx=new $NodeCtx(new_node)
  488. var new_expr=new $ExprCtx(new_ctx,'js',false)
  489. var _id=new $RawJSCtx(new_expr,'$temp')
  490. var assign=new $AssignCtx(new_expr)
  491. assign.tree[1]=this.tree[1]
  492. _id.parent=assign
  493. parent.insert(rank+offset,new_node)
  494. offset++}
  495. var prefix='',in_class=false
  496. switch(op){case '+=':
  497. case '-=':
  498. case '*=':
  499. case '/=':
  500. if(left_is_id){var scope=this.scope,global_ns='$local_'+scope.module.replace(/\./g,'_')
  501. switch(scope.ntype){case 'module':
  502. prefix=global_ns
  503. break
  504. case 'def':
  505. case 'generator':
  506. if(scope.globals && scope.globals.indexOf(C.tree[0].value)>-1){prefix=global_ns}else{prefix='$locals'}
  507. break;
  508. case 'class':
  509. var new_node=new $Node()
  510. if(!lnum_set){new_node.line_num=line_num;lnum_set=true}
  511. new $NodeJSCtx(new_node,'var $left='+C.to_js())
  512. parent.insert(rank+offset,new_node)
  513. in_class=true
  514. offset++}}}
  515. var left=C.tree[0].to_js()
  516. prefix=prefix && !C.tree[0].unknown_binding && !left_id_unbound
  517. var op1=op.charAt(0)
  518. if(prefix){var left1=in_class ? '$left' : left
  519. var new_node=new $Node()
  520. if(!lnum_set){new_node.line_num=line_num;lnum_set=true}
  521. js=right_is_int ? 'if(' : 'if(typeof $temp.valueOf()=="number" && '
  522. js +=left1+'.constructor===Number'
  523. js +='&& '+left+op1+right+'>$B.min_int && '+left+op1+right+
  524. '< $B.max_int){'
  525. js +=right_is_int ? '(' : '(typeof $temp=="number" && '
  526. js +='typeof '+left1+'=="number") ? '
  527. js +=left+op+right
  528. js +=' : ('+left1+'.constructor===Number ? '
  529. js +=left+'=float('+left+op1
  530. js +=right_is_int ? right : right+'.valueOf()'
  531. js +=') : '+left + op
  532. js +=right_is_int ? right : right+'.valueOf()'
  533. js +=')}'
  534. new $NodeJSCtx(new_node,js)
  535. parent.insert(rank+offset,new_node)
  536. offset++}
  537. var aaops={'+=':'add','-=':'sub','*=':'mul'}
  538. if(C.tree[0].type=='sub' &&
  539. ('+='==op ||'-='==op ||'*='==op)&&
  540. C.tree[0].tree.length==1){var js1='$B.augm_item_'+aaops[op]+'('
  541. js1 +=C.tree[0].value.to_js()
  542. js1 +=','+C.tree[0].tree[0].to_js()+','
  543. js1 +=right+');None;'
  544. var new_node=new $Node()
  545. if(!lnum_set){new_node.line_num=line_num;lnum_set=true}
  546. new $NodeJSCtx(new_node,js1)
  547. parent.insert(rank+offset,new_node)
  548. offset++
  549. return}
  550. var new_node=new $Node()
  551. if(!lnum_set){new_node.line_num=line_num;lnum_set=true}
  552. var js=''
  553. if(prefix){js +='else '}
  554. js +='if(!hasattr('+C.to_js()+',"'+func+'"))'
  555. new $NodeJSCtx(new_node,js)
  556. parent.insert(rank+offset,new_node)
  557. offset ++
  558. var aa1=new $Node()
  559. aa1.id=this.scope.id
  560. var ctx1=new $NodeCtx(aa1)
  561. var expr1=new $ExprCtx(ctx1,'clone',false)
  562. if(left_id_unbound){new $RawJSCtx(expr1,'$locals["'+left_id+'"]')}else{expr1.tree=C.tree
  563. for(var i=0;i<expr1.tree.length;i++){expr1.tree[i].parent=expr1}}
  564. var assign1=new $AssignCtx(expr1)
  565. var new_op=new $OpCtx(expr1,op.substr(0,op.length-1))
  566. new_op.parent=assign1
  567. new $RawJSCtx(new_op,right)
  568. assign1.tree.push(new_op)
  569. expr1.parent.tree.pop()
  570. expr1.parent.tree.push(assign1)
  571. new_node.add(aa1)
  572. var aa2=new $Node()
  573. new $NodeJSCtx(aa2,'else')
  574. parent.insert(rank+offset,aa2)
  575. var aa3=new $Node()
  576. var js3='getattr('+C.to_js()+',"'+func+'")('+right+')'
  577. new $NodeJSCtx(aa3,js3)
  578. aa2.add(aa3)
  579. if(left_is_id && !was_bound && !this.scope.blurred){$B.bound[this.scope.id][left_id]=undefined}
  580. return offset}
  581. this.to_js=function(){return ''}}
  582. function $BodyCtx(C){
  583. var ctx_node=C.parent
  584. while(ctx_node.type!=='node'){ctx_node=ctx_node.parent}
  585. var tree_node=ctx_node.node
  586. var body_node=new $Node()
  587. body_node.line_num=tree_node.line_num
  588. tree_node.insert(0,body_node)
  589. return new $NodeCtx(body_node)}
  590. function set_loop_C(C,kw){
  591. var ctx_node=C
  592. while(ctx_node.type!=='node'){ctx_node=ctx_node.parent}
  593. var tree_node=ctx_node.node
  594. var loop_node=tree_node.parent
  595. var break_flag=false
  596. while(1){if(loop_node.type==='module'){
  597. $_SyntaxError(C,kw+' outside of a loop')}else{var ctx=loop_node.C.tree[0]
  598. if(ctx.type==='condition' && ctx.token==='while'){this.loop_ctx=ctx
  599. ctx['has_'+kw]=true
  600. break}
  601. switch(ctx.type){case 'for':
  602. this.loop_ctx=ctx
  603. ctx['has_'+kw]=true
  604. break_flag=true
  605. break
  606. case 'def':
  607. case 'generator':
  608. case 'class':
  609. $_SyntaxError(C,kw+' outside of a loop')
  610. default:
  611. loop_node=loop_node.parent}
  612. if(break_flag)break}}}
  613. function $BreakCtx(C){
  614. this.type='break'
  615. this.toString=function(){return 'break '}
  616. this.parent=C
  617. C.tree[C.tree.length]=this
  618. set_loop_C.apply(this,[C,'break'])
  619. this.to_js=function(){this.js_processed=true
  620. var scope=$get_scope(this)
  621. var res=';$locals_'+scope.id.replace(/\./g,'_')+
  622. '["$no_break'+this.loop_ctx.loop_num+'"]=false'
  623. if(this.loop_ctx.type!='asyncfor'){res +=';break'}else{res +=';throw StopIteration('+this.loop_ctx.loop_num+')'}
  624. return res}}
  625. function $CallArgCtx(C){
  626. this.type='call_arg'
  627. this.toString=function(){return 'call_arg '+this.tree}
  628. this.parent=C
  629. this.start=$pos
  630. this.tree=[]
  631. C.tree[C.tree.length]=this
  632. this.expect='id'
  633. this.to_js=function(){this.js_processed=true
  634. return $to_js(this.tree)}}
  635. function $CallCtx(C){
  636. this.type='call'
  637. this.func=C.tree[0]
  638. if(this.func!==undefined){
  639. this.func.parent=this}
  640. this.parent=C
  641. if(C.type!='class'){C.tree.pop()
  642. C.tree[C.tree.length]=this}else{
  643. C.args=this}
  644. this.expect='id'
  645. this.tree=[]
  646. this.start=$pos
  647. this.toString=function(){return '(call) '+this.func+'('+this.tree+')'}
  648. if(this.func && this.func.type=="attribute" && this.func.name=="wait"
  649. && this.func.value.type=="id" && this.func.value.value=="time"){console.log('call',this.func)
  650. $get_node(this).blocking={'type': 'wait','call': this}}
  651. if(this.func && this.func.value=='input'){$get_node(this).blocking={'type': 'input'}}
  652. this.to_js=function(){this.js_processed=true
  653. if(this.tree.length>0){if(this.tree[this.tree.length-1].tree.length==0){
  654. this.tree.pop()}}
  655. var func_js=this.func.to_js()
  656. if(this.func!==undefined){switch(this.func.value){case 'classmethod':
  657. return 'classmethod('+$to_js(this.tree)+')'
  658. case '$$super':
  659. if(this.tree.length==0){
  660. var scope=$get_scope(this)
  661. if(scope.ntype=='def' ||scope.ntype=='generator'){var def_scope=$get_scope(scope.C.tree[0])
  662. if(def_scope.ntype=='class'){new $IdCtx(this,def_scope.C.tree[0].name)}}}
  663. if(this.tree.length==1){
  664. var scope=$get_scope(this)
  665. if(scope.ntype=='def' ||scope.ntype=='generator'){var args=scope.C.tree[0].args
  666. if(args.length>0){new $IdCtx(this,args[0])}}}
  667. break
  668. default:
  669. if(this.func.type=='unary'){
  670. switch(this.func.op){case '+':
  671. return 'getattr('+$to_js(this.tree)+',"__pos__")()'
  672. case '-':
  673. return 'getattr('+$to_js(this.tree)+',"__neg__")()'
  674. case '~':
  675. return 'getattr('+$to_js(this.tree)+',"__invert__")()'}}}
  676. var _block=false
  677. if($B.async_enabled){var scope=$get_scope(this.func)
  678. if($B.block[scope.id]===undefined){}
  679. else if($B.block[scope.id][this.func.value])_block=true}
  680. var positional=[],kw_args=[],star_args=false,dstar_args=[]
  681. for(var i=0;i<this.tree.length;i++){var arg=this.tree[i],type
  682. switch(arg.type){case 'star_arg':
  683. star_args=true
  684. positional.push([arg.tree[0].tree[0].to_js(),'*'])
  685. break
  686. case 'double_star_arg':
  687. dstar_args.push(arg.tree[0].tree[0].to_js())
  688. break
  689. case 'id':
  690. positional.push([arg.to_js(),'s'])
  691. break
  692. default:
  693. if(arg.tree[0]===undefined){console.log('bizarre',arg)}
  694. else{type=arg.tree[0].type}
  695. switch(type){case 'expr':
  696. positional.push([arg.to_js(),'s'])
  697. break
  698. case 'kwarg':
  699. kw_args.push(arg.tree[0].tree[0].value+':'+arg.tree[0].tree[1].to_js())
  700. break
  701. case 'list_or_tuple':
  702. case 'op':
  703. positional.push([arg.to_js(),'s'])
  704. break
  705. case 'star_arg':
  706. star_args=true
  707. positional.push([arg.tree[0].tree[0].to_js(),'*'])
  708. break
  709. case 'double_star_arg':
  710. dstar_args.push(arg.tree[0].tree[0].to_js())
  711. break
  712. default:
  713. positional.push([arg.to_js(),'s'])
  714. break}
  715. break}}
  716. var args_str
  717. if(star_args){
  718. var p=[]
  719. for(var i=0,len=positional.length;i<len;i++){arg=positional[i]
  720. if(arg[1]=='*'){
  721. p.push('_b_.list('+arg[0]+')')}else{var elt=[positional[i][0]]
  722. i++
  723. while(i<len && positional[i][1]=='s'){elt.push(positional[i][0])
  724. i++}
  725. i--
  726. p.push('['+elt.join(',')+']')}}
  727. args_str=p[0]
  728. for(var i=1;i<p.length;i++){args_str +='.concat('+p[i]+')'}}else{for(var i=0,len=positional.length;i<len;i++){positional[i]=positional[i][0]}
  729. args_str=positional.join(', ')}
  730. var kw_args_str='{'+kw_args.join(', ')+'}'
  731. if(dstar_args.length){kw_args_str='{$nat:"kw",kw:$B.extend("'+this.func.value+'",'+kw_args_str
  732. kw_args_str +=','+dstar_args.join(', ')+')}'}else if(kw_args_str!=='{}'){kw_args_str='{$nat:"kw",kw:'+kw_args_str+'}'}else{kw_args_str=''}
  733. if(star_args && kw_args_str){args_str +='.concat(['+kw_args_str+'])' }else{if(args_str && kw_args_str){args_str +=','+kw_args_str}
  734. else if(!args_str){args_str=kw_args_str}}
  735. if(star_args){
  736. args_str='.apply(null,'+args_str+')'}else{args_str='('+args_str+')'}
  737. if(this.tree.length>-1){if(this.func.type=='id'){if(this.func.is_builtin){
  738. if($B.builtin_funcs[this.func.value]!==undefined){return func_js+args_str}}else{var bound_obj=this.func.found
  739. if(bound_obj &&(bound_obj.type=='class' ||
  740. bound_obj.type=='def')){return func_js+args_str}}
  741. var res='getattr('+func_js+',"__call__")'+args_str}else{var res='getattr('+func_js+',"__call__")'+args_str}
  742. return res}
  743. return 'getattr('+func_js+',"__call__")'+args_str}}}
  744. function $ClassCtx(C){
  745. this.type='class'
  746. this.parent=C
  747. this.tree=[]
  748. C.tree[C.tree.length]=this
  749. this.expect='id'
  750. this.toString=function(){return '(class) '+this.name+' '+this.tree+' args '+this.args}
  751. var scope=this.scope=$get_scope(this)
  752. this.parent.node.parent_block=scope
  753. this.parent.node.bound={}
  754. this.set_name=function(name){this.random=$B.UUID()
  755. this.name=name
  756. this.id=C.node.module+'_'+name+'_'+this.random
  757. $B.bound[this.id]={}
  758. if($B.async_enabled)$B.block[this.id]={}
  759. $B.modules[this.id]=this.parent.node
  760. this.parent.node.id=this.id
  761. var parent_block=scope
  762. while(parent_block.C && parent_block.C.tree[0].type=='class'){parent_block=parent_block.parent}
  763. while(parent_block.C &&
  764. 'def' !=parent_block.C.tree[0].type &&
  765. 'generator' !=parent_block.C.tree[0].type){parent_block=parent_block.parent}
  766. this.parent.node.parent_block=parent_block
  767. this.level=this.scope.level
  768. $B.bound[this.scope.id][name]=this
  769. if(scope.is_function){if(scope.C.tree[0].locals.indexOf(name)==-1){scope.C.tree[0].locals.push(name)}}}
  770. this.transform=function(node,rank){
  771. this.doc_string=$get_docstring(node)
  772. var instance_decl=new $Node()
  773. var local_ns='$locals_'+this.id.replace(/\./g,'_')
  774. var js=';var '+local_ns+'={}'
  775. js +=', $locals = '+local_ns+';'
  776. new $NodeJSCtx(instance_decl,js)
  777. node.insert(0,instance_decl)
  778. var ret_obj=new $Node()
  779. new $NodeJSCtx(ret_obj,'return '+local_ns+';')
  780. node.insert(node.children.length,ret_obj)
  781. var run_func=new $Node()
  782. new $NodeJSCtx(run_func,')();')
  783. node.parent.insert(rank+1,run_func)
  784. var scope=$get_scope(this)
  785. var name_ref=';$locals_'+scope.id.replace(/\./g,'_')
  786. name_ref +='["'+this.name+'"]'
  787. var js=[name_ref +'=$B.$class_constructor("'+this.name],pos=1
  788. js[pos++]='",$'+this.name+'_'+this.random
  789. if(this.args!==undefined){
  790. var arg_tree=this.args.tree,args=[],kw=[]
  791. for(var i=0;i<arg_tree.length;i++){var _tmp=arg_tree[i]
  792. if(_tmp.tree[0].type=='kwarg'){kw.push(_tmp.tree[0])}
  793. else{args.push(_tmp.to_js())}}
  794. js[pos++]=',tuple(['+args.join(',')+']),['
  795. var _re=new RegExp('"','g')
  796. var _r=[],rpos=0
  797. for(var i=0;i<args.length;i++){_r[rpos++]='"'+args[i].replace(_re,'\\"')+'"'}
  798. js[pos++]=_r.join(',')+ ']'
  799. _r=[],rpos=0
  800. for(var i=0;i<kw.length;i++){var _tmp=kw[i]
  801. _r[rpos++]='["'+_tmp.tree[0].value+'",'+_tmp.tree[1].to_js()+']'}
  802. js[pos++]=',[' + _r.join(',')+ ']'}else{
  803. js[pos++]=',tuple([]),[],[]'}
  804. js[pos++]=')'
  805. var cl_cons=new $Node()
  806. new $NodeJSCtx(cl_cons,js.join(''))
  807. rank++
  808. node.parent.insert(rank+1,cl_cons)
  809. rank++
  810. var ds_node=new $Node()
  811. js=name_ref+'.$dict.__doc__='
  812. if(this.name=='classXXX'){
  813. js=name_ref+'.__doc__='}
  814. js +=(this.doc_string ||'None')+';'
  815. new $NodeJSCtx(ds_node,js)
  816. node.parent.insert(rank+1,ds_node)
  817. rank++
  818. js=name_ref+'.$dict.__module__=$locals_'
  819. if(this.name=='classXXX'){
  820. js=name_ref+'.__module__=$locals_'}
  821. js +=$get_module(this).module.replace(/\./g,'_')+'.__name__'
  822. var mod_node=new $Node()
  823. new $NodeJSCtx(mod_node,js)
  824. node.parent.insert(rank+1,mod_node)
  825. if(scope.ntype==='module'){var w_decl=new $Node()
  826. new $NodeJSCtx(w_decl,'$locals["'+ this.name+'"]='+this.name)}
  827. var end_node=new $Node()
  828. new $NodeJSCtx(end_node,'None;')
  829. node.parent.insert(rank+2,end_node)
  830. this.transformed=true}
  831. this.to_js=function(){this.js_processed=true
  832. return 'var $'+this.name+'_'+this.random+'=(function()'}}
  833. function $CompIfCtx(C){
  834. this.type='comp_if'
  835. C.parent.intervals.push($pos)
  836. this.parent=C
  837. this.tree=[]
  838. C.tree[C.tree.length]=this
  839. this.toString=function(){return '(comp if) '+this.tree}
  840. this.to_js=function(){this.js_processed=true
  841. return $to_js(this.tree)}}
  842. function $ComprehensionCtx(C){
  843. this.type='comprehension'
  844. this.parent=C
  845. this.tree=[]
  846. C.tree[C.tree.length]=this
  847. this.toString=function(){return '(comprehension) '+this.tree}
  848. this.to_js=function(){this.js_processed=true
  849. var _i=[],pos=0
  850. for(var j=0;j<this.tree.length;j++)_i[pos++]=this.tree[j].start
  851. return _i}}
  852. function $CompForCtx(C){
  853. this.type='comp_for'
  854. C.parent.intervals.push($pos)
  855. this.parent=C
  856. this.tree=[]
  857. this.expect='in'
  858. C.tree[C.tree.length]=this
  859. this.toString=function(){return '(comp for) '+this.tree}
  860. this.to_js=function(){this.js_processed=true
  861. return $to_js(this.tree)}}
  862. function $CompIterableCtx(C){
  863. this.type='comp_iterable'
  864. this.parent=C
  865. this.tree=[]
  866. C.tree[C.tree.length]=this
  867. this.toString=function(){return '(comp iter) '+this.tree}
  868. this.to_js=function(){this.js_processed=true
  869. return $to_js(this.tree)}}
  870. function $ConditionCtx(C,token){
  871. this.type='condition'
  872. this.token=token
  873. this.parent=C
  874. this.tree=[]
  875. if(token==='while'){this.loop_num=$loop_num++}
  876. C.tree[C.tree.length]=this
  877. this.toString=function(){return this.token+' '+this.tree}
  878. this.transform=function(node,rank){var scope=$get_scope(this)
  879. if(this.token=="while"){if(scope.ntype=='generator'){this.parent.node.loop_start=this.loop_num}
  880. var new_node=new $Node()
  881. var js='$locals["$no_break'+this.loop_num+'"]=true'
  882. new $NodeJSCtx(new_node,js)
  883. node.parent.insert(rank,new_node)
  884. return 2}}
  885. this.to_js=function(){this.js_processed=true
  886. var tok=this.token
  887. if(tok==='elif'){tok='else if'}
  888. var res=[tok+'(bool(']
  889. if(tok=='while'){res.push('$locals["$no_break'+this.loop_num+'"] && ')}else if(tok=='else if'){var line_info=$get_node(this).line_num+','+$get_scope(this).id
  890. res.push('($locals.$line_info="'+line_info+'") && ')}
  891. if(this.tree.length==1){res.push($to_js(this.tree)+'))')}else{
  892. res.push(this.tree[0].to_js()+'))')
  893. if(this.tree[1].tree.length>0){res.push('{'+this.tree[1].to_js()+'}')}}
  894. return res.join('')}}
  895. function $ContinueCtx(C){
  896. this.type='continue'
  897. this.parent=C
  898. $get_node(this).is_continue=true
  899. C.tree[C.tree.length]=this
  900. set_loop_C.apply(this,[C,'continue'])
  901. this.toString=function(){return '(continue)'}
  902. this.to_js=function(){this.js_processed=true
  903. return 'continue'}}
  904. function $DebuggerCtx(C){
  905. this.type='continue'
  906. this.parent=C
  907. C.tree[C.tree.length]=this
  908. this.toString=function(){return '(debugger)'}
  909. this.to_js=function(){this.js_processed=true
  910. return 'debugger'}}
  911. function $DecoratorCtx(C){
  912. this.type='decorator'
  913. this.parent=C
  914. C.tree[C.tree.length]=this
  915. this.tree=[]
  916. this.toString=function(){return '(decorator) '+this.tree}
  917. this.transform=function(node,rank){var func_rank=rank+1,children=node.parent.children
  918. var decorators=[this.tree]
  919. while(1){if(func_rank>=children.length){$_SyntaxError(C,['decorator expects function'])}
  920. else if(children[func_rank].C.type=='node_js'){func_rank++}
  921. else if(children[func_rank].C.tree[0].type==='decorator'){decorators.push(children[func_rank].C.tree[0].tree)
  922. children.splice(func_rank,1)}else{break}}
  923. this.dec_ids=[]
  924. var pos=0
  925. for(var i=0;i<decorators.length;i++){this.dec_ids[pos++]='$id'+ $B.UUID()}
  926. if($B.async_enabled){var _block_async_flag=false;
  927. for(var i=0;i<decorators.length;i++){try{
  928. var name=decorators[i][0].tree[0].value
  929. if(name=="brython_block" ||name=="brython_async")_block_async_flag=true}catch(err){console.log(i);console.log(decorators[i][0])}}}
  930. var obj=children[func_rank].C.tree[0]
  931. if(obj.type=='def'){obj.decorated=true
  932. obj.alias='$dec'+$B.UUID()}
  933. var tail='',scope=$get_scope(this),ref='$locals["'+obj.name+'"]',res=ref+'='
  934. for(var i=0;i<decorators.length;i++){
  935. res +='getattr('+this.dec_ids[i]+',"__call__")('
  936. tail +=')'}
  937. res +=(obj.decorated ? obj.alias : ref)+tail+';'
  938. $B.bound[scope.id][obj.name]=true
  939. var decor_node=new $Node()
  940. new $NodeJSCtx(decor_node,res)
  941. node.parent.insert(func_rank+1,decor_node)
  942. this.decorators=decorators
  943. if($B.async_enabled && _block_async_flag){
  944. if($B.block[scope.id]===undefined)$B.block[scope.id]={}
  945. $B.block[scope.id][obj.name]=true}}
  946. this.to_js=function(){if($B.async_enabled){if(this.processing !==undefined)return ""}
  947. this.js_processed=true
  948. var res=[],pos=0
  949. for(var i=0;i<this.decorators.length;i++){res[pos++]='var '+this.dec_ids[i]+'='+$to_js(this.decorators[i])+';'}
  950. return res.join('')}}
  951. function $DefCtx(C){this.type='def'
  952. this.name=null
  953. this.parent=C
  954. this.tree=[]
  955. this.locals=[]
  956. this.yields=[]
  957. C.tree[C.tree.length]=this
  958. this.enclosing=[]
  959. var scope=this.scope=$get_scope(this)
  960. var parent_block=scope
  961. while(parent_block.C && parent_block.C.tree[0].type=='class'){parent_block=parent_block.parent}
  962. while(parent_block.C &&
  963. 'def' !=parent_block.C.tree[0].type &&
  964. 'generator' !=parent_block.C.tree[0].type){parent_block=parent_block.parent}
  965. this.parent.node.parent_block=parent_block
  966. var pb=parent_block
  967. while(pb && pb.C){if(pb.C.tree[0].type=='def'){this.inside_function=true
  968. break}
  969. pb=pb.parent_block}
  970. this.module=scope.module
  971. this.num=$loop_num
  972. $loop_num++
  973. this.positional_list=[]
  974. this.default_list=[]
  975. this.other_args=null
  976. this.other_kw=null
  977. this.after_star=[]
  978. this.set_name=function(name){var id_ctx=new $IdCtx(this,name)
  979. this.name=name
  980. this.id=this.scope.id+'_'+name
  981. this.id=this.id.replace(/\./g,'_')
  982. this.id +='_'+ $B.UUID()
  983. this.parent.node.id=this.id
  984. this.parent.node.module=this.module
  985. $B.modules[this.id]=this.parent.node
  986. $B.bound[this.id]={}
  987. this.level=this.scope.level
  988. $B.bound[this.scope.id][name]=this
  989. id_ctx.bound=true
  990. if(scope.is_function){if(scope.C.tree[0].locals.indexOf(name)==-1){scope.C.tree[0].locals.push(name)}}}
  991. this.toString=function(){return 'def '+this.name+'('+this.tree+')'}
  992. this.transform=function(node,rank){
  993. if(this.transformed!==undefined)return
  994. var scope=this.scope
  995. var pb=this.parent.node
  996. while(pb && pb.C){if(pb.C.tree[0].type=='def'){this.inside_function=true
  997. break}
  998. pb=pb.parent}
  999. this.doc_string=$get_docstring(node)
  1000. this.rank=rank
  1001. var indent=node.indent+16
  1002. if(this.name.substr(0,15)=='lambda_'+$B.lambda_magic){var pblock=$B.modules[scope.id].parent_block
  1003. if(pblock.C && pblock.C.tree[0].type=="def"){this.enclosing.push(pblock)}}
  1004. var pnode=this.parent.node
  1005. while(pnode.parent && pnode.parent.is_def_func){this.enclosing.push(pnode.parent.parent)
  1006. pnode=pnode.parent.parent}
  1007. var defaults=[],apos=0,dpos=0,defs1=[],dpos1=0
  1008. this.argcount=0
  1009. this.kwonlyargcount=0
  1010. this.varnames={}
  1011. this.args=[]
  1012. this.__defaults__=[]
  1013. this.slots=[]
  1014. var slot_list=[]
  1015. var annotations=[]
  1016. if(this.annotation){annotations.push('"return":'+this.annotation.to_js())}
  1017. var func_args=this.tree[1].tree
  1018. for(var i=0;i<func_args.length;i++){var arg=func_args[i]
  1019. this.args[apos++]=arg.name
  1020. this.varnames[arg.name]=true
  1021. if(arg.type==='func_arg_id'){if(this.star_arg){this.kwonlyargcount++}
  1022. else{this.argcount++}
  1023. this.slots.push(arg.name+':null')
  1024. slot_list.push('"'+arg.name+'"')
  1025. if(arg.tree.length>0){defaults[dpos++]='"'+arg.name+'"'
  1026. defs1[dpos1++]=arg.name+':'+$to_js(arg.tree)
  1027. this.__defaults__.push($to_js(arg.tree))}}else if(arg.type=='func_star_arg'){if(arg.op=='*'){this.star_arg=arg.name}
  1028. else if(arg.op=='**'){this.kw_arg=arg.name}}
  1029. if(arg.annotation){annotations.push(arg.name+': '+arg.annotation.to_js())}}
  1030. var flags=67
  1031. if(this.star_arg){flags |=4}
  1032. if(this.kw_arg){flags |=8}
  1033. if(this.type=='generator'){flags |=32}
  1034. var positional_str=[],positional_obj=[],pos=0
  1035. for(var i=0,_len=this.positional_list.length;i<_len;i++){positional_str[pos]='"'+this.positional_list[i]+'"'
  1036. positional_obj[pos++]=this.positional_list[i]+':null'}
  1037. positional_str=positional_str.join(',')
  1038. positional_obj='{'+positional_obj.join(',')+'}'
  1039. var dobj=[],pos=0
  1040. for(var i=0;i<this.default_list.length;i++){dobj[pos++]=this.default_list[i]+':null'}
  1041. dobj='{'+dobj.join(',')+'}'
  1042. var nodes=[],js
  1043. var global_scope=scope
  1044. while(global_scope.parent_block.id !=='__builtins__'){global_scope=global_scope.parent_block}
  1045. var global_ns='$locals_'+global_scope.id.replace(/\./g,'_')
  1046. var prefix=this.tree[0].to_js()
  1047. if(this.decorated){prefix=this.alias}
  1048. var name=this.name+this.num
  1049. var local_ns='$locals_'+this.id
  1050. js='var '+local_ns+'={}, '
  1051. js +='$local_name="'+this.id+'",$locals='+local_ns+';'
  1052. var new_node=new $Node()
  1053. new_node.locals_def=true
  1054. new $NodeJSCtx(new_node,js)
  1055. nodes.push(new_node)
  1056. var enter_frame_node=new $Node(),js=';var $top_frame = [$local_name, $locals,'+
  1057. '"'+global_scope.id+'", '+global_ns+
  1058. ']; $B.frames_stack.push($top_frame); var $stack_length = '+
  1059. '$B.frames_stack.length;'
  1060. if($B.profile > 1){if(this.scope.ntype=='class'){fname=this.scope.C.tree[0].name+'.'+this.name}
  1061. else fname=this.name
  1062. if(pnode && pnode.id){fmod=pnode.id.slice(0,pnode.id.indexOf('_'))}
  1063. else fmod='';
  1064. js=";var _parent_line_info={}; if($B.frames_stack[$B.frames_stack.length-1]){"+
  1065. " _parent_line_info=$B.frames_stack[$B.frames_stack.length-1][1].$line_info;"+
  1066. "} else _parent_line_info="+global_ns+".$line_info;"+
  1067. ";$B.$profile.call('"+fmod+"','"+fname+"',"+
  1068. node.line_num+",_parent_line_info)"+js;}
  1069. enter_frame_node.enter_frame=true
  1070. new $NodeJSCtx(enter_frame_node,js)
  1071. nodes.push(enter_frame_node)
  1072. this.env=[]
  1073. var make_args_nodes=[]
  1074. var js=this.type=='def' ? local_ns+' = $locals' : 'var $ns'
  1075. js +=' = $B.args("'+this.name+'", '+
  1076. this.argcount+', {'+this.slots.join(', ')+'}, '+
  1077. '['+slot_list.join(', ')+'], arguments, '
  1078. if(defs1.length){js +='$defaults, '}
  1079. else{js +='{}, '}
  1080. js +=this.other_args+', '+this.other_kw+');'
  1081. var new_node=new $Node()
  1082. new $NodeJSCtx(new_node,js)
  1083. make_args_nodes.push(new_node)
  1084. if(this.type=='generator'){
  1085. js='for(var $var in $ns){$locals[$var]=$ns[$var]};'
  1086. make_args_nodes.push($NodeJS(js))}
  1087. var only_positional=false
  1088. if(this.other_args===null && this.other_kw===null &&
  1089. this.after_star.length==0
  1090. && defaults.length==0){
  1091. only_positional=true
  1092. if($B.debug>0 ||this.positional_list.length>0){
  1093. nodes.push($NodeJS('var $len = arguments.length;'))
  1094. var new_node=new $Node()
  1095. var js='if($len>0 && arguments[$len-1].$nat!==undefined)'
  1096. new $NodeJSCtx(new_node,js)
  1097. nodes.push(new_node)
  1098. new_node.add(make_args_nodes[0])
  1099. if(make_args_nodes.length>1){new_node.add(make_args_nodes[1])}
  1100. var else_node=new $Node()
  1101. new $NodeJSCtx(else_node,'else')
  1102. nodes.push(else_node)}
  1103. var pos_len=this.positional_list.length
  1104. if($B.debug>0){
  1105. js='if($len!='+pos_len+'){$B.wrong_nb_args("'+this.name+
  1106. '", $len, '+pos_len
  1107. if(positional_str.length>0){js +=', ['+positional_str+']'}
  1108. js +=')}'
  1109. else_node.add($NodeJS(js))}
  1110. if(this.positional_list.length>0){if(this.type=='generator'){for(var i=0;i<this.positional_list.length;i++){var arg=this.positional_list[i]
  1111. var new_node=new $Node()
  1112. var js='$locals["'+arg+'"]='+arg
  1113. new $NodeJSCtx(new_node,js)
  1114. else_node.add(new_node)}}else{var pargs=[]
  1115. for(var i=0;i<this.positional_list.length;i++){var arg=this.positional_list[i]
  1116. pargs.push(arg+':'+arg)}
  1117. js='if($len!='+pos_len+'){$B.wrong_nb_args("'+this.name+
  1118. '", $len, '+pos_len
  1119. if(positional_str.length>0){js +=', ['+positional_str+']'}
  1120. js +=')}'
  1121. else_node.add($NodeJS(js))
  1122. else_node.add($NodeJS(local_ns+'=$locals={'+pargs.join(', ')+'}'))}}}else{nodes.push(make_args_nodes[0])
  1123. if(make_args_nodes.length>1){nodes.push(make_args_nodes[1])}}
  1124. nodes.push($NodeJS('$B.frames_stack[$B.frames_stack.length-1][1] = $locals;'))
  1125. nodes.push($NodeJS('$B.js_this = this;'))
  1126. for(var i=nodes.length-1;i>=0;i--){node.children.splice(0,0,nodes[i])}
  1127. var def_func_node=new $Node()
  1128. this.params=''
  1129. if(only_positional){this.params=Object.keys(this.varnames).join(', ')
  1130. new $NodeJSCtx(def_func_node,'')}else{new $NodeJSCtx(def_func_node,'')}
  1131. def_func_node.is_def_func=true
  1132. def_func_node.module=this.module
  1133. var last_instr=node.children[node.children.length-1].C.tree[0]
  1134. if(last_instr.type!=='return' && this.type!='generator'){
  1135. node.add($NodeJS('$B.leave_frame($local_name);return None'))}
  1136. node.add(def_func_node)
  1137. var offset=1
  1138. var indent=node.indent
  1139. node.parent.insert(rank+offset++,$NodeJS(name+'.$infos = {'))
  1140. js=' __name__:"'
  1141. if(this.scope.ntype=='class'){js+=this.scope.C.tree[0].name+'.'}
  1142. js +=this.name+'",'
  1143. node.parent.insert(rank+offset++,$NodeJS(js))
  1144. var def_names=[]
  1145. for(var i=0;i<this.default_list.length;i++){def_names.push('"'+this.default_list[i]+'"')}
  1146. node.parent.insert(rank+offset++,$NodeJS(' __defaults__ : ['+
  1147. def_names.join(', ')+'],'))
  1148. var module=$get_module(this)
  1149. js=' __module__ : "'+module.module+'",'
  1150. node.parent.insert(rank+offset++,$NodeJS(js))
  1151. js=' __doc__: '+(this.doc_string ||'None')+','
  1152. node.parent.insert(rank+offset++,$NodeJS(js))
  1153. js=' __annotations__: {'+annotations.join(',')+'},'
  1154. node.parent.insert(rank+offset++,$NodeJS(js))
  1155. for(var attr in $B.bound[this.id]){this.varnames[attr]=true}
  1156. var co_varnames=[]
  1157. for(var attr in this.varnames){co_varnames.push('"'+attr+'"')}
  1158. var h='\n'+' '.repeat(indent+8)
  1159. js=' __code__:{'+h+' __class__:$B.$CodeDict'
  1160. var h1=','+h+' '.repeat(4)
  1161. js +=h1+'co_argcount:'+this.argcount+
  1162. h1+'co_filename:$locals_'+scope.module.replace(/\./g,'_')+'["__file__"]'+
  1163. h1+'co_firstlineno:'+node.line_num+
  1164. h1+'co_flags:'+flags+
  1165. h1+'co_kwonlyargcount:'+this.kwonlyargcount+
  1166. h1+'co_name: "'+this.name+'"'+
  1167. h1+'co_nlocals: '+co_varnames.length+
  1168. h1+'co_varnames: ['+co_varnames.join(', ')+']'+
  1169. h+'}\n };'
  1170. js +='None;'
  1171. new_node=new $Node()
  1172. new $NodeJSCtx(new_node,js)
  1173. node.parent.insert(rank+offset++,new_node)
  1174. this.default_str='{'+defs1.join(', ')+'}'
  1175. if(this.type=="def"){node.parent.insert(rank+offset++,$NodeJS('return '+name+'})('+
  1176. this.default_str+')'))}
  1177. if(this.type=='def'){var parent=node
  1178. for(var pos=0;pos<parent.children.length &&
  1179. parent.children[pos]!==enter_frame_node;pos++){}
  1180. var try_node=$NodeJS('try'),children=parent.children.slice(pos+1)
  1181. parent.insert(pos+1,try_node)
  1182. for(var i=0;i<children.length;i++){if(children[i].is_def_func){for(var j=0;j<children[i].children.length;j++){try_node.add(children[i].children[j])}}else{try_node.add(children[i])}}
  1183. parent.children.splice(pos+2,parent.children.length)
  1184. var except_node=$NodeJS('catch(err)')
  1185. except_node.add($NodeJS('$B.leave_frame($local_name);throw err'))
  1186. parent.add(except_node)}
  1187. this.transformed=true
  1188. return offset}
  1189. this.to_js=function(func_name){this.js_processed=true
  1190. func_name=func_name ||this.tree[0].to_js()
  1191. if(this.decorated){func_name='var '+this.alias}
  1192. func_name=func_name ||this.tree[0].to_js()
  1193. if(this.decorated){func_name='var '+this.alias}
  1194. return func_name+' = (function ($defaults){function '+
  1195. this.name+this.num+'('+this.params+')'}}
  1196. function $DelCtx(C){
  1197. this.type='del'
  1198. this.parent=C
  1199. C.tree[C.tree.length]=this
  1200. this.tree=[]
  1201. this.toString=function(){return 'del '+this.tree}
  1202. this.to_js=function(){this.js_processed=true
  1203. if(this.tree[0].type=='list_or_tuple'){
  1204. var res=[],pos=0
  1205. for(var i=0;i<this.tree[0].tree.length;i++){var subdel=new $DelCtx(C)
  1206. subdel.tree=[this.tree[0].tree[i]]
  1207. res[pos++]=subdel.to_js()
  1208. C.tree.pop()}
  1209. this.tree=[]
  1210. return res.join(';')}else{var expr=this.tree[0].tree[0]
  1211. switch(expr.type){case 'id':
  1212. return 'delete '+expr.to_js()+';'
  1213. case 'list_or_tuple':
  1214. var res=[],pos=0
  1215. for(var i=0;i<expr.tree.length;i++){res[pos++]='delete '+expr.tree[i].to_js()}
  1216. return res.join(';')
  1217. case 'sub':
  1218. expr.func='delitem'
  1219. js=expr.to_js()
  1220. expr.func='getitem'
  1221. return js
  1222. case 'op':
  1223. $_SyntaxError(this,["can't delete operator"])
  1224. case 'call':
  1225. $_SyntaxError(this,["can't delete function call"])
  1226. case 'attribute':
  1227. return 'delattr('+expr.value.to_js()+',"'+expr.name+'")'
  1228. default:
  1229. $_SyntaxError(this,["can't delete "+expr.type])}}}}
  1230. function $DictOrSetCtx(C){
  1231. this.type='dict_or_set'
  1232. this.real='dict_or_set'
  1233. this.expect='id'
  1234. this.closed=false
  1235. this.start=$pos
  1236. this.parent=C
  1237. this.tree=[]
  1238. C.tree[C.tree.length]=this
  1239. this.toString=function(){switch(this.real){case 'dict':
  1240. return '(dict) {'+this.items+'}'
  1241. case 'set':
  1242. return '(set) {'+this.tree+'}'}
  1243. return '(dict_or_set) {'+this.tree+'}'}
  1244. this.to_js=function(){this.js_processed=true
  1245. switch(this.real){case 'dict':
  1246. var res=[],pos=0
  1247. for(var i=0;i<this.items.length;i+=2){res[pos++]='['+this.items[i].to_js()+','+this.items[i+1].to_js()+']'}
  1248. return 'dict(['+res.join(',')+'])'+$to_js(this.tree)
  1249. case 'set_comp':
  1250. return 'set('+$to_js(this.items)+')'+$to_js(this.tree)
  1251. case 'dict_comp':
  1252. return 'dict('+$to_js(this.items)+')'+$to_js(this.tree)}
  1253. return 'set(['+$to_js(this.items)+'])'+$to_js(this.tree)}}
  1254. function $DoubleStarArgCtx(C){
  1255. this.type='double_star_arg'
  1256. this.parent=C
  1257. this.tree=[]
  1258. C.tree[C.tree.length]=this
  1259. this.toString=function(){return '**'+this.tree}
  1260. this.to_js=function(){this.js_processed=true
  1261. return '{$nat:"pdict",arg:'+$to_js(this.tree)+'}'}}
  1262. function $EllipsisCtx(C){
  1263. this.type='ellipsis'
  1264. this.parent=C
  1265. this.nbdots=1
  1266. C.tree[C.tree.length]=this
  1267. this.toString=function(){return 'ellipsis'}
  1268. this.to_js=function(){this.js_processed=true
  1269. return '$B.builtins["Ellipsis"]'}}
  1270. function $ExceptCtx(C){
  1271. this.type='except'
  1272. this.parent=C
  1273. C.tree[C.tree.length]=this
  1274. this.tree=[]
  1275. this.expect='id'
  1276. this.scope=$get_scope(this)
  1277. this.toString=function(){return '(except) '}
  1278. this.set_alias=function(alias){this.tree[0].alias=alias
  1279. $B.bound[this.scope.id][alias]={level: this.scope.level}}
  1280. this.to_js=function(){
  1281. this.js_processed=true
  1282. switch(this.tree.length){case 0:
  1283. return 'else'
  1284. case 1:
  1285. if(this.tree[0].name==='Exception')return 'else if(1)'}
  1286. var res=[],pos=0
  1287. for(var i=0;i<this.tree.length;i++){res[pos++]=this.tree[i].to_js()}
  1288. var lnum=''
  1289. if($B.debug>0){lnum='($locals.$line_info="'+$get_node(this).line_num+','+
  1290. this.scope.id+'") && '}
  1291. return 'else if('+lnum+'$B.is_exc('+this.error_name+',['+res.join(',')+']))'}}
  1292. function $ExprCtx(C,name,with_commas){
  1293. this.type='expr'
  1294. this.name=name
  1295. this.with_commas=with_commas
  1296. this.expect=','
  1297. this.parent=C
  1298. this.tree=[]
  1299. C.tree[C.tree.length]=this
  1300. this.toString=function(){return '(expr '+with_commas+') '+this.tree}
  1301. this.to_js=function(arg){this.js_processed=true
  1302. if(this.type==='list')return '['+$to_js(this.tree)+']'
  1303. if(this.tree.length===1)return this.tree[0].to_js(arg)
  1304. return 'tuple('+$to_js(this.tree)+')'}}
  1305. function $ExprNot(C){
  1306. this.type='expr_not'
  1307. this.parent=C
  1308. this.tree=[]
  1309. C.tree[C.tree.length]=this
  1310. this.toString=function(){return '(expr_not)'}}
  1311. function $FloatCtx(C,value){
  1312. this.type='float'
  1313. this.value=value
  1314. this.toString=function(){return 'float '+this.value}
  1315. this.parent=C
  1316. this.tree=[]
  1317. C.tree[C.tree.length]=this
  1318. this.to_js=function(){this.js_processed=true
  1319. if(/^\d+$/.exec(this.value)||
  1320. /^\d+\.\d*$/.exec(this.value)){return '(new Number('+this.value+'))'}
  1321. return 'float('+this.value+')'}}
  1322. function $ForExpr(C){
  1323. this.type='for'
  1324. this.parent=C
  1325. this.tree=[]
  1326. C.tree[C.tree.length]=this
  1327. this.loop_num=$loop_num
  1328. this.module=$get_scope(this).module
  1329. $loop_num++
  1330. this.toString=function(){return '(for) '+this.tree}
  1331. this.transform=function(node,rank){var scope=$get_scope(this),target=this.tree[0],target_is_1_tuple=target.tree.length==1 && target.expect=='id',iterable=this.tree[1],num=this.loop_num,local_ns='$locals_'+scope.id.replace(/\./g,'_'),h='\n'+' '.repeat(node.indent+4)
  1332. var $range=false
  1333. if(target.tree.length==1 &&
  1334. target.expct !='id' &&
  1335. iterable.type=='expr' &&
  1336. iterable.tree[0].type=='expr' &&
  1337. iterable.tree[0].tree[0].type=='call'){var call=iterable.tree[0].tree[0]
  1338. if(call.func.type=='id'){var func_name=call.func.value
  1339. if(func_name=='range' && call.tree.length<3){$range=call}}}
  1340. var new_nodes=[],pos=0
  1341. var children=node.children
  1342. var offset=1
  1343. if($range && scope.ntype!='generator'){if(this.has_break){
  1344. new_node=new $Node()
  1345. new $NodeJSCtx(new_node,local_ns+'["$no_break'+num+'"]=true')
  1346. new_nodes[pos++]=new_node}
  1347. var range_is_builtin=false
  1348. if(!scope.blurred){var _scope=$get_scope(this),found=[],fpos=0
  1349. while(1){if($B.bound[_scope.id]['range']){found[fpos++]=_scope.id}
  1350. if(_scope.parent_block){_scope=_scope.parent_block}
  1351. else{break}}
  1352. range_is_builtin=found.length==1 && found[0]=="__builtins__"
  1353. if(found==['__builtins__']){range_is_builtin=true}}
  1354. var test_range_node=new $Node()
  1355. if(range_is_builtin){new $NodeJSCtx(test_range_node,'if(1)')}else{new $NodeJSCtx(test_range_node,'if('+call.func.to_js()+'===$B.builtins.range)')}
  1356. new_nodes[pos++]=test_range_node
  1357. var idt=target.to_js()
  1358. if($range.tree.length==1){var start=0,stop=$range.tree[0].to_js()}else{var start=$range.tree[0].to_js(),stop=$range.tree[1].to_js()}
  1359. var js='var $stop_'+num +'=$B.int_or_bool('+
  1360. stop+');'+h+idt+'='+start+';'+h+
  1361. ' var $next'+num+'= '+idt+','+h+
  1362. ' $safe'+num+'= typeof $next'+num+'=="number" && typeof '+
  1363. '$stop_'+num+'=="number";'+h+'while(true)'
  1364. var for_node=new $Node()
  1365. new $NodeJSCtx(for_node,js)
  1366. for_node.add($NodeJS('if($safe'+num+' && $next'+num+'>= $stop_'+
  1367. num+'){break}'))
  1368. for_node.add($NodeJS('else if(!$safe'+num+
  1369. ' && $B.ge($next'+num+', $stop_'+num+
  1370. ')){break}'))
  1371. for_node.add($NodeJS(idt+' = $next'+num))
  1372. for_node.add($NodeJS('if($safe'+num+'){$next'+num+'+=1'+'}'))
  1373. for_node.add($NodeJS('else{$next'+num+'=$B.add($next'+num+',1)}'))
  1374. for(var i=0;i<children.length;i++){for_node.add(children[i].clone())}
  1375. for_node.add($NodeJS('$locals.$line_info="'+node.line_num+','+
  1376. scope.id+'"; None;'))
  1377. var in_loop=false
  1378. if(scope.ntype=='module'){var pnode=node.parent
  1379. while(pnode){if(pnode.for_wrapper){in_loop=true;break}
  1380. pnode=pnode.parent}}
  1381. if(scope.ntype=='module' && !in_loop){var func_node=new $Node()
  1382. func_node.for_wrapper=true
  1383. js='function $f'+num+'('
  1384. if(this.has_break){js +='$no_break'+num}
  1385. js +=')'
  1386. new $NodeJSCtx(func_node,js)
  1387. test_range_node.add(func_node)
  1388. func_node.add(for_node)
  1389. if(this.has_break){new_node=new $Node()
  1390. new $NodeJSCtx(new_node,'return $no_break'+num)
  1391. func_node.add(new_node)}
  1392. var end_func_node=new $Node()
  1393. new $NodeJSCtx(end_func_node,'var $res'+num+'=$f'+num+'();')
  1394. test_range_node.add(end_func_node)
  1395. if(this.has_break){var no_break=new $Node()
  1396. new $NodeJSCtx(no_break,'var $no_break'+num+'=$res'+num)
  1397. test_range_node.add(no_break)}}else{
  1398. test_range_node.add(for_node)}
  1399. if(range_is_builtin){node.parent.children.splice(rank,1)
  1400. var k=0
  1401. if(this.has_break){node.parent.insert(rank,new_nodes[0])
  1402. k++}
  1403. for(var i=new_nodes[k].children.length-1;i>=0;i--){node.parent.insert(rank+k,new_nodes[k].children[i])}
  1404. node.parent.children[rank].line_num=node.line_num
  1405. node.children=[]
  1406. return 0}
  1407. var else_node=new $Node()
  1408. new $NodeJSCtx(else_node,'else')
  1409. new_nodes[pos++]=else_node
  1410. for(var i=new_nodes.length-1;i>=0;i--){node.parent.insert(rank+1,new_nodes[i])}
  1411. this.test_range=true
  1412. new_nodes=[],pos=0}
  1413. var new_node=new $Node()
  1414. new_node.line_num=$get_node(this).line_num
  1415. var js='$locals["$next'+num+'"]'
  1416. js +='=getattr(iter('+iterable.to_js()+'),"__next__");\n'
  1417. new $NodeJSCtx(new_node,js)
  1418. new_nodes[pos++]=new_node
  1419. if(this.has_break){
  1420. new_node=new $Node()
  1421. new $NodeJSCtx(new_node,local_ns+'["$no_break'+num+'"]=true;')
  1422. new_nodes[pos++]=new_node}
  1423. var while_node=new $Node()
  1424. if(this.has_break){js='while('+local_ns+'["$no_break'+num+'"])'}
  1425. else{js='while(1)'}
  1426. new $NodeJSCtx(while_node,js)
  1427. while_node.C.loop_num=num
  1428. while_node.C.type='for'
  1429. while_node.line_num=node.line_num
  1430. if(scope.ntype=='generator'){
  1431. while_node.loop_start=num}
  1432. new_nodes[pos++]=while_node
  1433. node.parent.children.splice(rank,1)
  1434. if(this.test_range){for(var i=new_nodes.length-1;i>=0;i--){else_node.insert(0,new_nodes[i])}}else{for(var i=new_nodes.length-1;i>=0;i--){node.parent.insert(rank,new_nodes[i])
  1435. offset +=new_nodes.length}}
  1436. var try_node=new $Node()
  1437. new $NodeJSCtx(try_node,'try')
  1438. while_node.add(try_node)
  1439. var iter_node=new $Node()
  1440. iter_node.parent=$get_node(this).parent
  1441. iter_node.id=this.module
  1442. var C=new $NodeCtx(iter_node)
  1443. var target_expr=new $ExprCtx(C,'left',true)
  1444. if(target_is_1_tuple){
  1445. var t=new $ListOrTupleCtx(target_expr)
  1446. t.real='tuple'
  1447. t.tree=target.tree}else{target_expr.tree=target.tree}
  1448. var assign=new $AssignCtx(target_expr)
  1449. assign.tree[1]=new $JSCode('$locals["$next'+num+'"]()')
  1450. try_node.add(iter_node)
  1451. var catch_node=new $Node()
  1452. var js='catch($err){if($B.is_exc($err,[StopIteration]))'+
  1453. '{$B.clear_exc();break;}'
  1454. js +='else{throw($err)}}'
  1455. new $NodeJSCtx(catch_node,js)
  1456. while_node.add(catch_node)
  1457. for(var i=0;i<children.length;i++){while_node.add(children[i].clone())}
  1458. node.children=[]
  1459. return 0}
  1460. this.to_js=function(){this.js_processed=true
  1461. var iterable=this.tree.pop()
  1462. return 'for '+$to_js(this.tree)+' in '+iterable.to_js()}}
  1463. function $FromCtx(C){
  1464. this.type='from'
  1465. this.parent=C
  1466. this.module=''
  1467. this.names=[]
  1468. this.aliases={}
  1469. C.tree[C.tree.length]=this
  1470. this.expect='module'
  1471. this.scope=$get_scope(this)
  1472. this.add_name=function(name){this.names[this.names.length]=name
  1473. if(name=='*'){this.scope.blurred=true}}
  1474. this.transform=function(node,rank){if(!this.blocking){
  1475. var mod_name=this.module.replace(/\$/g,'')
  1476. if(this.names[0]=='*'){node.add($NodeJS('for(var $attr in $B.imported["'+mod_name+
  1477. '"]){if($attr.charAt(0)!=="_"){$locals[$attr]=$B.imported["'+mod_name+'"][$attr]}};'))}else{for(var i=0;i<this.names.length;i++){var name=this.names[i]
  1478. node.add($NodeJS('$locals["'+(this.aliases[name]||name)+
  1479. '"]=$B.imported["'+mod_name+'"]["'+name+'"]'))}}
  1480. for(var i=rank+1;i<node.parent.children.length;i++){node.add(node.parent.children[i])}
  1481. node.parent.children.splice(rank+1,node.parent.children.length)
  1482. node.parent.add($NodeJS(')'))}}
  1483. this.bind_names=function(){
  1484. var scope=$get_scope(this)
  1485. for(var i=0;i<this.names.length;i++){var name=this.aliases[this.names[i]]||this.names[i]
  1486. $B.bound[scope.id][name]={level: scope.level}}}
  1487. this.toString=function(){return '(from) '+this.module+' (import) '+this.names+'(as)'+this.aliases}
  1488. this.to_js=function(){this.js_processed=true
  1489. var scope=$get_scope(this),mod=$get_module(this).module,res=[],pos=0,indent=$get_node(this).indent,head=' '.repeat(indent);
  1490. var _mod=this.module.replace(/\$/g,''),package,packages=[]
  1491. while(_mod.length>0){if(_mod.charAt(0)=='.'){if(package===undefined){if($B.imported[mod]!==undefined){package=$B.imported[mod].__package__}}else{package=$B.imported[package]}
  1492. if(package===undefined){return 'throw SystemError("Parent module \'\' not loaded,'+
  1493. ' cannot perform relative import")'}else if(package=='None'){console.log('package is None !')}else{packages.push(package)}
  1494. _mod=_mod.substr(1)}else{break}}
  1495. if(_mod){packages.push(_mod)}
  1496. this.module=packages.join('.')
  1497. var mod_name=this.module.replace(/\$/g,'')
  1498. if(this.blocking){res[pos++]='$B.$import("';
  1499. res[pos++]=mod_name+'",["';
  1500. res[pos++]=this.names.join('","')+'"], {';
  1501. var sep='';
  1502. for(var attr in this.aliases){res[pos++]=sep + '"'+attr+'": "'+this.aliases[attr]+'"';
  1503. sep=',';}
  1504. res[pos++]='}, {}, true);';
  1505. if(this.names[0]=='*'){res[pos++]='\n'+head+'for(var $attr in $B.imported["'+mod_name+
  1506. '"]){if($attr.charAt(0)!=="_"){'+
  1507. '$locals[$attr]=$B.imported["'+mod_name+'"][$attr]}};'}else{for(var i=0;i<this.names.length;i++){var name=this.names[i]
  1508. res[pos++]='\n'+head+'$locals["'+(this.aliases[name]||name)+
  1509. '"]=$B.imported["'+mod_name+'"]["'+name+'"];'}}
  1510. res[pos++]='\n'+head+'None;';}else{res[pos++]='$B.$import_non_blocking("'+mod_name+'", function()'}
  1511. if(this.names[0]=='*'){
  1512. scope.blurred=true}
  1513. return res.join('');}}
  1514. function $FuncArgs(C){
  1515. this.type='func_args'
  1516. this.parent=C
  1517. this.tree=[]
  1518. this.names=[]
  1519. C.tree[C.tree.length]=this
  1520. this.toString=function(){return 'func args '+this.tree}
  1521. this.expect='id'
  1522. this.has_default=false
  1523. this.has_star_arg=false
  1524. this.has_kw_arg=false
  1525. this.to_js=function(){this.js_processed=true
  1526. return $to_js(this.tree)}}
  1527. function $FuncArgIdCtx(C,name){
  1528. this.type='func_arg_id'
  1529. this.name=name
  1530. this.parent=C
  1531. if(C.has_star_arg){C.parent.after_star.push(name)}else{C.parent.positional_list.push(name)}
  1532. var node=$get_node(this)
  1533. if($B.bound[node.id][name]){$_SyntaxError(C,["duplicate argument '"+name+"' in function definition"])}
  1534. $B.bound[node.id][name]={level:1}
  1535. this.tree=[]
  1536. C.tree[C.tree.length]=this
  1537. var ctx=C
  1538. while(ctx.parent!==undefined){if(ctx.type==='def'){ctx.locals.push(name)
  1539. break}
  1540. ctx=ctx.parent}
  1541. this.expect='='
  1542. this.toString=function(){return 'func arg id '+this.name +'='+this.tree}
  1543. this.to_js=function(){this.js_processed=true
  1544. return this.name+$to_js(this.tree)}}
  1545. function $FuncStarArgCtx(C,op){
  1546. this.type='func_star_arg'
  1547. this.op=op
  1548. this.parent=C
  1549. this.node=$get_node(this)
  1550. C.has_star_arg=op=='*'
  1551. C.has_kw_arg=op=='**'
  1552. C.tree[C.tree.length]=this
  1553. this.toString=function(){return '(func star arg '+this.op+') '+this.name}
  1554. this.set_name=function(name){this.name=name
  1555. if(name=='$dummy'){return}
  1556. if($B.bound[this.node.id][name]){$_SyntaxError(C,["duplicate argument '"+name+"' in function definition"])}
  1557. $B.bound[this.node.id][name]={level:1}
  1558. var ctx=C
  1559. while(ctx.parent!==undefined){if(ctx.type==='def'){ctx.locals.push(name)
  1560. break}
  1561. ctx=ctx.parent}
  1562. if(op=='*'){ctx.other_args='"'+name+'"'}
  1563. else{ctx.other_kw='"'+name+'"'}}}
  1564. function $GlobalCtx(C){
  1565. this.type='global'
  1566. this.parent=C
  1567. this.tree=[]
  1568. C.tree[C.tree.length]=this
  1569. this.expect='id'
  1570. this.toString=function(){return 'global '+this.tree}
  1571. this.scope=$get_scope(this)
  1572. $B._globals[this.scope.id]=$B._globals[this.scope.id]||{}
  1573. this.add=function(name){$B._globals[this.scope.id][name]=true}
  1574. this.to_js=function(){this.js_processed=true
  1575. return ''}}
  1576. function $IdCtx(C,value){
  1577. this.type='id'
  1578. this.toString=function(){return '(id) '+this.value+':'+(this.tree||'')}
  1579. this.value=value
  1580. this.parent=C
  1581. this.tree=[]
  1582. C.tree[C.tree.length]=this
  1583. var scope=this.scope=$get_scope(this)
  1584. this.blurred_scope=this.scope.blurred
  1585. this.env=clone($B.bound[this.scope.id])
  1586. if(C.parent.type==='call_arg'){this.call_arg=true}
  1587. this.level=$get_level(this)
  1588. var ctx=C
  1589. while(ctx.parent!==undefined){switch(ctx.type){case 'ctx_manager_alias':
  1590. $B.bound[scope.id][value]={level: $get_level(this)}
  1591. break
  1592. case 'list_or_tuple':
  1593. case 'dict_or_set':
  1594. case 'call_arg':
  1595. case 'def':
  1596. case 'lambda':
  1597. if(ctx.vars===undefined){ctx.vars=[value]}
  1598. else if(ctx.vars.indexOf(value)===-1){ctx.vars.push(value)}
  1599. if(this.call_arg&&ctx.type==='lambda'){if(ctx.locals===undefined){ctx.locals=[value]}
  1600. else{ctx.locals.push(value)}}}
  1601. ctx=ctx.parent}
  1602. if(C.type=='packed'){
  1603. $B.bound[scope.id][value]={level: $get_level(this)}
  1604. this.bound=true}
  1605. if(C.type=='target_list' ||
  1606. (C.type=='expr' && C.parent.type=='target_list')){
  1607. $B.bound[scope.id][value]={level: $get_level(this)}
  1608. this.bound=true}
  1609. if(scope.ntype=='def' ||scope.ntype=='generator'){
  1610. var _ctx=this.parent
  1611. while(_ctx){if(_ctx.type=='list_or_tuple' && _ctx.is_comp()){this.in_comp=true
  1612. return}
  1613. _ctx=_ctx.parent}
  1614. if(C.type=='expr' && C.parent.type=='comp_if'){
  1615. return}else if(C.type=='global'){if(scope.globals===undefined){scope.globals=[value]}else if(scope.globals.indexOf(value)==-1){scope.globals.push(value)}}}
  1616. this.to_js=function(arg){
  1617. if(this.result!==undefined && this.scope.ntype=='generator'){return this.result}
  1618. this.js_processed=true
  1619. var val=this.value
  1620. var is_local=$B.bound[this.scope.id][val]!==undefined,this_node=$get_node(this),bound_before=this_node.bound_before
  1621. if(this.scope.nonlocals && this.scope.nonlocals[val]!==undefined){this.nonlocal=true}
  1622. this.unbound=this.unbound ||(is_local && !this.bound &&
  1623. bound_before && bound_before.indexOf(val)==-1)
  1624. if(this.unbound && !this.nonlocal){if(this.scope.ntype=='def' ||this.scope.ntype=='generator'){return '$B.$local_search("'+val+'")'}else{return '$B.$search("'+val+'")'}}
  1625. if(val=='__BRYTHON__' ||val=='$B'){return val}
  1626. var innermost=$get_scope(this),scope=innermost,found=[]
  1627. var gs=innermost
  1628. while(gs.parent_block && gs.parent_block.id!=='__builtins__'){gs=gs.parent_block}
  1629. var global_ns='$locals_'+gs.id.replace(/\./g,'_')
  1630. while(1){if($B.bound[scope.id]===undefined){console.log('name '+val+' undef '+scope.id)}
  1631. if($B._globals[scope.id]!==undefined &&
  1632. $B._globals[scope.id][val]!==undefined){
  1633. if($B.bound[gs.id][val]!==undefined ||this.bound){this.result=global_ns+'["'+val+'"]'
  1634. return this.result}else{this.result='$B.$global_search("'+val+'")'
  1635. return this.result}}
  1636. if(scope===innermost){
  1637. var bound_before=this_node.bound_before
  1638. if(bound_before && !this.bound){if(bound_before.indexOf(val)>-1){found.push(scope)}
  1639. else if(scope.C &&
  1640. scope.C.tree[0].type=='def' &&
  1641. scope.C.tree[0].env.indexOf(val)>-1){found.push(scope)}}else{if($B.bound[scope.id][val]){
  1642. if(!this.bound && this_node.locals[val]===undefined){
  1643. if(!scope.is_comp &&
  1644. (!scope.parent_block ||
  1645. !scope.parent_block.is_comp)){
  1646. found.push(scope)}}else{found.push(scope)}}}}else{
  1647. if($B.bound[scope.id]===undefined){console.log('no bound',scope.id)}
  1648. if($B.bound[scope.id][val]){found.push(scope)}}
  1649. if(scope.parent_block){scope=scope.parent_block}
  1650. else{break}}
  1651. this.found=found
  1652. if(this.nonlocal && found[0]===innermost){found.shift()}
  1653. if(found.length>0){
  1654. if(!this.bound && found[0].C && found[0]===innermost
  1655. && val.charAt(0)!='$'){var locs=$get_node(this).locals ||{},nonlocs=innermost.nonlocals
  1656. if(locs[val]===undefined &&
  1657. ((innermost.type!='def' ||innermost.type!='generator')&&
  1658. innermost.C.tree[0].args.indexOf(val)==-1)&&
  1659. (nonlocs===undefined ||nonlocs[val]===undefined)){this.result='$B.$local_search("'+val+'")'
  1660. return this.result}}
  1661. if(found.length>1 && found[0].C){if(found[0].C.tree[0].type=='class' && !this.bound){var ns0='$locals_'+found[0].id.replace(/\./g,'_'),ns1='$locals_'+found[1].id.replace(/\./g,'_'),res
  1662. if(bound_before){if(bound_before.indexOf(val)>-1){this.found=$B.bound[found[0].id][val]
  1663. res=ns0}else{this.found=$B.bound[found[1].id][val]
  1664. res=ns1}
  1665. this.result=res+'["'+val+'"]'
  1666. return this.result}else{this.found=false
  1667. var res=ns0 + '["'+val+'"]!==undefined ? '
  1668. res +=ns0 + '["'+val+'"] : '
  1669. this.result=res + ns1 + '["'+val+'"]'
  1670. return this.result}}}
  1671. var scope=found[0]
  1672. this.found=$B.bound[scope.id][val]
  1673. var scope_ns='$locals_'+scope.id.replace(/\./g,'_')
  1674. if(scope.C===undefined){
  1675. if(scope.id=='__builtins__'){if(gs.blurred){
  1676. val='('+global_ns+'["'+val+'"] || '+val+')'}else{
  1677. if(val!=='__builtins__'){val='$B.builtins.'+val}
  1678. this.is_builtin=true}}else if(scope.id==scope.module){
  1679. if(this.bound ||this.augm_assign){
  1680. val=scope_ns+'["'+val+'"]'}else{if(scope===innermost && this.env[val]===undefined){var locs=this_node.locals ||{}
  1681. if(locs[val]===undefined){
  1682. if(found.length>1 && found[1].id=='__builtins__'){this.is_builtin=true
  1683. this.result='$B.builtins.'+val+$to_js(this.tree,'')
  1684. return this.result}}
  1685. this.result='$B.$search("'+val+'")'
  1686. return this.result}else{if(scope.level<=2){
  1687. val=scope_ns+'["'+val+'"]'}else{
  1688. val='$B.$check_def("'+val+'",'+scope_ns+'["'+val+'"])'}}}}else{val=scope_ns+'["'+val+'"]'}}else if(scope===innermost){if($B._globals[scope.id]&& $B._globals[scope.id][val]){val=global_ns+'["'+val+'"]'}else if(!this.bound && !this.augm_assign){
  1689. var bind_level
  1690. if(this_node.locals && this_node.locals[val]){bind_level=this_node.locals[val].level}
  1691. if(bind_level!==undefined && bind_level<=this.level){val='$locals["'+val+'"]'}else{val='$B.$check_def_local("'+val+'",$locals["'+val+'"])'}}else{val='$locals["'+val+'"]'}}else if(!this.bound && !this.augm_assign){
  1692. if(scope.ntype=='generator'){
  1693. var up=0,
  1694. sc=innermost
  1695. while(sc!==scope){up++;sc=sc.parent_block}
  1696. var scope_name="$B.frames_stack[$B.frames_stack.length-1-"+up+"][1]"
  1697. val='$B.$check_def_free("'+val+'",'+scope_name+'["'+val+'"])'}else{val='$B.$check_def_free("'+val+'",'+scope_ns+'["'+val+'"])'}}else{val=scope_ns+'["'+val+'"]'}
  1698. this.result=val+$to_js(this.tree,'')
  1699. return this.result}else{
  1700. this.unknown_binding=true
  1701. this.result='$B.$global_search("'+val+'")'
  1702. return this.result}}}
  1703. function $ImaginaryCtx(C,value){
  1704. this.type='imaginary'
  1705. this.value=value
  1706. this.toString=function(){return 'imaginary '+this.value}
  1707. this.parent=C
  1708. this.tree=[]
  1709. C.tree[C.tree.length]=this
  1710. this.to_js=function(){this.js_processed=true
  1711. return 'complex(0,'+this.value+')'}}
  1712. function $ImportCtx(C){
  1713. this.type='import'
  1714. this.parent=C
  1715. this.tree=[]
  1716. C.tree[C.tree.length]=this
  1717. this.expect='id'
  1718. this.toString=function(){return 'import '+this.tree}
  1719. this.bind_names=function(){
  1720. var scope=$get_scope(this)
  1721. for(var i=0;i<this.tree.length;i++){if(this.tree[i].name==this.tree[i].alias){var name=this.tree[i].name,parts=name.split('.'),bound=name
  1722. if(parts.length>1){bound=parts[0]}}else{bound=this.tree[i].alias}
  1723. $B.bound[scope.id][bound]={level: scope.level}}}
  1724. this.to_js=function(){this.js_processed=true
  1725. var scope=$get_scope(this),res=[],pos=0
  1726. for(var i=0;i<this.tree.length;i++){var mod_name=this.tree[i].name,aliases=(this.tree[i].name==this.tree[i].alias)?
  1727. '{}' :('{"' + mod_name + '" : "' +
  1728. this.tree[i].alias + '"}'),localns='$locals_'+scope.id.replace(/\./g,'_');
  1729. res[pos++]='$B.$import("'+mod_name+'", [],'+aliases+',' +
  1730. localns + ', true);'}
  1731. return res.join('')+ 'None;'}}
  1732. function $ImportedModuleCtx(C,name){this.type='imported module'
  1733. this.toString=function(){return ' (imported module) '+this.name}
  1734. this.parent=C
  1735. this.name=name
  1736. this.alias=name
  1737. C.tree[C.tree.length]=this
  1738. this.to_js=function(){this.js_processed=true
  1739. return '"'+this.name+'"'}}
  1740. function $IMPRTCtx(C){
  1741. this.type='import'
  1742. this.parent=C
  1743. this.tree=[]
  1744. C.tree[C.tree.length]=this
  1745. this.expect='id'
  1746. this.toString=function(){return 'import '+this.tree}
  1747. this.bind_names=function(){
  1748. var scope=$get_scope(this)
  1749. for(var i=0;i<this.tree.length;i++){if(this.tree[i].name==this.tree[i].alias){var name=this.tree[i].name,parts=name.split('.'),bound=name
  1750. if(parts.length>1){bound=parts[0]}}else{bound=this.tree[i].alias}
  1751. $B.bound[scope.id][bound]=true}}
  1752. this.transform=function(node,rank){
  1753. for(var i=1;i<this.tree.length;i++){var new_node=new $Node()
  1754. var ctx=new $IMPRTCtx(new $NodeCtx(new_node))
  1755. ctx.tree=[this.tree[i]]
  1756. node.parent.insert(rank+1,new_node)}
  1757. this.tree.splice(1,this.tree.length)
  1758. var name=this.tree[0].name,js='$locals["'+this.tree[0].alias+'"]= $B.imported["'+name+'"]'
  1759. node.add($NodeJS(js))
  1760. for(var i=rank+1;i<node.parent.children.length;i++){node.add(node.parent.children[i])}
  1761. node.parent.children.splice(rank+1,node.parent.children.length)
  1762. node.parent.add($NodeJS(')'))}
  1763. this.to_js=function(){this.js_processed=true
  1764. var res=[],pos=0
  1765. for(var i=0;i<this.tree.length;i++){var mod_name=this.tree[i].name
  1766. res[pos++]='$B.$import_non_blocking("'+mod_name+'", function()'}
  1767. return res.join('')}}
  1768. function $IntCtx(C,value){
  1769. this.type='int'
  1770. this.value=value
  1771. this.parent=C
  1772. this.tree=[]
  1773. C.tree[C.tree.length]=this
  1774. this.toString=function(){return 'int '+this.value}
  1775. this.to_js=function(){this.js_processed=true
  1776. var v=parseInt(value[1],value[0])
  1777. if(v>$B.min_int && v<$B.max_int){return v}
  1778. else{return '$B.LongInt("'+value[1]+'", '+value[0]+')'}}}
  1779. function $JSCode(js){this.js=js
  1780. this.toString=function(){return this.js}
  1781. this.to_js=function(){this.js_processed=true
  1782. return this.js}}
  1783. function $KwArgCtx(C){
  1784. this.type='kwarg'
  1785. this.parent=C.parent
  1786. this.tree=[C.tree[0]]
  1787. C.parent.tree.pop()
  1788. C.parent.tree.push(this)
  1789. var value=this.tree[0].value
  1790. var ctx=C.parent.parent
  1791. if(ctx.kwargs===undefined){ctx.kwargs=[value]}
  1792. else if(ctx.kwargs.indexOf(value)===-1){ctx.kwargs.push(value)}
  1793. else{$_SyntaxError(C,['keyword argument repeated'])}
  1794. this.toString=function(){return 'kwarg '+this.tree[0]+'='+this.tree[1]}
  1795. this.to_js=function(){this.js_processed=true
  1796. var key=this.tree[0].value
  1797. if(key.substr(0,2)=='$$'){key=key.substr(2)}
  1798. var res='{$nat:"kw",name:"'+key+'",'
  1799. return res + 'value:'+$to_js(this.tree.slice(1,this.tree.length))+'}'}}
  1800. function $LambdaCtx(C){
  1801. this.type='lambda'
  1802. this.parent=C
  1803. C.tree[C.tree.length]=this
  1804. this.tree=[]
  1805. this.args_start=$pos+6
  1806. this.vars=[]
  1807. this.locals=[]
  1808. this.toString=function(){return '(lambda) '+this.args_start+' '+this.body_start}
  1809. this.to_js=function(){this.js_processed=true
  1810. var node=$get_node(this),module=$get_module(this),src=$B.$py_src[module.id],args=src.substring(this.args_start,this.body_start),body=src.substring(this.body_start+1,this.body_end)
  1811. body=body.replace(/\\\n/g,' ')
  1812. body=body.replace(/\n/g,' ')
  1813. var scope=$get_scope(this)
  1814. var rand=$B.UUID(),func_name='lambda_'+$B.lambda_magic+'_'+rand,py='def '+func_name+'('+args+'):\n'
  1815. py +=' return '+body
  1816. var lambda_name='lambda'+rand,module_name=module.id.replace(/\./g,'_'),scope_id=scope.id.replace(/\./g,'_')
  1817. var js=$B.py2js(py,module_name,lambda_name,scope_id,node.line_num).to_js()
  1818. js='(function(){\n'+js+'\nreturn $locals.'+func_name+'\n})()'
  1819. $B.clear_ns(lambda_name)
  1820. delete $B.$py_src[lambda_name]
  1821. return js}}
  1822. function $ListOrTupleCtx(C,real){
  1823. this.type='list_or_tuple'
  1824. this.start=$pos
  1825. this.real=real
  1826. this.expect='id'
  1827. this.closed=false
  1828. this.parent=C
  1829. this.tree=[]
  1830. C.tree[C.tree.length]=this
  1831. this.toString=function(){switch(this.real){case 'list':
  1832. return '(list) ['+this.tree+']'
  1833. case 'list_comp':
  1834. case 'gen_expr':
  1835. return '('+this.real+') ['+this.intervals+'-'+this.tree+']'
  1836. default:
  1837. return '(tuple) ('+this.tree+')'}}
  1838. this.is_comp=function(){switch(this.real){case 'list_comp':
  1839. case 'gen_expr':
  1840. case 'dict_or_set_comp':
  1841. return true}
  1842. return false}
  1843. this.get_src=function(){
  1844. var scope=$get_scope(this)
  1845. var ident=scope.id
  1846. while($B.$py_src[ident]===undefined && $B.modules[ident].parent_block){ident=$B.modules[ident].parent_block.id}
  1847. if($B.$py_src[ident]===undefined){
  1848. return $B.$py_src[scope.module]}
  1849. return $B.$py_src[ident]}
  1850. this.ids=function(){
  1851. var _ids={}
  1852. for(var i=0;i<this.tree.length;i++){var item=this.tree[i]
  1853. if(item.type=='id'){_ids[item.value]=true}
  1854. else if(item.type=='expr' && item.tree[0].type=="id"){_ids[item.tree[0].value]=true}else if(item.type=='list_or_tuple' ||
  1855. (item.type=="expr" && item.tree[0].type=='list_or_tuple')){if(item.type=="expr"){item=item.tree[0]}
  1856. for(var attr in item.ids()){_ids[attr]=true}}}
  1857. return _ids}
  1858. this.to_js=function(){this.js_processed=true
  1859. var scope=$get_scope(this),sc=scope,scope_id=scope.id.replace(/\//g, '_'),
  1860. env = [],
  1861. pos=0
  1862. while(sc && sc.id!=='__builtins__'){
  1863. if(sc===scope){
  1864. env[pos++]='["'+sc.id+'",$locals]'
  1865. }else{
  1866. env[pos++]='["'+sc.id+'",$locals_'+sc.id.replace(/\./g,'_')+']'}
  1867. sc=sc.parent_block}
  1868. var module_name=$get_module(this).module
  1869. switch(this.real){case 'list':
  1870. return '$B.$list(['+$to_js(this.tree)+'])'
  1871. case 'list_comp':
  1872. case 'gen_expr':
  1873. case 'dict_or_set_comp':
  1874. var src=this.get_src()
  1875. var res1=[],items=[]
  1876. var qesc=new RegExp('"',"g")
  1877. for(var i=1;i<this.intervals.length;i++){var txt=src.substring(this.intervals[i-1],this.intervals[i])
  1878. items.push(txt)
  1879. var lines=txt.split('\n')
  1880. var res2=[],pos=0
  1881. for(var j=0;j<lines.length;j++){var txt=lines[j]
  1882. if(txt.replace(/ /g,'').length==0){continue}
  1883. txt=txt.replace(/\n/g,' ')
  1884. txt=txt.replace(/\\/g,'\\\\')
  1885. txt=txt.replace(qesc,'\\"')
  1886. res2[pos++]='"'+txt+'"'}
  1887. res1.push('['+res2.join(',')+']')}
  1888. var line_num=$get_node(this).line_num
  1889. switch(this.real){case 'list_comp':
  1890. var local_name=scope.id.replace(/\./g,'_')
  1891. var lc=$B.$list_comp(items),
  1892. py=lc[0],ix=lc[1],listcomp_name='lc'+ix,local_name=scope.id.replace(/\./g,'_')
  1893. var save_pos=$pos
  1894. var root=$B.py2js({src:py,is_comp:true},module_name,listcomp_name,local_name,line_num)
  1895. $pos=save_pos
  1896. var js=root.to_js()
  1897. root=null
  1898. $B.clear_ns(listcomp_name)
  1899. delete $B.$py_src[listcomp_name]
  1900. js +='return $locals_lc'+ix+'["x'+ix+'"]'
  1901. js='(function(){'+js+'})()'
  1902. return js
  1903. case 'dict_or_set_comp':
  1904. if(this.expression.length===1){return $B.$gen_expr(module_name,scope_id,items,line_num)}
  1905. return $B.$dict_comp(module_name,scope_id,items,line_num)}
  1906. return $B.$gen_expr(module_name,scope_id,items,line_num)
  1907. case 'tuple':
  1908. if(this.tree.length===1 && this.has_comma===undefined){return this.tree[0].to_js()}
  1909. return 'tuple(['+$to_js(this.tree)+'])'}}}
  1910. function $NodeCtx(node){
  1911. this.node=node
  1912. node.C=this
  1913. this.tree=[]
  1914. this.type='node'
  1915. var scope=null
  1916. var tree_node=node
  1917. while(tree_node.parent && tree_node.parent.type!=='module'){var ntype=tree_node.parent.C.tree[0].type
  1918. var _break_flag=false
  1919. switch(ntype){case 'def':
  1920. case 'class':
  1921. case 'generator':
  1922. scope=tree_node.parent
  1923. _break_flag=true}
  1924. if(_break_flag)break
  1925. tree_node=tree_node.parent}
  1926. if(scope==null){scope=tree_node.parent ||tree_node }
  1927. this.node.locals=clone($B.bound[scope.id])
  1928. this.toString=function(){return 'node '+this.tree}
  1929. this.to_js=function(){if(this.js!==undefined){return this.js}
  1930. this.js_processed=true
  1931. if(this.tree.length>1){var new_node=new $Node()
  1932. var ctx=new $NodeCtx(new_node)
  1933. ctx.tree=[this.tree[1]]
  1934. new_node.indent=node.indent+4
  1935. this.tree.pop()
  1936. node.add(new_node)}
  1937. if(node.children.length==0){this.js=$to_js(this.tree)+';'}else{this.js=$to_js(this.tree)}
  1938. return this.js}}
  1939. function $NodeJS(js){var node=new $Node()
  1940. new $NodeJSCtx(node,js)
  1941. return node}
  1942. function $NodeJSCtx(node,js){
  1943. this.node=node
  1944. node.C=this
  1945. this.type='node_js'
  1946. this.tree=[js]
  1947. this.toString=function(){return 'js '+js}
  1948. this.to_js=function(){this.js_processed=true
  1949. return js}}
  1950. function $NonlocalCtx(C){
  1951. this.type='global'
  1952. this.parent=C
  1953. this.tree=[]
  1954. this.names={}
  1955. C.tree[C.tree.length]=this
  1956. this.expect='id'
  1957. this.scope=$get_scope(this)
  1958. this.scope.nonlocals=this.scope.nonlocals ||{}
  1959. if(this.scope.C===undefined){$_SyntaxError(C,["nonlocal declaration not allowed at module level"])}
  1960. this.toString=function(){return 'global '+this.tree}
  1961. this.add=function(name){if($B.bound[this.scope.id][name]=='arg'){$_SyntaxError(C,["name '"+name+"' is parameter and nonlocal"])}
  1962. this.names[name]=[false,$pos]
  1963. this.scope.nonlocals[name]=true}
  1964. this.transform=function(node,rank){var pscope=this.scope.parent_block
  1965. if(pscope.C===undefined){$_SyntaxError(C,["no binding for nonlocal '"+
  1966. $B.last(Object.keys(this.names))+"' found"])}else{while(pscope!==undefined && pscope.C!==undefined){for(var name in this.names){if($B.bound[pscope.id][name]!==undefined){this.names[name]=[true]}}
  1967. pscope=pscope.parent_block}
  1968. for(var name in this.names){if(!this.names[name][0]){console.log('nonlocal error, C '+C)
  1969. $pos=this.names[name][1]
  1970. $_SyntaxError(C,["no binding for nonlocal '"+name+"' found"])}}}}
  1971. this.to_js=function(){this.js_processed=true
  1972. return ''}}
  1973. function $NotCtx(C){
  1974. this.type='not'
  1975. this.parent=C
  1976. this.tree=[]
  1977. C.tree[C.tree.length]=this
  1978. this.toString=function(){return 'not ('+this.tree+')'}
  1979. this.to_js=function(){this.js_processed=true
  1980. return '!bool('+$to_js(this.tree)+')'}}
  1981. function $OpCtx(C,op){
  1982. this.type='op'
  1983. this.op=op
  1984. this.parent=C.parent
  1985. this.tree=[C]
  1986. this.scope=$get_scope(this)
  1987. if(C.type=="expr"){if(['int','float','str'].indexOf(C.tree[0].type)>-1){this.left_type=C.tree[0].type}else if(C.tree[0].type=="id"){var binding=$B.bound[this.scope.id][C.tree[0].value]
  1988. if(binding){this.left_type=binding.type}}}
  1989. C.parent.tree.pop()
  1990. C.parent.tree.push(this)
  1991. this.toString=function(){return '(op '+this.op+') ['+this.tree+']'}
  1992. this.to_js=function(){this.js_processed=true
  1993. var comps={'==':'eq','!=':'ne','>=':'ge','<=':'le','<':'lt','>':'gt'}
  1994. if(comps[this.op]!==undefined){var method=comps[this.op]
  1995. if(this.tree[0].type=='expr' && this.tree[1].type=='expr'){var t0=this.tree[0].tree[0],t1=this.tree[1].tree[0]
  1996. switch(t1.type){case 'int':
  1997. switch(t0.type){case 'int':
  1998. if(t0.value>$B.min_int && t0.value<$B.max_int &&
  1999. t1.value>$B.min_int && t1.value<$B.max_int){return t0.to_js()+this.op+t1.to_js()}else{return 'getattr('+this.tree[0].to_js()+',"__'+
  2000. method+'__")('+this.tree[1].to_js()+')'}
  2001. case 'str':
  2002. return '$B.$TypeError("unorderable types: int() < str()")'
  2003. case 'id':
  2004. var res='typeof '+t0.to_js()+'=="number" ? '
  2005. res +=t0.to_js()+this.op+t1.to_js()+' : '
  2006. res +='getattr('+this.tree[0].to_js()
  2007. res +=',"__'+method+'__")('+this.tree[1].to_js()+')'
  2008. return res}
  2009. break;
  2010. case 'str':
  2011. switch(t0.type){case 'str':
  2012. return t0.to_js()+this.op+t1.to_js()
  2013. case 'int':
  2014. return '$B.$TypeError("unorderable types: str() < int()")'
  2015. case 'id':
  2016. var res='typeof '+t0.to_js()+'=="string" ? '
  2017. res +=t0.to_js()+this.op+t1.to_js()+' : '
  2018. res +='getattr('+this.tree[0].to_js()
  2019. res +=',"__'+method+'__")('+this.tree[1].to_js()+')'
  2020. return res}
  2021. break;
  2022. case 'id':
  2023. if(t0.type=='id'){var res='typeof '+t0.to_js()+'!="object" && '
  2024. res +='typeof '+t0.to_js()+'==typeof '+t1.to_js()
  2025. res +=' ? '+t0.to_js()+this.op+t1.to_js()+' : '
  2026. res +='getattr('+this.tree[0].to_js()
  2027. res +=',"__'+method+'__")('+this.tree[1].to_js()+')'
  2028. return res}
  2029. break;}}}
  2030. switch(this.op){case 'and':
  2031. var op0=this.tree[0].to_js(),op1=this.tree[1].to_js()
  2032. if(this.wrap!==undefined){
  2033. return '(function(){var '+this.wrap.name+'='+this.wrap.js+
  2034. ';return $B.$test_expr($B.$test_item('+
  2035. op0+') && $B.$test_item('+op1+'))})()'}else{return '$B.$test_expr($B.$test_item('+op0+')&&'+
  2036. '$B.$test_item('+op1+'))'}
  2037. case 'or':
  2038. var res='$B.$test_expr($B.$test_item('+this.tree[0].to_js()+')||'
  2039. return res + '$B.$test_item('+this.tree[1].to_js()+'))'
  2040. case 'in':
  2041. return '$B.$is_member('+$to_js(this.tree)+')'
  2042. case 'not_in':
  2043. return '!$B.$is_member('+$to_js(this.tree)+')'
  2044. case 'unary_neg':
  2045. case 'unary_pos':
  2046. case 'unary_inv':
  2047. var op,method
  2048. if(this.op=='unary_neg'){op='-';method='__neg__'}
  2049. else if(this.op=='unary_pos'){op='+';method='__pos__'}
  2050. else{op='~';method='__invert__'}
  2051. if(this.tree[1].type=="expr"){var x=this.tree[1].tree[0]
  2052. switch(x.type){case 'int':
  2053. var v=parseInt(x.value[1],x.value[0])
  2054. if(v>$B.min_int && v<$B.max_int){return op+v}
  2055. return 'getattr('+x.to_js()+', "'+method+'")()'
  2056. case 'float':
  2057. return 'float('+op+x.value+')'
  2058. case 'imaginary':
  2059. return 'complex(0,'+op+x.value+')'}}
  2060. return 'getattr('+this.tree[1].to_js()+',"'+method+'")()'
  2061. case 'is':
  2062. return this.tree[0].to_js()+ '===' + this.tree[1].to_js()
  2063. case 'is_not':
  2064. return this.tree[0].to_js()+ '!==' + this.tree[1].to_js()
  2065. case '*':
  2066. case '+':
  2067. case '-':
  2068. var op=this.op,vars=[],has_float_lit=false,scope=$get_scope(this)
  2069. function is_simple(elt){if(elt.type=='expr' && elt.tree[0].type=='int'){return true}
  2070. else if(elt.type=='expr' && elt.tree[0].type=='float'){has_float_lit=true
  2071. return true}else if(elt.type=='expr' && elt.tree[0].type=='list_or_tuple'
  2072. && elt.tree[0].real=='tuple'
  2073. && elt.tree[0].tree.length==1
  2074. && elt.tree[0].tree[0].type=='expr'){return is_simple(elt.tree[0].tree[0].tree[0])}else if(elt.type=='expr' && elt.tree[0].type=='id'){var _var=elt.tree[0].to_js()
  2075. if(vars.indexOf(_var)==-1){vars.push(_var)}
  2076. return true}else if(elt.type=='op' &&['*','+','-'].indexOf(elt.op)>-1){for(var i=0;i<elt.tree.length;i++){if(!is_simple(elt.tree[i])){return false}}
  2077. return true}
  2078. return false}
  2079. function get_type(ns,v){var t
  2080. if(['int','float','str'].indexOf(v.type)>-1){t=v.type}else if(v.type=='id' && ns[v.value]){t=ns[v.value].type}
  2081. return t}
  2082. var e0=this.tree[0],e1=this.tree[1]
  2083. if(is_simple(this)){var v0=this.tree[0].tree[0]
  2084. var v1=this.tree[1].tree[0]
  2085. if(vars.length==0 && !has_float_lit){
  2086. return this.simple_js()}else if(vars.length==0){
  2087. return 'new Number('+this.simple_js()+')'}else{
  2088. var ns=$B.bound[scope.id],t0=get_type(ns,v0),t1=get_type(ns,v1)
  2089. if((t0=='float' && t1=='float')||
  2090. (this.op=='+' && t0=='str' && t1=='str')){this.result_type=t0
  2091. return v0.to_js()+this.op+v1.to_js()}else if(['int','float'].indexOf(t0)>-1 &&
  2092. ['int','float'].indexOf(t1)>-1){if(t0=='int' && t1=='int'){this.result_type='int'}
  2093. else{this.result_type='float'}
  2094. switch(this.op){case '+':
  2095. return '$B.add('+v0.to_js()+','+v1.to_js()+')'
  2096. case '-':
  2097. return '$B.sub('+v0.to_js()+','+v1.to_js()+')'
  2098. case '*':
  2099. return '$B.mul('+v0.to_js()+','+v1.to_js()+')'}}
  2100. var tests=[],tests1=[],pos=0
  2101. for(var i=0;i<vars.length;i++){
  2102. tests[pos]='typeof '+vars[i]+'.valueOf() == "number"'
  2103. tests1[pos++]='typeof '+vars[i]+' == "number"'}
  2104. var res=[tests.join(' && ')+' ? '],pos=1
  2105. res[pos++]='('+tests1.join(' && ')+' ? '
  2106. res[pos++]=this.simple_js()
  2107. res[pos++]=' : new Number('+this.simple_js()+')'
  2108. res[pos++]=')'
  2109. if(this.op=='+'){res[pos++]=' : (typeof '+this.tree[0].to_js()+'=="string"'
  2110. res[pos++]=' && typeof '+this.tree[1].to_js()
  2111. res[pos++]='=="string") ? '+this.tree[0].to_js()
  2112. res[pos++]='+'+this.tree[1].to_js()}
  2113. res[pos++]=': getattr('+this.tree[0].to_js()+',"__'
  2114. res[pos++]=$operators[this.op]+'__")'+'('+this.tree[1].to_js()+')'
  2115. return '('+res.join('')+')'}}
  2116. var res='getattr('+e0.to_js()+',"__'
  2117. return res + $operators[this.op]+'__")'+'('+e1.to_js()+')'
  2118. default:
  2119. var res='getattr('+this.tree[0].to_js()+',"__'
  2120. return res + $operators[this.op]+'__")'+'('+this.tree[1].to_js()+')'}}
  2121. this.simple_js=function(){function sjs(elt){if(elt.type=='op'){return elt.simple_js()}
  2122. else if(elt.type=='expr' && elt.tree[0].type=='list_or_tuple'
  2123. && elt.tree[0].real=='tuple'
  2124. && elt.tree[0].tree.length==1
  2125. && elt.tree[0].tree[0].type=='expr'){return '('+elt.tree[0].tree[0].tree[0].simple_js()+')'}else{return elt.tree[0].to_js()}}
  2126. if(op=='+'){return '$B.add('+sjs(this.tree[0])+','+sjs(this.tree[1])+')'}
  2127. else if(op=='-'){return '$B.sub('+sjs(this.tree[0])+','+sjs(this.tree[1])+')'}
  2128. else if(op=='*'){return '$B.mul('+sjs(this.tree[0])+','+sjs(this.tree[1])+')'}
  2129. else if(op=='/'){return '$B.div('+sjs(this.tree[0])+','+sjs(this.tree[1])+')'}
  2130. else{return sjs(this.tree[0])+op+sjs(this.tree[1])}}}
  2131. function $PackedCtx(C){
  2132. this.type='packed'
  2133. if(C.parent.type=='list_or_tuple'){for(var i=0;i<C.parent.tree.length;i++){var child=C.parent.tree[i]
  2134. if(child.type=='expr' && child.tree.length>0
  2135. && child.tree[0].type=='packed'){$_SyntaxError(C,["two starred expressions in assignment"])}}}
  2136. this.parent=C
  2137. this.tree=[]
  2138. C.tree[C.tree.length]=this
  2139. this.toString=function(){return '(packed) '+this.tree}
  2140. this.to_js=function(){this.js_processed=true
  2141. return $to_js(this.tree)}}
  2142. function $PassCtx(C){
  2143. this.type='pass'
  2144. this.parent=C
  2145. this.tree=[]
  2146. C.tree[C.tree.length]=this
  2147. this.toString=function(){return '(pass)'}
  2148. this.to_js=function(){this.js_processed=true
  2149. return 'void(0)'}}
  2150. function $RaiseCtx(C){
  2151. this.type='raise'
  2152. this.parent=C
  2153. this.tree=[]
  2154. C.tree[C.tree.length]=this
  2155. this.toString=function(){return ' (raise) '+this.tree}
  2156. this.to_js=function(){this.js_processed=true
  2157. var res=''
  2158. if(this.tree.length===0){return '$B.$raise()'}
  2159. var exc=this.tree[0],exc_js=exc.to_js()
  2160. return '$B.$raise('+exc_js+')'}}
  2161. function $RawJSCtx(C,js){this.type="raw_js"
  2162. C.tree[C.tree.length]=this
  2163. this.parent=C
  2164. this.toString=function(){return '(js) '+js}
  2165. this.to_js=function(){this.js_processed=true
  2166. return js}}
  2167. function $ReturnCtx(C){
  2168. this.type='return'
  2169. this.parent=C
  2170. this.tree=[]
  2171. C.tree[C.tree.length]=this
  2172. var node=$get_node(this)
  2173. while(node.parent){if(node.parent.C){var elt=node.parent.C.tree[0]
  2174. if(elt.type=='for'){elt.has_return=true
  2175. break}else if(elt.type=='try'){elt.has_return=true}else if(elt.type=='single_kw' && elt.token=='finally'){elt.has_return=true}}
  2176. node=node.parent}
  2177. this.toString=function(){return 'return '+this.tree}
  2178. this.to_js=function(){this.js_processed=true
  2179. if(this.tree.length==1 && this.tree[0].type=='abstract_expr'){
  2180. this.tree.pop()
  2181. new $IdCtx(new $ExprCtx(this,'rvalue',false),'None')}
  2182. var scope=$get_scope(this)
  2183. if(scope.ntype=='generator'){return 'return [$B.generator_return(' + $to_js(this.tree)+')]'}
  2184. return 'var $res = '+$to_js(this.tree)+';'+
  2185. '$B.leave_frame($local_name);return $res'}}
  2186. function $SingleKwCtx(C,token){
  2187. this.type='single_kw'
  2188. this.token=token
  2189. this.parent=C
  2190. this.tree=[]
  2191. C.tree[C.tree.length]=this
  2192. if(token=="else"){var node=C.node
  2193. var pnode=node.parent
  2194. for(var rank=0;rank<pnode.children.length;rank++){if(pnode.children[rank]===node)break}
  2195. var pctx=pnode.children[rank-1].C
  2196. if(pctx.tree.length>0){var elt=pctx.tree[0]
  2197. if(elt.type=='for' ||
  2198. elt.type=='asyncfor' ||
  2199. (elt.type=='condition' && elt.token=='while')){elt.has_break=true
  2200. elt.else_node=$get_node(this)
  2201. this.loop_num=elt.loop_num}}}
  2202. this.toString=function(){return this.token}
  2203. this.transform=function(node,rank){
  2204. if(this.token=='finally'){var scope=$get_scope(this)
  2205. if(scope.ntype!='generator'){var scope_id=scope.id.replace(/\./g,'_'),js='var $exit;if($B.frames_stack.length<$stack_length)'+
  2206. '{$exit=true;$B.frames_stack.push($top_frame)}'
  2207. node.insert(0,$NodeJS(js))
  2208. node.add($NodeJS('if($exit){$B.leave_frame("'+scope_id+'")}'))}}}
  2209. this.to_js=function(){this.js_processed=true
  2210. if(this.token=='finally')return this.token
  2211. if(this.loop_num!==undefined){var scope=$get_scope(this)
  2212. var res='if($locals_'+scope.id.replace(/\./g,'_')
  2213. return res +'["$no_break'+this.loop_num+'"])'}
  2214. return this.token}}
  2215. function $StarArgCtx(C){
  2216. this.type='star_arg'
  2217. this.parent=C
  2218. this.tree=[]
  2219. C.tree[C.tree.length]=this
  2220. this.toString=function(){return '(star arg) '+this.tree}
  2221. this.to_js=function(){this.js_processed=true
  2222. return '{$nat:"ptuple",arg:'+$to_js(this.tree)+'}'}}
  2223. function $StringCtx(C,value){
  2224. this.type='str'
  2225. this.parent=C
  2226. this.tree=[value]
  2227. this.raw=false
  2228. C.tree[C.tree.length]=this
  2229. this.toString=function(){return 'string '+(this.tree||'')}
  2230. this.to_js=function(){this.js_processed=true
  2231. var res='',type=null
  2232. for(var i=0;i<this.tree.length;i++){if(this.tree[i].type=="call"){
  2233. var js='(function(){throw TypeError("'+"'str'"+
  2234. ' object is not callable")}())'
  2235. return js}else{var value=this.tree[i],is_bytes=value.charAt(0)=='b'
  2236. if(type==null){type=is_bytes
  2237. if(is_bytes){res+='bytes('}}else if(type!=is_bytes){return '$B.$TypeError("can\'t concat bytes to str")'}
  2238. if(!is_bytes){res +=value.replace(/\n/g,'\\n\\\n')}else{res +=value.substr(1).replace(/\n/g,'\\n\\\n')}
  2239. if(i<this.tree.length-1){res+='+'}}}
  2240. if(is_bytes){res +=',"ISO-8859-1")'}
  2241. return res}}
  2242. function $SubCtx(C){
  2243. this.type='sub'
  2244. this.func='getitem'
  2245. this.value=C.tree[0]
  2246. C.tree.pop()
  2247. C.tree[C.tree.length]=this
  2248. this.parent=C
  2249. this.tree=[]
  2250. this.toString=function(){return '(sub) (value) '+this.value+' (tree) '+this.tree}
  2251. this.to_js=function(){this.js_processed=true
  2252. if(this.func=='getitem' && this.value.type=='id'){var type=$get_node(this).locals[this.value.value],val=this.value.to_js()
  2253. if(type=='list'||type=='tuple'){if(this.tree.length==1){return '$B.list_key('+val+
  2254. ', '+this.tree[0].to_js()+')'}else if(this.tree.length==2){return '$B.list_slice('+val+
  2255. ', '+(this.tree[0].to_js()||"null")+','+
  2256. (this.tree[1].to_js()||"null")+')'}else if(this.tree.length==3){return '$B.list_slice_step('+val+
  2257. ', '+(this.tree[0].to_js()||"null")+','+
  2258. (this.tree[1].to_js()||"null")+','+
  2259. (this.tree[2].to_js()||"null")+')'}}}
  2260. if(this.func=='getitem' && this.tree.length==1){return '$B.$getitem('+this.value.to_js()+',' + this.tree[0].to_js()+')'}
  2261. var res='',shortcut=false
  2262. if(this.func!=='delitem' && Array.isArray &&
  2263. this.tree.length==1 && !this.in_sub){var expr='',x=this
  2264. shortcut=true
  2265. while(x.value.type=='sub'){expr +='['+x.tree[0].to_js()+']'
  2266. x.value.in_sub=true
  2267. x=x.value}
  2268. var subs=x.value.to_js()+'['+x.tree[0].to_js()+']'
  2269. res +='((Array.isArray('+x.value.to_js()+') || '
  2270. res +='typeof '+x.value.to_js()+'=="string")'
  2271. res +=' && '+subs+'!==undefined ?'
  2272. res +=subs+expr+ ' : '}
  2273. var val=this.value.to_js()
  2274. res +='getattr('+val+',"__'+this.func+'__")('
  2275. if(this.tree.length===1){res +=this.tree[0].to_js()+')'}else{var res1=[],pos=0
  2276. for(var i=0;i<this.tree.length;i++){if(this.tree[i].type==='abstract_expr'){res1[pos++]='None'}
  2277. else{res1[pos++]=this.tree[i].to_js()}}
  2278. res +='slice(' + res1.join(',')+ '))'}
  2279. return shortcut ? res+')' : res}}
  2280. function $TargetListCtx(C){
  2281. this.type='target_list'
  2282. this.parent=C
  2283. this.tree=[]
  2284. this.expect='id'
  2285. C.tree[C.tree.length]=this
  2286. this.toString=function(){return '(target list) '+this.tree}
  2287. this.to_js=function(){this.js_processed=true
  2288. return $to_js(this.tree)}}
  2289. function $TernaryCtx(C){
  2290. this.type='ternary'
  2291. this.parent=C.parent
  2292. C.parent.tree.pop()
  2293. C.parent.tree.push(this)
  2294. C.parent=this
  2295. this.tree=[C]
  2296. this.toString=function(){return '(ternary) '+this.tree}
  2297. this.to_js=function(){this.js_processed=true
  2298. var res='bool('+this.tree[1].to_js()+') ? '
  2299. res +=this.tree[0].to_js()+' : '
  2300. return res + this.tree[2].to_js()}}
  2301. function $TryCtx(C){
  2302. this.type='try'
  2303. this.parent=C
  2304. C.tree[C.tree.length]=this
  2305. this.toString=function(){return '(try) '}
  2306. this.transform=function(node,rank){if(node.parent.children.length===rank+1){$_SyntaxError(C,"missing clause after 'try' 1")}else{var next_ctx=node.parent.children[rank+1].C.tree[0]
  2307. switch(next_ctx.type){case 'except':
  2308. case 'finally':
  2309. case 'single_kw':
  2310. break
  2311. default:
  2312. $_SyntaxError(C,"missing clause after 'try' 2")}}
  2313. var scope=$get_scope(this)
  2314. var $var='var $failed'+$loop_num
  2315. var js=$var+'=false;\n'+' '.repeat(node.indent+8)+
  2316. 'try'
  2317. new $NodeJSCtx(node,js)
  2318. node.is_try=true
  2319. node.has_return=this.has_return
  2320. var catch_node=new $Node()
  2321. new $NodeJSCtx(catch_node,'catch($err'+$loop_num+')')
  2322. catch_node.is_catch=true
  2323. node.parent.insert(rank+1,catch_node)
  2324. var new_node=new $Node()
  2325. new $NodeJSCtx(new_node,$var+'=true;$B.pmframe=$B.last($B.frames_stack);if(0){}')
  2326. catch_node.insert(0,new_node)
  2327. var pos=rank+2
  2328. var has_default=false
  2329. var has_else=false
  2330. var has_finally=false
  2331. while(1){if(pos===node.parent.children.length){break}
  2332. var ctx=node.parent.children[pos].C.tree[0]
  2333. if(ctx.type==='except'){
  2334. if(has_else){$_SyntaxError(C,"'except' or 'finally' after 'else'")}
  2335. if(has_finally){$_SyntaxError(C,"'except' after 'finally'")}
  2336. ctx.error_name='$err'+$loop_num
  2337. if(ctx.tree.length>0 && ctx.tree[0].alias!==null
  2338. && ctx.tree[0].alias!==undefined){
  2339. var new_node=new $Node()
  2340. var alias=ctx.tree[0].alias
  2341. var js='$locals["'+alias+'"]'
  2342. js +='=$B.exception($err'+$loop_num+')'
  2343. new $NodeJSCtx(new_node,js)
  2344. node.parent.children[pos].insert(0,new_node)}
  2345. catch_node.insert(catch_node.children.length,node.parent.children[pos])
  2346. if(ctx.tree.length===0){if(has_default){$_SyntaxError(C,'more than one except: line')}
  2347. has_default=true}
  2348. node.parent.children.splice(pos,1)}else if(ctx.type==='single_kw' && ctx.token==='finally'){has_finally=true
  2349. var finally_node=node.parent.children[pos]
  2350. pos++}else if(ctx.type==='single_kw' && ctx.token==='else'){if(has_else){$_SyntaxError(C,"more than one 'else'")}
  2351. if(has_finally){$_SyntaxError(C,"'else' after 'finally'")}
  2352. has_else=true
  2353. var else_body=node.parent.children[pos]
  2354. node.parent.children.splice(pos,1)}else{break}}
  2355. if(!has_default){
  2356. var new_node=new $Node(),ctx=new $NodeCtx(new_node)
  2357. catch_node.insert(catch_node.children.length,new_node)
  2358. new $SingleKwCtx(ctx,'else')
  2359. new_node.add($NodeJS('throw $err'+$loop_num))}
  2360. if(has_else){var else_node=new $Node()
  2361. else_node.module=scope.module
  2362. new $NodeJSCtx(else_node,'if(!$failed'+$loop_num+')')
  2363. for(var i=0;i<else_body.children.length;i++){else_node.add(else_body.children[i])}
  2364. if(has_finally){finally_node.insert(0,else_node)}else{node.parent.insert(pos,else_node)}
  2365. pos++}
  2366. $loop_num++}
  2367. this.to_js=function(){this.js_processed=true
  2368. return 'try'}}
  2369. function $UnaryCtx(C,op){
  2370. this.type='unary'
  2371. this.op=op
  2372. this.parent=C
  2373. C.tree[C.tree.length]=this
  2374. this.toString=function(){return '(unary) '+this.op}
  2375. this.to_js=function(){this.js_processed=true
  2376. return this.op}}
  2377. function $WithCtx(C){
  2378. this.type='with'
  2379. this.parent=C
  2380. C.tree[C.tree.length]=this
  2381. this.tree=[]
  2382. this.expect='as'
  2383. this.scope=$get_scope(this)
  2384. this.toString=function(){return '(with) '+this.tree}
  2385. this.set_alias=function(arg){console.log('set with alias',arg)
  2386. this.tree[this.tree.length-1].alias=arg
  2387. $B.bound[this.scope.id][arg]={level: this.scope.level}
  2388. if(this.scope.ntype !=='module'){
  2389. this.scope.C.tree[0].locals.push(arg)}}
  2390. this.transform=function(node,rank){while(this.tree.length>1){
  2391. var suite=node.children,item=this.tree.pop(),new_node=new $Node(),ctx=new $NodeCtx(new_node),with_ctx=new $WithCtx(ctx)
  2392. item.parent=with_ctx
  2393. with_ctx.tree=[item]
  2394. for(var i=0;i<suite.length;i++){new_node.add(suite[i])}
  2395. node.children=[new_node]}
  2396. node.is_try=true
  2397. if(this.transformed)return
  2398. if(this.tree.length>1){var nw=new $Node()
  2399. var ctx=new $NodeCtx(nw)
  2400. nw.parent=node
  2401. nw.module=node.module
  2402. nw.indent=node.indent+4
  2403. var wc=new $WithCtx(ctx)
  2404. wc.tree=this.tree.slice(1)
  2405. for(var i=0;i<node.children.length;i++){nw.add(node.children[i])}
  2406. node.children=[nw]
  2407. this.transformed=true
  2408. return}
  2409. var num=this.num=$loop_num
  2410. if(this.tree[0].alias===null){this.tree[0].alias='$temp'}
  2411. if(this.tree[0].type=='expr' &&
  2412. this.tree[0].tree[0].type=='list_or_tuple'){if(this.tree[1].type!='expr' ||
  2413. this.tree[1].tree[0].type!='list_or_tuple'){$_SyntaxError(C)}
  2414. if(this.tree[0].tree[0].tree.length!=this.tree[1].tree[0].tree.length){$_SyntaxError(C,['wrong number of alias'])}
  2415. var ids=this.tree[0].tree[0].tree
  2416. var alias=this.tree[1].tree[0].tree
  2417. this.tree.shift()
  2418. this.tree.shift()
  2419. for(var i=ids.length-1;i>=0;i--){ids[i].alias=alias[i].value
  2420. this.tree.splice(0,0,ids[i])}}
  2421. var block=node.children
  2422. node.children=[]
  2423. var try_node=new $Node()
  2424. try_node.is_try=true
  2425. new $NodeJSCtx(try_node,'try')
  2426. node.add(try_node)
  2427. if(this.tree[0].alias){var alias=this.tree[0].alias.tree[0].tree[0].value
  2428. var js='$locals'+'["'+alias+'"] = $value'+num
  2429. var value_node=new $Node()
  2430. new $NodeJSCtx(value_node,js)
  2431. try_node.add(value_node)}
  2432. for(var i=0;i<block.length;i++){try_node.add(block[i])}
  2433. var catch_node=new $Node()
  2434. catch_node.is_catch=true
  2435. new $NodeJSCtx(catch_node,'catch($err'+$loop_num+')')
  2436. var fbody=new $Node(),indent=node.indent+4
  2437. var js='$exc'+num+' = false;$err'+$loop_num+'=$B.exception($err'+
  2438. $loop_num+')\n'+' '.repeat(indent)+
  2439. 'if(!bool($ctx_manager_exit'+num+'($err'+$loop_num+
  2440. '.__class__.$factory,'+'$err'+$loop_num+
  2441. ',getattr($err'+$loop_num+',"traceback"))))'
  2442. js +='{throw $err'+$loop_num+'}'
  2443. new $NodeJSCtx(fbody,js)
  2444. catch_node.add(fbody)
  2445. node.add(catch_node)
  2446. var finally_node=new $Node()
  2447. new $NodeJSCtx(finally_node,'finally')
  2448. finally_node.C.type='single_kw'
  2449. finally_node.C.token='finally'
  2450. finally_node.C.in_ctx_manager=true
  2451. finally_node.is_except=true
  2452. finally_node.in_ctx_manager=true
  2453. var fbody=new $Node()
  2454. new $NodeJSCtx(fbody,'if($exc'+num+'){$ctx_manager_exit'+num+
  2455. '(None,None,None)}')
  2456. finally_node.add(fbody)
  2457. node.parent.insert(rank+1,finally_node)
  2458. $loop_num++
  2459. this.transformed=true}
  2460. this.to_js=function(){this.js_processed=true
  2461. var indent=$get_node(this).indent,h=' '.repeat(indent+4),num=this.num
  2462. var res='var $ctx_manager'+num+' = '+this.tree[0].to_js()+
  2463. '\n'+h+'var $ctx_manager_exit'+num+
  2464. '= getattr($ctx_manager'+num+',"__exit__")\n'+
  2465. h+'var $value'+num+' = getattr($ctx_manager'+num+
  2466. ',"__enter__")()\n'
  2467. res +=h+'var $exc'+num+' = true\n'
  2468. return res + h+'try'}}
  2469. function $YieldCtx(C){
  2470. this.type='yield'
  2471. this.toString=function(){return '(yield) '+this.tree}
  2472. this.parent=C
  2473. this.tree=[]
  2474. C.tree[C.tree.length]=this
  2475. switch(C.type){case 'node':
  2476. break;
  2477. case 'assign':
  2478. case 'tuple':
  2479. case 'list_or_tuple':
  2480. var ctx=C
  2481. while(ctx.parent)ctx=ctx.parent
  2482. ctx.node.yield_atoms.push(this)
  2483. break;
  2484. default:
  2485. $_SyntaxError(C,'yield atom must be inside ()')}
  2486. var scope=this.scope=$get_scope(this)
  2487. if(!scope.is_function){$_SyntaxError(C,["'yield' outside function"])}else if(scope.has_return_with_arguments){$_SyntaxError(C,["'return' with argument inside generator"])}
  2488. var def=scope.C.tree[0]
  2489. def.type='generator'
  2490. def.yields.push(this)
  2491. this.toString=function(){return '(yield) '+(this.from ? '(from) ' : '')+this.tree}
  2492. this.transform=function(node,rank){if(this.from===true){
  2493. var new_node=new $Node()
  2494. new_node.locals=node.locals
  2495. node.parent.children.splice(rank,1)
  2496. node.parent.insert(rank,new_node)
  2497. var for_ctx=new $ForExpr(new $NodeCtx(new_node))
  2498. new $IdCtx(new $ExprCtx(for_ctx,'id',false),'$temp'+$loop_num)
  2499. $B.bound[this.scope.id]['$temp'+$loop_num]=true
  2500. for_ctx.tree[1]=this.tree[0]
  2501. this.tree[0].parent=for_ctx
  2502. var yield_node=new $Node()
  2503. new_node.locals=node.locals
  2504. new_node.add(yield_node)
  2505. new $IdCtx(new $YieldCtx(new $NodeCtx(yield_node)),'$temp'+$loop_num)
  2506. var ph_node=new $Node()
  2507. new $NodeJSCtx(ph_node,'// placeholder for generator sent value')
  2508. ph_node.set_yield_value=true
  2509. new_node.add(ph_node)
  2510. for_ctx.transform(new_node,rank)
  2511. $loop_num++}else{var new_node=new $Node()
  2512. new $NodeJSCtx(new_node,'// placeholder for generator sent value')
  2513. new_node.set_yield_value=true
  2514. node.parent.insert(rank+1,new_node)}}
  2515. this.to_js=function(){this.js_processed=true
  2516. if(this.from===undefined)return $to_js(this.tree)||'None'
  2517. return $to_js(this.tree)}}
  2518. function $add_profile(node,rank){if(node.type==='module'){var i=0
  2519. while(i<node.children.length){i +=$add_profile(node.children[i],i)}}else{var elt=node.C.tree[0],offset=1
  2520. var flag=true
  2521. var pnode=node
  2522. while(pnode.parent!==undefined){pnode=pnode.parent}
  2523. var mod_id=pnode.id
  2524. if(node.line_num===undefined){flag=false}
  2525. if(elt.type==='condition' && elt.token==='elif'){flag=false}
  2526. else if(elt.type==='except'){flag=false}
  2527. else if(elt.type==='single_kw'){flag=false}
  2528. if(flag){
  2529. var new_node=new $Node()
  2530. new $NodeJSCtx(new_node,';$B.$profile.count("'+mod_id+'",'+node.line_num+');')
  2531. node.parent.insert(rank,new_node)
  2532. offset=2}
  2533. var i=0
  2534. while(i<node.children.length)i+=$add_profile(node.children[i],i)
  2535. return offset}}
  2536. function $add_line_num(node,rank){if(node.type==='module'){var i=0
  2537. while(i<node.children.length){i +=$add_line_num(node.children[i],i)}}else{var elt=node.C.tree[0],offset=1
  2538. var flag=true
  2539. var pnode=node
  2540. while(pnode.parent!==undefined){pnode=pnode.parent}
  2541. var mod_id=pnode.id
  2542. if(node.line_num===undefined){flag=false}
  2543. if(elt.type==='condition' && elt.token==='elif'){flag=false}
  2544. else if(elt.type==='except'){flag=false}
  2545. else if(elt.type==='single_kw'){flag=false}
  2546. if(flag){
  2547. var js=';$locals.$line_info="'+node.line_num+','+mod_id+'";'
  2548. var new_node=new $Node()
  2549. new $NodeJSCtx(new_node,js)
  2550. node.parent.insert(rank,new_node)
  2551. offset=2}
  2552. var i=0
  2553. while(i<node.children.length)i+=$add_line_num(node.children[i],i)
  2554. if((elt.type=='condition' && elt.token=="while")
  2555. ||node.C.type=='for'){node.add($NodeJS('$locals.$line_info="'+node.line_num+','+
  2556. mod_id+'";'))}
  2557. return offset}}
  2558. function $bind(name,scope_id,level){
  2559. if($B.bound[scope_id][name]!==undefined){
  2560. if(level<$B.bound[scope_id][name].level){$B.bound[scope_id][name].level=level}}else{$B.bound[scope_id][name]={level: level}}}
  2561. function $previous(C){var previous=C.node.parent.children[C.node.parent.children.length-2]
  2562. if(!previous ||!previous.C){$_SyntaxError(C,'keyword not following correct keyword')}
  2563. return previous.C.tree[0]}
  2564. function $get_docstring(node){var doc_string=''
  2565. if(node.children.length>0){var firstchild=node.children[0]
  2566. if(firstchild.C.tree && firstchild.C.tree[0].type=='expr'){if(firstchild.C.tree[0].tree[0].type=='str')
  2567. doc_string=firstchild.C.tree[0].tree[0].to_js()}}
  2568. return doc_string}
  2569. function $get_scope(C){
  2570. var ctx_node=C.parent
  2571. while(ctx_node.type!=='node'){ctx_node=ctx_node.parent}
  2572. var tree_node=ctx_node.node,scope=null,level=1
  2573. while(tree_node.parent && tree_node.parent.type!=='module'){var ntype=tree_node.parent.C.tree[0].type
  2574. switch(ntype){case 'def':
  2575. case 'class':
  2576. case 'generator':
  2577. var scope=tree_node.parent
  2578. scope.ntype=ntype
  2579. scope.is_function=ntype!='class'
  2580. scope.level=level
  2581. return scope}
  2582. tree_node=tree_node.parent
  2583. level++}
  2584. var scope=tree_node.parent ||tree_node
  2585. scope.ntype="module"
  2586. scope.level=level
  2587. return scope}
  2588. function $get_level(ctx){var nd=$get_node(ctx),level=0
  2589. while(nd.parent!==undefined){level++
  2590. nd=nd.parent}
  2591. return level}
  2592. function $get_module(C){
  2593. var ctx_node=C.parent
  2594. while(ctx_node.type!=='node'){ctx_node=ctx_node.parent}
  2595. var tree_node=ctx_node.node
  2596. var scope=null
  2597. while(tree_node.parent.type!=='module'){tree_node=tree_node.parent}
  2598. var scope=tree_node.parent
  2599. scope.ntype="module"
  2600. return scope}
  2601. function $get_node(C){var ctx=C
  2602. while(ctx.parent){ctx=ctx.parent}
  2603. return ctx.node}
  2604. function $get_blocks(name,scope){var res=[]
  2605. while(true){if($B.bound[scope.id][name]!==undefined){res.push(scope.id)}
  2606. if(scope.parent_block){if(scope.parent_block.id=='__builtins__'){if(scope.blurred){return false}}}else{break}
  2607. scope=scope.parent_block}
  2608. return res}
  2609. function $to_js_map(tree_element){if(tree_element.to_js !==undefined)return tree_element.to_js()
  2610. throw Error('no to_js() for '+tree_element)}
  2611. function $to_js(tree,sep){if(sep===undefined){sep=','}
  2612. return tree.map($to_js_map).join(sep)}
  2613. function $arbo(ctx){while(ctx.parent!=undefined){ctx=ctx.parent}
  2614. return ctx}
  2615. function $transition(C,token){
  2616. switch(C.type){case 'abstract_expr':
  2617. switch(token){case 'id':
  2618. case 'imaginary':
  2619. case 'int':
  2620. case 'float':
  2621. case 'str':
  2622. case 'bytes':
  2623. case '[':
  2624. case '(':
  2625. case '{':
  2626. case '.':
  2627. case 'not':
  2628. case 'lambda':
  2629. case 'yield':
  2630. C.parent.tree.pop()
  2631. var commas=C.with_commas
  2632. C=C.parent}
  2633. switch(token){case 'id':
  2634. return new $IdCtx(new $ExprCtx(C,'id',commas),arguments[2])
  2635. case 'str':
  2636. return new $StringCtx(new $ExprCtx(C,'str',commas),arguments[2])
  2637. case 'bytes':
  2638. return new $StringCtx(new $ExprCtx(C,'bytes',commas),arguments[2])
  2639. case 'int':
  2640. return new $IntCtx(new $ExprCtx(C,'int',commas),arguments[2])
  2641. case 'float':
  2642. return new $FloatCtx(new $ExprCtx(C,'float',commas),arguments[2])
  2643. case 'imaginary':
  2644. return new $ImaginaryCtx(new $ExprCtx(C,'imaginary',commas),arguments[2])
  2645. case '(':
  2646. return new $ListOrTupleCtx(new $ExprCtx(C,'tuple',commas),'tuple')
  2647. case '[':
  2648. return new $ListOrTupleCtx(new $ExprCtx(C,'list',commas),'list')
  2649. case '{':
  2650. return new $DictOrSetCtx(new $ExprCtx(C,'dict_or_set',commas))
  2651. case '.':
  2652. return new $EllipsisCtx(new $ExprCtx(C,'ellipsis',commas))
  2653. case 'not':
  2654. if(C.type==='op'&&C.op==='is'){
  2655. C.op='is_not'
  2656. return C}
  2657. return new $NotCtx(new $ExprCtx(C,'not',commas))
  2658. case 'lambda':
  2659. return new $LambdaCtx(new $ExprCtx(C,'lambda',commas))
  2660. case 'op':
  2661. var tg=arguments[2]
  2662. switch(tg){case '*':
  2663. C.parent.tree.pop()
  2664. var commas=C.with_commas
  2665. C=C.parent
  2666. return new $PackedCtx(new $ExprCtx(C,'expr',commas))
  2667. case '-':
  2668. case '~':
  2669. case '+':
  2670. C.parent.tree.pop()
  2671. var left=new $UnaryCtx(C.parent,tg)
  2672. if(tg=='-'){var op_expr=new $OpCtx(left,'unary_neg')}
  2673. else if(tg=='+'){var op_expr=new $OpCtx(left,'unary_pos')}
  2674. else{var op_expr=new $OpCtx(left,'unary_inv')}
  2675. return new $AbstractExprCtx(op_expr,false)
  2676. case 'not':
  2677. C.parent.tree.pop()
  2678. var commas=C.with_commas
  2679. C=C.parent
  2680. return new $NotCtx(new $ExprCtx(C,'not',commas))}
  2681. $_SyntaxError(C,'token '+token+' after '+C)
  2682. case '=':
  2683. $_SyntaxError(C,token)
  2684. case 'yield':
  2685. return new $AbstractExprCtx(new $YieldCtx(C),true)
  2686. case ':':
  2687. return $transition(C.parent,token,arguments[2])
  2688. case ')':
  2689. case ',':
  2690. switch(C.parent.type){case 'list_or_tuple':
  2691. case 'call_arg':
  2692. case 'op':
  2693. case 'yield':
  2694. break
  2695. default:
  2696. $_SyntaxError(C,token)}}
  2697. return $transition(C.parent,token,arguments[2])
  2698. case 'annotation':
  2699. return $transition(C.parent,token)
  2700. case 'assert':
  2701. if(token==='eol')return $transition(C.parent,token)
  2702. $_SyntaxError(C,token)
  2703. case 'assign':
  2704. if(token==='eol'){if(C.tree[1].type=='abstract_expr'){$_SyntaxError(C,'token '+token+' after '+C)}
  2705. C.guess_type()
  2706. return $transition(C.parent,'eol')}
  2707. $_SyntaxError(C,'token '+token+' after '+C)
  2708. case 'attribute':
  2709. if(token==='id'){var name=arguments[2]
  2710. if(noassign[name]===true){$_SyntaxError(C,["cannot assign to "+name])}
  2711. C.name=name
  2712. return C.parent}
  2713. $_SyntaxError(C,token)
  2714. case 'augm_assign':
  2715. if(token==='eol'){if(C.tree[1].type=='abstract_expr'){$_SyntaxError(C,'token '+token+' after '+C)}
  2716. return $transition(C.parent,'eol')}
  2717. $_SyntaxError(C,'token '+token+' after '+C)
  2718. case 'break':
  2719. if(token==='eol')return $transition(C.parent,'eol')
  2720. $_SyntaxError(C,token)
  2721. case 'call':
  2722. switch(token){case ',':
  2723. if(C.expect=='id'){$_SyntaxError(C,token)}
  2724. return C
  2725. case 'id':
  2726. case 'imaginary':
  2727. case 'int':
  2728. case 'float':
  2729. case 'str':
  2730. case 'bytes':
  2731. case '[':
  2732. case '(':
  2733. case '{':
  2734. case '.':
  2735. case 'not':
  2736. case 'lambda':
  2737. if(C.has_dstar)$_SyntaxError(C,token)
  2738. C.expect=','
  2739. return $transition(new $CallArgCtx(C),token,arguments[2])
  2740. case ')':
  2741. C.end=$pos
  2742. return C.parent
  2743. case 'op':
  2744. C.expect=','
  2745. switch(arguments[2]){case '-':
  2746. case '~':
  2747. case '+':
  2748. C.expect=','
  2749. return $transition(new $CallArgCtx(C),token,arguments[2])
  2750. case '*':
  2751. C.has_star=true;
  2752. return new $StarArgCtx(C)
  2753. case '**':
  2754. C.has_dstar=true
  2755. return new $DoubleStarArgCtx(C)}
  2756. $_SyntaxError(C,token)}
  2757. return $transition(C.parent,token,arguments[2])
  2758. case 'call_arg':
  2759. switch(token){case 'id':
  2760. case 'imaginary':
  2761. case 'int':
  2762. case 'float':
  2763. case 'str':
  2764. case 'bytes':
  2765. case '[':
  2766. case '(':
  2767. case '{':
  2768. case '.':
  2769. case 'not':
  2770. case 'lambda':
  2771. if(C.expect==='id'){C.expect=','
  2772. var expr=new $AbstractExprCtx(C,false)
  2773. return $transition(expr,token,arguments[2])}
  2774. break
  2775. case '=':
  2776. if(C.expect===','){return new $ExprCtx(new $KwArgCtx(C),'kw_value',false)}
  2777. break
  2778. case 'for':
  2779. var lst=new $ListOrTupleCtx(C,'gen_expr')
  2780. lst.vars=C.vars
  2781. lst.locals=C.locals
  2782. lst.intervals=[C.start]
  2783. C.tree.pop()
  2784. lst.expression=C.tree
  2785. C.tree=[lst]
  2786. lst.tree=[]
  2787. var comp=new $ComprehensionCtx(lst)
  2788. return new $TargetListCtx(new $CompForCtx(comp))
  2789. case 'op':
  2790. if(C.expect==='id'){var op=arguments[2]
  2791. C.expect=','
  2792. switch(op){case '+':
  2793. case '-':
  2794. case '~':
  2795. return $transition(new $AbstractExprCtx(C,false),token,op)
  2796. case '*':
  2797. return new $StarArgCtx(C)
  2798. case '**':
  2799. return new $DoubleStarArgCtx(C)}}
  2800. $_SyntaxError(C,'token '+token+' after '+C)
  2801. case ')':
  2802. if(C.parent.kwargs &&
  2803. $B.last(C.parent.tree).tree[0]&&
  2804. ['kwarg','star_arg','double_star_arg'].indexOf($B.last(C.parent.tree).tree[0].type)==-1){$_SyntaxError(C,['non-keyword arg after keyword arg'])}
  2805. if(C.tree.length>0){var son=C.tree[C.tree.length-1]
  2806. if(son.type==='list_or_tuple'&&son.real==='gen_expr'){son.intervals.push($pos)}}
  2807. return $transition(C.parent,token)
  2808. case ':':
  2809. if(C.expect===',' && C.parent.parent.type==='lambda'){return $transition(C.parent.parent,token)}
  2810. break
  2811. case ',':
  2812. if(C.expect===','){if(C.parent.kwargs &&
  2813. ['kwarg','star_arg','double_star_arg'].indexOf($B.last(C.parent.tree).tree[0].type)==-1){console.log('err2')
  2814. $_SyntaxError(C,['non-keyword arg after keyword arg'])}
  2815. return $transition(C.parent,token,arguments[2])}
  2816. console.log('C '+C+'token '+token+' expect '+C.expect)}
  2817. $_SyntaxError(C,'token '+token+' after '+C)
  2818. case 'class':
  2819. switch(token){case 'id':
  2820. if(C.expect==='id'){C.set_name(arguments[2])
  2821. C.expect='(:'
  2822. return C}
  2823. break
  2824. case '(':
  2825. return new $CallCtx(C)
  2826. case ':':
  2827. return $BodyCtx(C)}
  2828. $_SyntaxError(C,'token '+token+' after '+C)
  2829. case 'comp_if':
  2830. return $transition(C.parent,token,arguments[2])
  2831. case 'comp_for':
  2832. if(token==='in' && C.expect==='in'){C.expect=null
  2833. return new $AbstractExprCtx(new $CompIterableCtx(C),true)}
  2834. if(C.expect===null){
  2835. return $transition(C.parent,token,arguments[2])}
  2836. $_SyntaxError(C,'token '+token+' after '+C)
  2837. case 'comp_iterable':
  2838. return $transition(C.parent,token,arguments[2])
  2839. case 'comprehension':
  2840. switch(token){case 'if':
  2841. return new $AbstractExprCtx(new $CompIfCtx(C),false)
  2842. case 'for':
  2843. return new $TargetListCtx(new $CompForCtx(C))}
  2844. return $transition(C.parent,token,arguments[2])
  2845. case 'condition':
  2846. if(token===':')return $BodyCtx(C)
  2847. $_SyntaxError(C,'token '+token+' after '+C)
  2848. case 'continue':
  2849. if(token=='eol')return C.parent
  2850. $_SyntaxError(C,'token '+token+' after '+C)
  2851. case 'ctx_manager_alias':
  2852. switch(token){case ',':
  2853. case ':':
  2854. return $transition(C.parent,token,arguments[2])}
  2855. $_SyntaxError(C,'token '+token+' after '+C)
  2856. case 'decorator':
  2857. if(token==='id' && C.tree.length===0){return $transition(new $AbstractExprCtx(C,false),token,arguments[2])}
  2858. if(token==='eol'){return $transition(C.parent,token)}
  2859. $_SyntaxError(C,'token '+token+' after '+C)
  2860. case 'def':
  2861. switch(token){case 'id':
  2862. if(C.name){$_SyntaxError(C,'token '+token+' after '+C)}
  2863. C.set_name(arguments[2])
  2864. return C
  2865. case '(':
  2866. if(C.name===null){$_SyntaxError(C,'token '+token+' after '+C)}
  2867. C.has_args=true;
  2868. return new $FuncArgs(C)
  2869. case 'annotation':
  2870. return new $AbstractExprCtx(new $AnnotationCtx(C),true)
  2871. case ':':
  2872. if(C.has_args)return $BodyCtx(C)}
  2873. $_SyntaxError(C,'token '+token+' after '+C)
  2874. case 'del':
  2875. if(token==='eol')return $transition(C.parent,token)
  2876. $_SyntaxError(C,'token '+token+' after '+C)
  2877. case 'dict_or_set':
  2878. if(C.closed){switch(token){case '[':
  2879. return new $SubCtx(C.parent)
  2880. case '(':
  2881. return new $CallArgCtx(new $CallCtx(C))}
  2882. return $transition(C.parent,token,arguments[2])}else{if(C.expect===','){switch(token){case '}':
  2883. switch(C.real){case 'dict_or_set':
  2884. if(C.tree.length !==1)break
  2885. C.real='set'
  2886. case 'set':
  2887. case 'set_comp':
  2888. case 'dict_comp':
  2889. C.items=C.tree
  2890. C.tree=[]
  2891. C.closed=true
  2892. return C
  2893. case 'dict':
  2894. if(C.tree.length%2===0){C.items=C.tree
  2895. C.tree=[]
  2896. C.closed=true
  2897. return C}}
  2898. $_SyntaxError(C,'token '+token+' after '+C)
  2899. case ',':
  2900. if(C.real==='dict_or_set'){C.real='set'}
  2901. if(C.real==='dict' && C.tree.length%2){$_SyntaxError(C,'token '+token+' after '+C)}
  2902. C.expect='id'
  2903. return C
  2904. case ':':
  2905. if(C.real==='dict_or_set'){C.real='dict'}
  2906. if(C.real==='dict'){C.expect=','
  2907. return new $AbstractExprCtx(C,false)}else{$_SyntaxError(C,'token '+token+' after '+C)}
  2908. case 'for':
  2909. if(C.real==='dict_or_set'){C.real='set_comp'}
  2910. else{C.real='dict_comp'}
  2911. var lst=new $ListOrTupleCtx(C,'dict_or_set_comp')
  2912. lst.intervals=[C.start+1]
  2913. lst.vars=C.vars
  2914. C.tree.pop()
  2915. lst.expression=C.tree
  2916. C.tree=[lst]
  2917. lst.tree=[]
  2918. var comp=new $ComprehensionCtx(lst)
  2919. return new $TargetListCtx(new $CompForCtx(comp))}
  2920. $_SyntaxError(C,'token '+token+' after '+C)}else if(C.expect==='id'){switch(token){case '}':
  2921. if(C.tree.length==0){
  2922. C.items=[]
  2923. C.real='dict'}else{
  2924. C.items=C.tree}
  2925. C.tree=[]
  2926. C.closed=true
  2927. return C
  2928. case 'id':
  2929. case 'imaginary':
  2930. case 'int':
  2931. case 'float':
  2932. case 'str':
  2933. case 'bytes':
  2934. case '[':
  2935. case '(':
  2936. case '{':
  2937. case '.':
  2938. case 'not':
  2939. case 'lambda':
  2940. C.expect=','
  2941. var expr=new $AbstractExprCtx(C,false)
  2942. return $transition(expr,token,arguments[2])
  2943. case 'op':
  2944. switch(arguments[2]){case '+':
  2945. return C
  2946. case '-':
  2947. case '~':
  2948. C.expect=','
  2949. var left=new $UnaryCtx(C,arguments[2])
  2950. if(arguments[2]=='-'){var op_expr=new $OpCtx(left,'unary_neg')}
  2951. else if(arguments[2]=='+'){var op_expr=new $OpCtx(left,'unary_pos')}
  2952. else{var op_expr=new $OpCtx(left,'unary_inv')}
  2953. return new $AbstractExprCtx(op_expr,false)}
  2954. $_SyntaxError(C,'token '+token+' after '+C)}
  2955. $_SyntaxError(C,'token '+token+' after '+C)}
  2956. return $transition(C.parent,token,arguments[2])}
  2957. case 'double_star_arg':
  2958. switch(token){case 'id':
  2959. case 'imaginary':
  2960. case 'int':
  2961. case 'float':
  2962. case 'str':
  2963. case 'bytes':
  2964. case '[':
  2965. case '(':
  2966. case '{':
  2967. case '.':
  2968. case 'not':
  2969. case 'lambda':
  2970. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])
  2971. case ',':
  2972. case ')':
  2973. return $transition(C.parent,token)
  2974. case ':':
  2975. if(C.parent.parent.type==='lambda'){return $transition(C.parent.parent,token)}}
  2976. $_SyntaxError(C,'token '+token+' after '+C)
  2977. case 'ellipsis':
  2978. if(token=='.'){C.nbdots++;return C}
  2979. else{if(C.nbdots!=3){$pos--;$_SyntaxError(C,'token '+token+' after '+C)}else{return $transition(C.parent,token,arguments[2])}}
  2980. case 'except':
  2981. switch(token){case 'id':
  2982. case 'imaginary':
  2983. case 'int':
  2984. case 'float':
  2985. case 'str':
  2986. case 'bytes':
  2987. case '[':
  2988. case '(':
  2989. case '{':
  2990. case 'not':
  2991. case 'lamdba':
  2992. if(C.expect==='id'){C.expect='as'
  2993. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])}
  2994. case 'as':
  2995. if(C.expect==='as' && C.has_alias===undefined){C.expect='alias'
  2996. C.has_alias=true
  2997. return C}
  2998. case 'id':
  2999. if(C.expect==='alias'){C.expect=':'
  3000. C.set_alias(arguments[2])
  3001. return C}
  3002. break
  3003. case ':':
  3004. var _ce=C.expect
  3005. if(_ce=='id' ||_ce=='as' ||_ce==':'){return $BodyCtx(C)}
  3006. break
  3007. case '(':
  3008. if(C.expect==='id' && C.tree.length===0){C.parenth=true
  3009. return C}
  3010. break
  3011. case ')':
  3012. if(C.expect==',' ||C.expect=='as'){C.expect='as'
  3013. return C}
  3014. case ',':
  3015. if(C.parenth!==undefined && C.has_alias===undefined &&
  3016. (C.expect=='as' ||C.expect==',')){C.expect='id'
  3017. return C}}
  3018. $_SyntaxError(C,'token '+token+' after '+C.expect)
  3019. case 'expr':
  3020. switch(token){case 'id':
  3021. case 'imaginary':
  3022. case 'int':
  3023. case 'float':
  3024. case 'str':
  3025. case 'bytes':
  3026. case 'lamdba':
  3027. $_SyntaxError(C,'token '+token+' after '+C)
  3028. break
  3029. case '[':
  3030. case '(':
  3031. case '{':
  3032. case '.':
  3033. case 'not':
  3034. if(C.expect==='expr'){C.expect=','
  3035. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])}}
  3036. switch(token){case 'not':
  3037. if(C.expect===',')return new $ExprNot(C)
  3038. break
  3039. case 'in':
  3040. if(C.parent.type=='target_list'){
  3041. return $transition(C.parent,token)}
  3042. if(C.expect===',')return $transition(C,'op','in')
  3043. break
  3044. case ',':
  3045. if(C.expect===','){if(C.with_commas){
  3046. C.parent.tree.pop()
  3047. var tuple=new $ListOrTupleCtx(C.parent,'tuple')
  3048. tuple.implicit=true
  3049. tuple.has_comma=true
  3050. tuple.tree=[C]
  3051. C.parent=tuple
  3052. return tuple}}
  3053. return $transition(C.parent,token)
  3054. case '.':
  3055. return new $AttrCtx(C)
  3056. case '[':
  3057. return new $AbstractExprCtx(new $SubCtx(C),true)
  3058. case '(':
  3059. return new $CallCtx(C)
  3060. case 'op':
  3061. var op_parent=C.parent,op=arguments[2]
  3062. if(op_parent.type=='ternary' && op_parent.in_else){var new_op=new $OpCtx(C,op)
  3063. return new $AbstractExprCtx(new_op,false)}
  3064. var op1=C.parent,repl=null
  3065. while(1){if(op1.type==='expr'){op1=op1.parent}
  3066. else if(op1.type==='op'
  3067. &&$op_weight[op1.op]>=$op_weight[op]
  3068. && !(op1.op=='**' && op=='**')
  3069. ){repl=op1;op1=op1.parent}else if(op1.type=="not" && $op_weight['not']>$op_weight[op]){repl=op1;op1=op1.parent}else{break}}
  3070. if(repl===null){while(1){if(C.parent!==op1){C=C.parent
  3071. op_parent=C.parent}else{break}}
  3072. C.parent.tree.pop()
  3073. var expr=new $ExprCtx(op_parent,'operand',C.with_commas)
  3074. expr.expect=','
  3075. C.parent=expr
  3076. var new_op=new $OpCtx(C,op)
  3077. return new $AbstractExprCtx(new_op,false)}else{
  3078. if(op==='and' ||op==='or'){while(repl.parent.type==='not'||
  3079. (repl.parent.type==='expr'&&repl.parent.parent.type==='not')){
  3080. repl=repl.parent
  3081. op_parent=repl.parent}}}
  3082. if(repl.type==='op'){var _flag=false
  3083. switch(repl.op){case '<':
  3084. case '<=':
  3085. case '==':
  3086. case '!=':
  3087. case 'is':
  3088. case '>=':
  3089. case '>':
  3090. _flag=true}
  3091. if(_flag){switch(op){case '<':
  3092. case '<=':
  3093. case '==':
  3094. case '!=':
  3095. case 'is':
  3096. case '>=':
  3097. case '>':
  3098. var c2=repl.tree[1],
  3099. c2js=c2.to_js()
  3100. var c2_clone=new Object()
  3101. for(var attr in c2){c2_clone[attr]=c2[attr]}
  3102. var vname="$c"+chained_comp_num
  3103. c2.to_js=function(){return vname}
  3104. c2_clone.to_js=function(){return vname}
  3105. chained_comp_num++
  3106. while(repl.parent && repl.parent.type=='op'){if($op_weight[repl.parent.op]<$op_weight[repl.op]){repl=repl.parent}else{break}}
  3107. repl.parent.tree.pop()
  3108. var and_expr=new $OpCtx(repl,'and')
  3109. and_expr.wrap={'name': vname,'js': c2js}
  3110. c2_clone.parent=and_expr
  3111. and_expr.tree.push('xxx')
  3112. var new_op=new $OpCtx(c2_clone,op)
  3113. return new $AbstractExprCtx(new_op,false)}}}
  3114. repl.parent.tree.pop()
  3115. var expr=new $ExprCtx(repl.parent,'operand',false)
  3116. expr.tree=[op1]
  3117. repl.parent=expr
  3118. var new_op=new $OpCtx(repl,op)
  3119. return new $AbstractExprCtx(new_op,false)
  3120. case 'augm_assign':
  3121. if(C.expect===','){return new $AbstractExprCtx(new $AugmentedAssignCtx(C,arguments[2]),true)}
  3122. break
  3123. case '=':
  3124. if(C.expect===','){if(C.parent.type==="call_arg"){return new $AbstractExprCtx(new $KwArgCtx(C),true)}else if(C.parent.type=="annotation"){return $transition(C.parent.parent,token,arguments[2])}
  3125. while(C.parent!==undefined){C=C.parent
  3126. if(C.type=='condition'){$_SyntaxError(C,'token '+token+' after '+C)}}
  3127. C=C.tree[0]
  3128. return new $AbstractExprCtx(new $AssignCtx(C),true)}
  3129. break
  3130. case 'if':
  3131. var in_comp=false,ctx=C.parent
  3132. while(true){if(ctx.type=='comp_iterable'){in_comp=true;break}
  3133. else if(ctx.parent!==undefined){ctx=ctx.parent}
  3134. else{break}}
  3135. if(in_comp){break}
  3136. var ctx=C
  3137. while(ctx.parent && ctx.parent.type=='op'){ctx=ctx.parent
  3138. if(ctx.type=='expr' && ctx.parent && ctx.parent.type=='op'){ctx=ctx.parent}}
  3139. return new $AbstractExprCtx(new $TernaryCtx(ctx),false)}
  3140. return $transition(C.parent,token)
  3141. case 'expr_not':
  3142. if(token=='in'){
  3143. C.parent.tree.pop()
  3144. return new $AbstractExprCtx(new $OpCtx(C.parent,'not_in'),false)}
  3145. $_SyntaxError(C,'token '+token+' after '+C)
  3146. case 'for':
  3147. switch(token){case 'in':
  3148. return new $AbstractExprCtx(new $ExprCtx(C,'target list',true),false)
  3149. case ':':
  3150. return $BodyCtx(C)}
  3151. $_SyntaxError(C,'token '+token+' after '+C)
  3152. case 'from':
  3153. switch(token){case 'id':
  3154. if(C.expect=='id'){C.add_name(arguments[2])
  3155. C.expect=','
  3156. return C}
  3157. if(C.expect==='alias'){C.aliases[C.names[C.names.length-1]]=arguments[2]
  3158. C.expect=','
  3159. return C}
  3160. case '.':
  3161. if(C.expect=='module'){if(token=='id'){C.module +=arguments[2]}
  3162. else{C.module +='.'}
  3163. return C}
  3164. case 'import':
  3165. C.blocking=token=='import'
  3166. if(C.expect=='module'){C.expect='id'
  3167. return C}
  3168. case 'op':
  3169. if(arguments[2]=='*' && C.expect=='id'
  3170. && C.names.length==0){if($get_scope(C).ntype!=='module'){$_SyntaxError(C,["import * only allowed at module level"])}
  3171. C.add_name('*')
  3172. C.expect='eol'
  3173. return C}
  3174. case ',':
  3175. if(C.expect==','){C.expect='id'
  3176. return C}
  3177. case 'eol':
  3178. switch(C.expect){case ',':
  3179. case 'eol':
  3180. C.bind_names()
  3181. return $transition(C.parent,token)
  3182. case 'id':
  3183. $_SyntaxError(C,['trailing comma not allowed without surrounding parentheses'])
  3184. default:
  3185. $_SyntaxError(C,['invalid syntax'])}
  3186. case 'as':
  3187. if(C.expect==',' ||C.expect=='eol'){C.expect='alias'
  3188. return C}
  3189. case '(':
  3190. if(C.expect=='id'){C.expect='id'
  3191. return C}
  3192. case ')':
  3193. if(C.expect==',' ||C.expect=='id'){C.expect='eol'
  3194. return C}}
  3195. $_SyntaxError(C,'token '+token+' after '+C)
  3196. case 'func_arg_id':
  3197. switch(token){case '=':
  3198. if(C.expect==='='){C.parent.has_default=true
  3199. var def_ctx=C.parent.parent
  3200. if(C.parent.has_star_arg){def_ctx.default_list.push(def_ctx.after_star.pop())}else{def_ctx.default_list.push(def_ctx.positional_list.pop())}
  3201. return new $AbstractExprCtx(C,false)}
  3202. break
  3203. case ',':
  3204. case ')':
  3205. if(C.parent.has_default && C.tree.length==0 &&
  3206. C.parent.has_star_arg===undefined){console.log('parent '+C.parent,C.parent)
  3207. $pos -=C.name.length
  3208. $_SyntaxError(C,['non-default argument follows default argument'])}else{return $transition(C.parent,token)}
  3209. case ':':
  3210. return new $AbstractExprCtx(new $AnnotationCtx(C),false)}
  3211. $_SyntaxError(C,'token '+token+' after '+C)
  3212. case 'func_args':
  3213. switch(token){case 'id':
  3214. if(C.expect==='id'){C.expect=','
  3215. if(C.names.indexOf(arguments[2])>-1){$_SyntaxError(C,['duplicate argument '+arguments[2]+' in function definition'])}}
  3216. return new $FuncArgIdCtx(C,arguments[2])
  3217. case ',':
  3218. if(C.has_kw_arg)$_SyntaxError(C,'duplicate kw arg')
  3219. if(C.expect===','){C.expect='id'
  3220. return C}
  3221. $_SyntaxError(C,'token '+token+' after '+C)
  3222. case ')':
  3223. return C.parent
  3224. case 'op':
  3225. var op=arguments[2]
  3226. C.expect=','
  3227. if(op=='*'){if(C.has_star_arg){$_SyntaxError(C,'duplicate star arg')}
  3228. return new $FuncStarArgCtx(C,'*')}
  3229. if(op=='**')return new $FuncStarArgCtx(C,'**')
  3230. $_SyntaxError(C,'token '+op+' after '+C)}
  3231. $_SyntaxError(C,'token '+token+' after '+C)
  3232. case 'func_star_arg':
  3233. switch(token){case 'id':
  3234. if(C.name===undefined){if(C.parent.names.indexOf(arguments[2])>-1){$_SyntaxError(C,['duplicate argument '+arguments[2]+' in function definition'])}}
  3235. C.set_name(arguments[2])
  3236. C.parent.names.push(arguments[2])
  3237. return C
  3238. case ',':
  3239. case ')':
  3240. if(C.name===undefined){
  3241. C.set_name('$dummy')
  3242. C.parent.names.push('$dummy')}
  3243. return $transition(C.parent,token)
  3244. case ':':
  3245. if(C.name===undefined){$_SyntaxError(C,'annotation on an unnamed parameter')}
  3246. return new $AbstractExprCtx(new $AnnotationCtx(C),false)}
  3247. $_SyntaxError(C,'token '+token+' after '+C)
  3248. case 'global':
  3249. switch(token){case 'id':
  3250. if(C.expect==='id'){new $IdCtx(C,arguments[2])
  3251. C.add(arguments[2])
  3252. C.expect=','
  3253. return C}
  3254. break
  3255. case ',':
  3256. if(C.expect===','){C.expect='id'
  3257. return C}
  3258. break
  3259. case 'eol':
  3260. if(C.expect===','){return $transition(C.parent,token)}
  3261. break}
  3262. $_SyntaxError(C,'token '+token+' after '+C)
  3263. case 'id':
  3264. switch(token){case '=':
  3265. if(C.parent.type==='expr' &&
  3266. C.parent.parent !==undefined &&
  3267. C.parent.parent.type==='call_arg'){return new $AbstractExprCtx(new $KwArgCtx(C.parent),false)}
  3268. return $transition(C.parent,token,arguments[2])
  3269. case 'op':
  3270. return $transition(C.parent,token,arguments[2])
  3271. case 'id':
  3272. case 'str':
  3273. case 'int':
  3274. case 'float':
  3275. case 'imaginary':
  3276. $_SyntaxError(C,'token '+token+' after '+C)}
  3277. return $transition(C.parent,token,arguments[2])
  3278. case 'import':
  3279. switch(token){case 'id':
  3280. if(C.expect==='id'){new $ImportedModuleCtx(C,arguments[2])
  3281. C.expect=','
  3282. return C}
  3283. if(C.expect==='qual'){C.expect=','
  3284. C.tree[C.tree.length-1].name +='.'+arguments[2]
  3285. C.tree[C.tree.length-1].alias +='.'+arguments[2]
  3286. return C}
  3287. if(C.expect==='alias'){C.expect=','
  3288. C.tree[C.tree.length-1].alias=arguments[2]
  3289. return C}
  3290. break
  3291. case '.':
  3292. if(C.expect===','){C.expect='qual'
  3293. return C}
  3294. break
  3295. case ',':
  3296. if(C.expect===','){C.expect='id'
  3297. return C}
  3298. break
  3299. case 'as':
  3300. if(C.expect===','){C.expect='alias'
  3301. return C}
  3302. break
  3303. case 'eol':
  3304. if(C.expect===','){C.bind_names()
  3305. return $transition(C.parent,token)}
  3306. break}
  3307. $_SyntaxError(C,'token '+token+' after '+C)
  3308. case 'imaginary':
  3309. case 'int':
  3310. case 'float':
  3311. switch(token){case 'id':
  3312. case 'imaginary':
  3313. case 'int':
  3314. case 'float':
  3315. case 'str':
  3316. case 'bytes':
  3317. case '[':
  3318. case '(':
  3319. case '{':
  3320. case 'not':
  3321. case 'lamdba':
  3322. $_SyntaxError(C,'token '+token+' after '+C)}
  3323. return $transition(C.parent,token,arguments[2])
  3324. case 'kwarg':
  3325. if(token===',')return new $CallArgCtx(C.parent.parent)
  3326. return $transition(C.parent,token)
  3327. case 'lambda':
  3328. if(token===':' && C.args===undefined){C.args=C.tree
  3329. C.tree=[]
  3330. C.body_start=$pos
  3331. return new $AbstractExprCtx(C,false)}
  3332. if(C.args!==undefined){
  3333. C.body_end=$pos
  3334. return $transition(C.parent,token)}
  3335. if(C.args===undefined){return $transition(new $CallCtx(C),token,arguments[2])}
  3336. $_SyntaxError(C,'token '+token+' after '+C)
  3337. case 'list_or_tuple':
  3338. if(C.closed){if(token==='[')return new $SubCtx(C.parent)
  3339. if(token==='(')return new $CallCtx(C)
  3340. return $transition(C.parent,token,arguments[2])}else{if(C.expect===','){switch(C.real){case 'tuple':
  3341. case 'gen_expr':
  3342. if(token===')'){C.closed=true
  3343. if(C.real==='gen_expr'){C.intervals.push($pos)}
  3344. return C.parent}
  3345. break
  3346. case 'list':
  3347. case 'list_comp':
  3348. if(token===']'){C.closed=true
  3349. if(C.real==='list_comp'){C.intervals.push($pos)}
  3350. return C}
  3351. break
  3352. case 'dict_or_set_comp':
  3353. if(token==='}'){C.intervals.push($pos)
  3354. return $transition(C.parent,token)}
  3355. break}
  3356. switch(token){case ',':
  3357. if(C.real==='tuple'){C.has_comma=true}
  3358. C.expect='id'
  3359. return C
  3360. case 'for':
  3361. if(C.real==='list'){C.real='list_comp'}
  3362. else{C.real='gen_expr'}
  3363. C.intervals=[C.start+1]
  3364. C.expression=C.tree
  3365. C.tree=[]
  3366. var comp=new $ComprehensionCtx(C)
  3367. return new $TargetListCtx(new $CompForCtx(comp))}
  3368. return $transition(C.parent,token,arguments[2])}else if(C.expect==='id'){switch(C.real){case 'tuple':
  3369. if(token===')'){C.closed=true
  3370. return C.parent}
  3371. if(token=='eol' && C.implicit===true){C.closed=true
  3372. return $transition(C.parent,token)}
  3373. break
  3374. case 'gen_expr':
  3375. if(token===')'){C.closed=true
  3376. return $transition(C.parent,token)}
  3377. break
  3378. case 'list':
  3379. if(token===']'){C.closed=true
  3380. return C}
  3381. break}
  3382. switch(token){case '=':
  3383. if(C.real=='tuple' && C.implicit===true){C.closed=true
  3384. C.parent.tree.pop()
  3385. var expr=new $ExprCtx(C.parent,'tuple',false)
  3386. expr.tree=[C]
  3387. C.parent=expr
  3388. return $transition(C.parent,token)}
  3389. break
  3390. case ')':
  3391. break
  3392. case ']':
  3393. if(C.real=='tuple' && C.implicit===true){
  3394. return $transition(C.parent,token,arguments[2])}else{break}
  3395. case ',':
  3396. $_SyntaxError(C,'unexpected comma inside list')
  3397. default:
  3398. C.expect=','
  3399. var expr=new $AbstractExprCtx(C,false)
  3400. return $transition(expr,token,arguments[2])}}else{return $transition(C.parent,token,arguments[2])}}
  3401. case 'list_comp':
  3402. switch(token){case ']':
  3403. return C.parent
  3404. case 'in':
  3405. return new $ExprCtx(C,'iterable',true)
  3406. case 'if':
  3407. return new $ExprCtx(C,'condition',true)}
  3408. $_SyntaxError(C,'token '+token+' after '+C)
  3409. case 'node':
  3410. switch(token){case 'id':
  3411. case 'imaginary':
  3412. case 'int':
  3413. case 'float':
  3414. case 'str':
  3415. case 'bytes':
  3416. case '[':
  3417. case '(':
  3418. case '{':
  3419. case 'not':
  3420. case 'lamdba':
  3421. case '.':
  3422. var expr=new $AbstractExprCtx(C,true)
  3423. return $transition(expr,token,arguments[2])
  3424. case 'op':
  3425. switch(arguments[2]){case '*':
  3426. case '+':
  3427. case '-':
  3428. case '~':
  3429. var expr=new $AbstractExprCtx(C,true)
  3430. return $transition(expr,token,arguments[2])}
  3431. break
  3432. case 'class':
  3433. return new $ClassCtx(C)
  3434. case 'continue':
  3435. return new $ContinueCtx(C)
  3436. case '__debugger__':
  3437. return new $DebuggerCtx(C)
  3438. case 'break':
  3439. return new $BreakCtx(C)
  3440. case 'def':
  3441. return new $DefCtx(C)
  3442. case 'for':
  3443. return new $TargetListCtx(new $ForExpr(C))
  3444. case 'if':
  3445. case 'while':
  3446. return new $AbstractExprCtx(new $ConditionCtx(C,token),false)
  3447. case 'elif':
  3448. var previous=$previous(C)
  3449. if(['condition'].indexOf(previous.type)==-1 ||
  3450. previous.token=='while'){$_SyntaxError(C,'elif after '+previous.type)}
  3451. return new $AbstractExprCtx(new $ConditionCtx(C,token),false)
  3452. case 'else':
  3453. var previous=$previous(C)
  3454. if(['condition','except','for'].indexOf(previous.type)==-1){$_SyntaxError(C,'else after '+previous.type)}
  3455. return new $SingleKwCtx(C,token)
  3456. case 'finally':
  3457. var previous=$previous(C)
  3458. if(['try','except'].indexOf(previous.type)==-1 &&
  3459. (previous.type!='single_kw' ||previous.token!='else')){$_SyntaxError(C,'finally after '+previous.type)}
  3460. return new $SingleKwCtx(C,token)
  3461. case 'try':
  3462. return new $TryCtx(C)
  3463. case 'except':
  3464. var previous=$previous(C)
  3465. if(['try','except'].indexOf(previous.type)==-1){$_SyntaxError(C,'except after '+previous.type)}
  3466. return new $ExceptCtx(C)
  3467. case 'assert':
  3468. return new $AbstractExprCtx(new $AssertCtx(C),'assert',true)
  3469. case 'from':
  3470. return new $FromCtx(C)
  3471. case 'import':
  3472. return new $ImportCtx(C)
  3473. case 'IMPRT':
  3474. return new $IMPRTCtx(C)
  3475. case 'global':
  3476. return new $GlobalCtx(C)
  3477. case 'nonlocal':
  3478. return new $NonlocalCtx(C)
  3479. case 'lambda':
  3480. return new $LambdaCtx(C)
  3481. case 'pass':
  3482. return new $PassCtx(C)
  3483. case 'raise':
  3484. return new $AbstractExprCtx(new $RaiseCtx(C),true)
  3485. case 'return':
  3486. return new $AbstractExprCtx(new $ReturnCtx(C),true)
  3487. case 'with':
  3488. return new $AbstractExprCtx(new $WithCtx(C),false)
  3489. case 'yield':
  3490. return new $AbstractExprCtx(new $YieldCtx(C),true)
  3491. case 'del':
  3492. return new $AbstractExprCtx(new $DelCtx(C),true)
  3493. case '@':
  3494. return new $DecoratorCtx(C)
  3495. case 'eol':
  3496. if(C.tree.length===0){
  3497. C.node.parent.children.pop()
  3498. return C.node.parent.C}
  3499. return C}
  3500. $_SyntaxError(C,'token '+token+' after '+C)
  3501. case 'not':
  3502. switch(token){case 'in':
  3503. C.parent.parent.tree.pop()
  3504. return new $ExprCtx(new $OpCtx(C.parent,'not_in'),'op',false)
  3505. case 'id':
  3506. case 'imaginary':
  3507. case 'int':
  3508. case 'float':
  3509. case 'str':
  3510. case 'bytes':
  3511. case '[':
  3512. case '(':
  3513. case '{':
  3514. case '.':
  3515. case 'not':
  3516. case 'lamdba':
  3517. var expr=new $AbstractExprCtx(C,false)
  3518. return $transition(expr,token,arguments[2])
  3519. case 'op':
  3520. var a=arguments[2]
  3521. if('+'==a ||'-'==a ||'~'==a){var expr=new $AbstractExprCtx(C,false)
  3522. return $transition(expr,token,arguments[2])}}
  3523. return $transition(C.parent,token)
  3524. case 'op':
  3525. if(C.op===undefined){$_SyntaxError(C,['C op undefined '+C])}
  3526. if(C.op.substr(0,5)=='unary' && token !='eol'){if(C.parent.type=='assign' ||C.parent.type=='return'){
  3527. C.parent.tree.pop()
  3528. var t=new $ListOrTupleCtx(C.parent,'tuple')
  3529. t.tree.push(C)
  3530. C.parent=t
  3531. return t}}
  3532. switch(token){case 'id':
  3533. case 'imaginary':
  3534. case 'int':
  3535. case 'float':
  3536. case 'str':
  3537. case 'bytes':
  3538. case '[':
  3539. case '(':
  3540. case '{':
  3541. case '.':
  3542. case 'not':
  3543. case 'lamdba':
  3544. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])
  3545. case 'op':
  3546. switch(arguments[2]){case '+':
  3547. case '-':
  3548. case '~':
  3549. return new $UnaryCtx(C,arguments[2])}
  3550. default:
  3551. if(C.tree[C.tree.length-1].type=='abstract_expr'){$_SyntaxError(C,'token '+token+' after '+C)}}
  3552. var t0=C.tree[0],t1=C.tree[1]
  3553. if(t0.tree && t1.tree){t0=t0.tree[0]
  3554. t1=t1.tree[0]}
  3555. return $transition(C.parent,token)
  3556. case 'packed':
  3557. if(token==='id'){new $IdCtx(C,arguments[2])
  3558. C.parent.expect=','
  3559. return C.parent}
  3560. $_SyntaxError(C,'token '+token+' after '+C)
  3561. case 'pass':
  3562. if(token==='eol')return C.parent
  3563. $_SyntaxError(C,'token '+token+' after '+C)
  3564. case 'raise':
  3565. switch(token){case 'id':
  3566. if(C.tree.length===0){return new $IdCtx(new $ExprCtx(C,'exc',false),arguments[2])}
  3567. break
  3568. case 'from':
  3569. if(C.tree.length>0){return new $AbstractExprCtx(C,false)}
  3570. break
  3571. case 'eol':
  3572. return $transition(C.parent,token)}
  3573. $_SyntaxError(C,'token '+token+' after '+C)
  3574. case 'return':
  3575. return $transition(C.parent,token)
  3576. case 'single_kw':
  3577. if(token===':')return $BodyCtx(C)
  3578. $_SyntaxError(C,'token '+token+' after '+C)
  3579. case 'star_arg':
  3580. switch(token){case 'id':
  3581. if(C.parent.type=="target_list"){C.tree.push(arguments[2])
  3582. C.parent.expect=','
  3583. console.log('return parent',C.parent)
  3584. return C.parent}
  3585. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])
  3586. case 'imaginary':
  3587. case 'int':
  3588. case 'float':
  3589. case 'str':
  3590. case 'bytes':
  3591. case '[':
  3592. case '(':
  3593. case '{':
  3594. case 'not':
  3595. case 'lamdba':
  3596. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])
  3597. case ',':
  3598. return $transition(C.parent,token)
  3599. case ')':
  3600. return $transition(C.parent,token)
  3601. case ':':
  3602. if(C.parent.parent.type==='lambda'){return $transition(C.parent.parent,token)}}
  3603. $_SyntaxError(C,'token '+token+' after '+C)
  3604. case 'str':
  3605. switch(token){case '[':
  3606. return new $AbstractExprCtx(new $SubCtx(C.parent),false)
  3607. case '(':
  3608. C.parent.tree[0]=C
  3609. return new $CallCtx(C.parent)
  3610. case 'str':
  3611. C.tree.push(arguments[2])
  3612. return C}
  3613. return $transition(C.parent,token,arguments[2])
  3614. case 'sub':
  3615. switch(token){case 'id':
  3616. case 'imaginary':
  3617. case 'int':
  3618. case 'float':
  3619. case 'str':
  3620. case 'bytes':
  3621. case '[':
  3622. case '(':
  3623. case '{':
  3624. case '.':
  3625. case 'not':
  3626. case 'lamdba':
  3627. var expr=new $AbstractExprCtx(C,false)
  3628. return $transition(expr,token,arguments[2])
  3629. case ']':
  3630. return C.parent
  3631. case ':':
  3632. if(C.tree.length==0){new $AbstractExprCtx(C,false)}
  3633. return new $AbstractExprCtx(C,false)}
  3634. $_SyntaxError(C,'token '+token+' after '+C)
  3635. case 'target_list':
  3636. switch(token){case 'id':
  3637. if(C.expect==='id'){C.expect=','
  3638. return new $IdCtx(new $ExprCtx(C,'target',false),arguments[2])}
  3639. case 'op':
  3640. if(C.expect=='id' && arguments[2]=='*'){
  3641. return new $PackedCtx(C)}
  3642. case '(':
  3643. case '[':
  3644. if(C.expect==='id'){C.expect=','
  3645. return new $TargetListCtx(C)}
  3646. case ')':
  3647. case ']':
  3648. if(C.expect===',')return C.parent
  3649. case ',':
  3650. if(C.expect==','){C.expect='id'
  3651. return C}}
  3652. if(C.expect===','){return $transition(C.parent,token,arguments[2])}else if(token=='in'){
  3653. return $transition(C.parent,token,arguments[2])}
  3654. $_SyntaxError(C,'token '+token+' after '+C)
  3655. case 'ternary':
  3656. if(token==='else'){C.in_else=true
  3657. return new $AbstractExprCtx(C,false)}
  3658. return $transition(C.parent,token,arguments[2])
  3659. case 'try':
  3660. if(token===':')return $BodyCtx(C)
  3661. $_SyntaxError(C,'token '+token+' after '+C)
  3662. case 'unary':
  3663. switch(token){case 'int':
  3664. case 'float':
  3665. case 'imaginary':
  3666. console.log(token,arguments[2],'after',C)
  3667. var expr=C.parent
  3668. C.parent.parent.tree.pop()
  3669. var value=arguments[2]
  3670. if(C.op==='-'){value="-"+value}
  3671. else if(C.op==='~'){value=~value}
  3672. return $transition(C.parent.parent,token,value)
  3673. case 'id':
  3674. C.parent.parent.tree.pop()
  3675. var expr=new $ExprCtx(C.parent.parent,'call',false)
  3676. var expr1=new $ExprCtx(expr,'id',false)
  3677. new $IdCtx(expr1,arguments[2])
  3678. var repl=new $AttrCtx(expr)
  3679. if(C.op==='+'){repl.name='__pos__'}
  3680. else if(C.op==='-'){repl.name='__neg__'}
  3681. else{repl.name='__invert__'}
  3682. return expr1
  3683. case 'op':
  3684. if('+'==arguments[2]||'-'==arguments[2]){var op=arguments[2]
  3685. if(C.op===op){C.op='+'}else{C.op='-'}
  3686. return C}}
  3687. return $transition(C.parent,token,arguments[2])
  3688. case 'with':
  3689. switch(token){case 'id':
  3690. if(C.expect==='id'){C.expect='as'
  3691. return $transition(new $AbstractExprCtx(C,false),token,arguments[2])}
  3692. if(C.expect==='alias'){if(C.parenth!==undefined){C.expect=','}
  3693. else{C.expect=':'}
  3694. C.set_alias(arguments[2])
  3695. return C}
  3696. break
  3697. case 'as':
  3698. return new $AbstractExprCtx(new $AliasCtx(C))
  3699. case ':':
  3700. switch(C.expect){case 'id':
  3701. case 'as':
  3702. case ':':
  3703. return $BodyCtx(C)}
  3704. break
  3705. case '(':
  3706. if(C.expect==='id' && C.tree.length===0){C.parenth=true
  3707. return C}else if(C.expect=='alias'){C.expect=':'
  3708. return new $TargetListCtx(C,false)}
  3709. break
  3710. case ')':
  3711. if(C.expect==',' ||C.expect=='as'){C.expect=':'
  3712. return C}
  3713. break
  3714. case ',':
  3715. if(C.parenth!==undefined && C.has_alias===undefined &&
  3716. (C.expect==',' ||C.expect=='as')){C.expect='id'
  3717. return C}else if(C.expect=='as'){C.expect='id'
  3718. return C}else if(C.expect==':'){C.expect='id'
  3719. return C}
  3720. break}
  3721. $_SyntaxError(C,'token '+token+' after '+C.expect)
  3722. case 'yield':
  3723. if(token=='from'){
  3724. if(C.tree[0].type!='abstract_expr'){
  3725. $_SyntaxError(C,"'from' must follow 'yield'")}
  3726. C.from=true
  3727. C.tree=[]
  3728. return new $AbstractExprCtx(C,true)}
  3729. return $transition(C.parent,token)}}
  3730. $B.forbidden=['case','catch','constructor','Date','delete','default','enum','eval','extends','Error','history','function','location','Math','new','null','Number','RegExp','super','this','throw','var','toString']
  3731. var s_escaped='abfnrtvxuU"'+"'"+'\\',is_escaped={}
  3732. for(var i=0;i<s_escaped.length;i++){is_escaped[s_escaped.charAt(i)]=true}
  3733. function $tokenize(src,module,locals_id,parent_block_id,line_info){var br_close={")":"(","]":"[","}":"{"}
  3734. var br_stack=""
  3735. var br_pos=[]
  3736. var kwdict=["class","return","break","for","lambda","try","finally","raise","def","from","nonlocal","while","del","global","with","as","elif","else","if","yield","assert","import","except","raise","in",
  3737. "pass","with","continue","__debugger__","IMPRT"
  3738. ]
  3739. var unsupported=[]
  3740. var $indented=['class','def','for','condition','single_kw','try','except','with']
  3741. var int_pattern=new RegExp("^\\d+(j|J)?"),float_pattern1=new RegExp("^\\d+\\.\\d*([eE][+-]?\\d+)?(j|J)?"),float_pattern2=new RegExp("^\\d+([eE][+-]?\\d+)(j|J)?"),hex_pattern=new RegExp("^0[xX]([0-9a-fA-F]+)"),octal_pattern=new RegExp("^0[oO]([0-7]+)"),binary_pattern=new RegExp("^0[bB]([01]+)")
  3742. var C=null
  3743. var root=new $Node('module')
  3744. root.module=module
  3745. root.id=locals_id
  3746. $B.modules[root.id]=root
  3747. if(locals_id==parent_block_id){root.parent_block=$B.modules[parent_block_id].parent_block ||$B.modules['__builtins__']}else{root.parent_block=$B.modules[parent_block_id]||$B.modules['__builtins__']}
  3748. root.line_info=line_info
  3749. root.indent=-1
  3750. if(locals_id!==module){$B.bound[locals_id]={}}
  3751. var new_node=new $Node(),current=root,name="",_type=null,pos=0,indent=null,string_modifier=false
  3752. if(typeof src=="object"){root.is_comp=src.is_comp
  3753. src=src.src}
  3754. var lnum=1
  3755. while(pos<src.length){var car=src.charAt(pos)
  3756. if(indent===null){var indent=0
  3757. while(pos<src.length){var _s=src.charAt(pos)
  3758. if(_s==" "){indent++;pos++}
  3759. else if(_s=="\t"){
  3760. indent++;pos++
  3761. if(indent%8>0)indent+=8-indent%8}else{break}}
  3762. var _s=src.charAt(pos)
  3763. if(_s=='\n'){pos++;lnum++;indent=null;continue}
  3764. else if(_s==='#'){
  3765. var offset=src.substr(pos).search(/\n/)
  3766. if(offset===-1){break}
  3767. pos+=offset+1;lnum++;indent=null;continue}
  3768. new_node.indent=indent
  3769. new_node.line_num=lnum
  3770. new_node.module=module
  3771. if(indent>current.indent){
  3772. if(C!==null){if($indented.indexOf(C.tree[0].type)==-1){$pos=pos
  3773. $_SyntaxError(C,'unexpected indent',pos)}}
  3774. current.add(new_node)}else if(indent<=current.indent &&
  3775. $indented.indexOf(C.tree[0].type)>-1 &&
  3776. C.tree.length<2){$pos=pos
  3777. $_SyntaxError(C,'expected an indented block',pos)}else{
  3778. while(indent!==current.indent){current=current.parent
  3779. if(current===undefined ||indent>current.indent){$pos=pos
  3780. $_SyntaxError(C,'unexpected indent',pos)}}
  3781. current.parent.add(new_node)}
  3782. current=new_node
  3783. C=new $NodeCtx(new_node)
  3784. continue}
  3785. if(car=="#"){var end=src.substr(pos+1).search('\n')
  3786. if(end==-1){end=src.length-1}
  3787. pos +=end+1;continue}
  3788. if(car=='"' ||car=="'"){var raw=C.type=='str' && C.raw,bytes=false ,end=null;
  3789. if(string_modifier){switch(string_modifier){case 'r':
  3790. raw=true
  3791. break
  3792. case 'u':
  3793. break
  3794. case 'b':
  3795. bytes=true
  3796. break
  3797. case 'rb':
  3798. case 'br':
  3799. bytes=true;raw=true
  3800. break}
  3801. string_modifier=false}
  3802. if(src.substr(pos,3)==car+car+car){_type="triple_string";end=pos+3}
  3803. else{_type="string";end=pos+1}
  3804. var escaped=false
  3805. var zone=car
  3806. var found=false
  3807. while(end<src.length){if(escaped){zone+=src.charAt(end)
  3808. if(raw && src.charAt(end)=='\\'){zone+='\\'}
  3809. escaped=false;end+=1}else if(src.charAt(end)=="\\"){if(raw){if(end<src.length-1 && src.charAt(end+1)==car){zone +='\\\\'+car
  3810. end +=2}else{zone +='\\\\'
  3811. end++}
  3812. escaped=true}else{
  3813. if(src.charAt(end+1)=='\n'){
  3814. end +=2
  3815. lnum++}else{
  3816. if(end < src.length-1 &&
  3817. is_escaped[src.charAt(end+1)]==undefined){zone +='\\'}
  3818. zone+='\\'
  3819. escaped=true;end+=1}}}else if(src.charAt(end)=='\n' && _type!='triple_string'){
  3820. $pos=end
  3821. $_SyntaxError(C,["EOL while scanning string literal"])}else if(src.charAt(end)==car){if(_type=="triple_string" && src.substr(end,3)!=car+car+car){zone +=src.charAt(end)
  3822. end++}else{
  3823. found=true
  3824. $pos=pos
  3825. var $string=zone.substr(1),string=''
  3826. for(var i=0;i<$string.length;i++){var $car=$string.charAt(i)
  3827. if($car==car &&
  3828. (raw ||(i==0 ||$string.charAt(i-1)!=='\\'))){string +='\\'}
  3829. string +=$car}
  3830. if(bytes){C=$transition(C,'str','b'+car+string+car)}else{C=$transition(C,'str',car+string+car)}
  3831. C.raw=raw;
  3832. pos=end+1
  3833. if(_type=="triple_string"){pos=end+3}
  3834. break}}else{
  3835. zone +=src.charAt(end)
  3836. if(src.charAt(end)=='\n'){lnum++}
  3837. end++}}
  3838. if(!found){if(_type==="triple_string"){$_SyntaxError(C,"Triple string end not found")}else{$_SyntaxError(C,"String end not found")}}
  3839. continue}
  3840. if(name=="" && car!='$'){
  3841. if($B.regexIdentifier.exec(car)){name=car
  3842. var p0=pos
  3843. pos++
  3844. while(pos<src.length && $B.regexIdentifier.exec(src.substring(p0,pos+1))){name+=src.charAt(pos)
  3845. pos++}}
  3846. if(name){
  3847. if(kwdict.indexOf(name)>-1){$pos=pos-name.length
  3848. if(unsupported.indexOf(name)>-1){$_SyntaxError(C,"Unsupported Python keyword '"+name+"'")}
  3849. C=$transition(C,name)}else if($operators[name]!==undefined
  3850. && $B.forbidden.indexOf(name)==-1){
  3851. if(name=='is'){
  3852. var re=/^\s+not\s+/
  3853. var res=re.exec(src.substr(pos))
  3854. if(res!==null){pos +=res[0].length
  3855. $pos=pos-name.length
  3856. C=$transition(C,'op','is_not')}else{$pos=pos-name.length
  3857. C=$transition(C,'op',name)}}else if(name=='not'){
  3858. var re=/^\s+in\s+/
  3859. var res=re.exec(src.substr(pos))
  3860. if(res!==null){pos +=res[0].length
  3861. $pos=pos-name.length
  3862. C=$transition(C,'op','not_in')}else{$pos=pos-name.length
  3863. C=$transition(C,name)}}else{$pos=pos-name.length
  3864. C=$transition(C,'op',name)}}else if((src.charAt(pos)=='"'||src.charAt(pos)=="'")
  3865. &&['r','b','u','rb','br'].indexOf(name.toLowerCase())!==-1){string_modifier=name.toLowerCase()
  3866. name=""
  3867. continue}else{
  3868. if($B.forbidden.indexOf(name)>-1){name='$$'+name}
  3869. $pos=pos-name.length
  3870. C=$transition(C,'id',name)}
  3871. name=""
  3872. continue}}
  3873. switch(car){case ' ':
  3874. case '\t':
  3875. pos++
  3876. break
  3877. case '.':
  3878. if(pos<src.length-1 && /^\d$/.test(src.charAt(pos+1))){
  3879. var j=pos+1
  3880. while(j<src.length && src.charAt(j).search(/\d|e|E/)>-1){j++}
  3881. C=$transition(C,'float','0'+src.substr(pos,j-pos))
  3882. pos=j
  3883. break}
  3884. $pos=pos
  3885. C=$transition(C,'.')
  3886. pos++
  3887. break
  3888. case '0':
  3889. var res=hex_pattern.exec(src.substr(pos))
  3890. if(res){C=$transition(C,'int',[16,res[1]])
  3891. pos +=res[0].length
  3892. break}
  3893. var res=octal_pattern.exec(src.substr(pos))
  3894. if(res){C=$transition(C,'int',[8,res[1]])
  3895. pos +=res[0].length
  3896. break}
  3897. var res=binary_pattern.exec(src.substr(pos))
  3898. if(res){C=$transition(C,'int',[2,res[1]])
  3899. pos +=res[0].length
  3900. break}
  3901. if(src.charAt(pos+1).search(/\d/)>-1){
  3902. if(parseInt(src.substr(pos))===0){res=int_pattern.exec(src.substr(pos))
  3903. $pos=pos
  3904. C=$transition(C,'int',[10,res[0]])
  3905. pos +=res[0].length
  3906. break}else{$_SyntaxError(C,('invalid literal starting with 0'))}}
  3907. case '0':
  3908. case '1':
  3909. case '2':
  3910. case '3':
  3911. case '4':
  3912. case '5':
  3913. case '6':
  3914. case '7':
  3915. case '8':
  3916. case '9':
  3917. var res=float_pattern1.exec(src.substr(pos))
  3918. if(res){$pos=pos
  3919. if(res[2]!==undefined){C=$transition(C,'imaginary',res[0].substr(0,res[0].length-1))}else{C=$transition(C,'float',res[0])}}else{res=float_pattern2.exec(src.substr(pos))
  3920. if(res){$pos=pos
  3921. if(res[2]!==undefined){C=$transition(C,'imaginary',res[0].substr(0,res[0].length-1))}else{C=$transition(C,'float',res[0])}}else{res=int_pattern.exec(src.substr(pos))
  3922. $pos=pos
  3923. if(res[1]!==undefined){C=$transition(C,'imaginary',res[0].substr(0,res[0].length-1))}else{C=$transition(C,'int',[10,res[0]])}}}
  3924. pos +=res[0].length
  3925. break
  3926. case '\n':
  3927. lnum++
  3928. if(br_stack.length>0){
  3929. pos++;}else{
  3930. if(current.C.tree.length>0){$pos=pos
  3931. C=$transition(C,'eol')
  3932. indent=null
  3933. new_node=new $Node()}else{new_node.line_num=lnum}
  3934. pos++}
  3935. break
  3936. case '(':
  3937. case '[':
  3938. case '{':
  3939. br_stack +=car
  3940. br_pos[br_stack.length-1]=[C,pos]
  3941. $pos=pos
  3942. C=$transition(C,car)
  3943. pos++
  3944. break
  3945. case ')':
  3946. case ']':
  3947. case '}':
  3948. if(br_stack==""){$_SyntaxError(C,"Unexpected closing bracket")}else if(br_close[car]!=br_stack.charAt(br_stack.length-1)){$_SyntaxError(C,"Unbalanced bracket")}else{
  3949. br_stack=br_stack.substr(0,br_stack.length-1)
  3950. $pos=pos
  3951. C=$transition(C,car)
  3952. pos++}
  3953. break
  3954. case '=':
  3955. if(src.charAt(pos+1)!="="){$pos=pos
  3956. C=$transition(C,'=')
  3957. pos++;}else{
  3958. $pos=pos
  3959. C=$transition(C,'op','==')
  3960. pos+=2}
  3961. break
  3962. case ',':
  3963. case ':':
  3964. $pos=pos
  3965. C=$transition(C,car)
  3966. pos++
  3967. break
  3968. case ';':
  3969. $transition(C,'eol')
  3970. if(current.C.tree.length===0){
  3971. $pos=pos
  3972. $_SyntaxError(C,'invalid syntax')}
  3973. var pos1=pos+1
  3974. var ends_line=false
  3975. while(pos1<src.length){var _s=src.charAt(pos1)
  3976. if(_s=='\n' ||_s=='#'){ends_line=true;break}
  3977. else if(_s==' '){pos1++}
  3978. else{break}}
  3979. if(ends_line){pos++;break}
  3980. new_node=new $Node()
  3981. new_node.indent=$get_node(C).indent
  3982. new_node.line_num=lnum
  3983. new_node.module=module
  3984. $get_node(C).parent.add(new_node)
  3985. current=new_node
  3986. C=new $NodeCtx(new_node)
  3987. pos++
  3988. break
  3989. case '/':
  3990. case '%':
  3991. case '&':
  3992. case '>':
  3993. case '<':
  3994. case '-':
  3995. case '+':
  3996. case '*':
  3997. case '/':
  3998. case '^':
  3999. case '=':
  4000. case '|':
  4001. case '~':
  4002. case '!':
  4003. if(car=='-' && src.charAt(pos+1)=='>'){C=$transition(C,'annotation')
  4004. pos +=2
  4005. continue}
  4006. var op_match=""
  4007. for(var op_sign in $operators){if(op_sign==src.substr(pos,op_sign.length)
  4008. && op_sign.length>op_match.length){op_match=op_sign}}
  4009. $pos=pos
  4010. if(op_match.length>0){if(op_match in $augmented_assigns){C=$transition(C,'augm_assign',op_match)}else{C=$transition(C,'op',op_match)}
  4011. pos +=op_match.length}else{$_SyntaxError(C,'invalid character: '+car)}
  4012. break
  4013. case '\\':
  4014. if(src.charAt(pos+1)=='\n'){lnum++
  4015. pos+=2
  4016. break}
  4017. case '@':
  4018. $pos=pos
  4019. C=$transition(C,car)
  4020. pos++
  4021. break
  4022. default:
  4023. $pos=pos;$_SyntaxError(C,'unknown token ['+car+']')}}
  4024. if(br_stack.length!=0){var br_err=br_pos[0]
  4025. $pos=br_err[1]
  4026. $_SyntaxError(br_err[0],["Unbalanced bracket "+br_stack.charAt(br_stack.length-1)])}
  4027. if(C!==null && $indented.indexOf(C.tree[0].type)>-1){$pos=pos-1
  4028. $_SyntaxError(C,'expected an indented block',pos)}
  4029. return root}
  4030. $B.py2js=function(src,module,locals_id,parent_block_id,line_info){
  4031. var t0=new Date().getTime(),is_comp=false
  4032. if(typeof src=='object'){is_comp=src.is_comp
  4033. src=src.src}
  4034. src=src.replace(/\r\n/gm,'\n')
  4035. if(src.charAt(src.length-1)!="\n"){src+='\n'}
  4036. var locals_is_module=Array.isArray(locals_id)
  4037. if(locals_is_module){locals_id=locals_id[0]}
  4038. var internal=locals_id.charAt(0)=='$'
  4039. var local_ns='$locals_'+locals_id.replace(/\./g,'_')
  4040. var global_ns='$locals_'+module.replace(/\./g,'_')
  4041. $B.bound[module]=$B.bound[module]||{}
  4042. $B.bound[module]['__doc__']=true
  4043. $B.bound[module]['__name__']=true
  4044. $B.bound[module]['__file__']=true
  4045. $B.$py_src[locals_id]=$B.$py_src[locals_id]||src
  4046. var root=$tokenize({src:src,is_comp:is_comp},module,locals_id,parent_block_id,line_info)
  4047. root.is_comp=is_comp
  4048. root.transform()
  4049. var js=['var $B = __BRYTHON__;\n'],pos=1
  4050. js[pos++]='eval(__BRYTHON__.InjectBuiltins());\n\n'
  4051. js[pos]='var '
  4052. if(locals_is_module){js[pos]+=local_ns+'=$locals_'+module+', '}else if(!internal){js[pos]+=local_ns+'=$B.imported["'+locals_id+'"] || {}, '}
  4053. js[pos]+='$locals='+local_ns+';'
  4054. var offset=0
  4055. root.insert(0,$NodeJS(js.join('')))
  4056. offset++
  4057. var ds_node=new $Node()
  4058. new $NodeJSCtx(ds_node,local_ns+'["__doc__"]='+(root.doc_string||'None')+';')
  4059. root.insert(offset++,ds_node)
  4060. var name_node=new $Node()
  4061. new $NodeJSCtx(name_node,local_ns+'["__name__"]='+local_ns+'["__name__"] || "'+locals_id+'";')
  4062. root.insert(offset++,name_node)
  4063. var file_node=new $Node()
  4064. new $NodeJSCtx(file_node,local_ns+'["__file__"]="'+$B.$py_module_path[module]+'";None;\n')
  4065. root.insert(offset++,file_node)
  4066. if(line_info !==undefined){var line_node=new $Node()
  4067. new $NodeJSCtx(line_node,local_ns+'.$line="'+line_info+'";None;\n')
  4068. root.insert(offset++,line_node)}
  4069. var enter_frame_pos=offset,js='var $top_frame = ["'+locals_id.replace(/\./g,'_')+'", '+
  4070. local_ns+', "'+module.replace(/\./g,'_')+'", '+global_ns+
  4071. ', "a"]; $B.frames_stack.push($top_frame); var $stack_length = '+
  4072. '$B.frames_stack.length;'
  4073. root.insert(offset++,$NodeJS(js))
  4074. var try_node=new $NodeJS('try'),children=root.children.slice(enter_frame_pos+1,root.children.length)
  4075. root.insert(enter_frame_pos+1,try_node)
  4076. if(children.length==0){children=[$NodeJS('')]}
  4077. for(var i=0;i<children.length;i++){try_node.add(children[i])}
  4078. try_node.add($NodeJS('$B.leave_frame("'+locals_id+'")'))
  4079. root.children.splice(enter_frame_pos+2,root.children.length)
  4080. var catch_node=new $NodeJS('catch(err)')
  4081. catch_node.add($NodeJS('$B.leave_frame("'+locals_id+'")'))
  4082. catch_node.add($NodeJS('throw err'))
  4083. root.add(catch_node)
  4084. if($B.profile>0){$add_profile(root,null,module)}
  4085. if($B.debug>0){$add_line_num(root,null,module)}
  4086. var t1=new Date().getTime()
  4087. if($B.debug>=2){if(module==locals_id){console.log('module '+module+' translated in '+(t1 - t0)+' ms')}}
  4088. $B.compile_time +=t1-t0
  4089. return root}
  4090. function load_scripts(scripts,run_script,onerror){
  4091. if(run_script===undefined){run_script=$B._run_script;}
  4092. function callback(ev,script){var ok=false,skip=false;
  4093. if(ev !==null){var req=ev.target
  4094. if(req.readyState==4){if(req.status==200){ok=true;
  4095. var script={name:req.module_name,url:req.responseURL,src:req.responseText};}}
  4096. else{
  4097. skip=true;}}
  4098. else{
  4099. ok=true;}
  4100. if(skip){return;}
  4101. if(ok){try{
  4102. run_script(script)}
  4103. catch(e){if(onerror===undefined){throw e;}
  4104. else{onerror(e);}}
  4105. if(scripts.length>0){load_scripts(scripts)}}else{try{
  4106. throw Error("cannot load script "+
  4107. req.module_name+' at '+req.responseURL+
  4108. ': error '+req.status)}
  4109. catch(e){if(onerror===undefined){throw e;}
  4110. else{onerror(e);}}}}
  4111. var noajax=true
  4112. while(scripts.length>0 && noajax){var script=scripts.shift()
  4113. if(script['src']===undefined){
  4114. noajax=false;
  4115. var req=new XMLHttpRequest()
  4116. req.onreadystatechange=callback
  4117. req.module_name=script.name
  4118. req.open('GET',script.url,true)
  4119. req.send()}else{
  4120. callback(null,script)
  4121. load_scripts(scripts)}}}
  4122. $B._load_scripts=load_scripts;
  4123. function run_script(script){
  4124. $B.$py_module_path[script.name]=script.url
  4125. var root,js
  4126. try{
  4127. root=$B.py2js(script.src,script.name,script.name,'__builtins__')
  4128. js=root.to_js()
  4129. if($B.debug>1){console.log(js)}
  4130. eval(js)}catch($err){if($B.debug>1){console.log($err)
  4131. for(var attr in $err){console.log(attr+' : ',$err[attr])}}
  4132. if($err.$py_error===undefined){console.log('Javascript error',$err)
  4133. $err=_b_.RuntimeError($err+'')}
  4134. var name=$err.__name__
  4135. var $trace=_b_.getattr($err,'info')+'\n'+name+': '
  4136. if(name=='SyntaxError' ||name=='IndentationError'){$trace +=$err.args[0]}else{$trace +=$err.args}
  4137. try{_b_.getattr($B.stderr,'write')($trace)}catch(print_exc_err){console.log($trace)}
  4138. throw $err}finally{root=null
  4139. js=null
  4140. $B.clear_ns(script.name)}}
  4141. $B._run_script=run_script;
  4142. function brython(options){
  4143. if($B.meta_path===undefined){$B.meta_path=[]}
  4144. $B.$options={}
  4145. if(options===undefined)options={'debug':0}
  4146. if(typeof options==='number')options={'debug':options}
  4147. if(options.debug===undefined){options.debug=0 }
  4148. $B.debug=options.debug
  4149. _b_.__debug__=$B.debug>0
  4150. $B.compile_time=0
  4151. if(options.profile===undefined){options.profile=0}
  4152. $B.profile=options.profile
  4153. if(options.static_stdlib_import===undefined){options.static_stdlib_import=true}
  4154. $B.static_stdlib_import=options.static_stdlib_import
  4155. if(options.open !==undefined){_b_.open=options.open;
  4156. console.log("DeprecationWarning: \'open\' option of \'brython\' "+
  4157. "function will be deprecated in future versions of Brython.");}
  4158. $B.$options=options
  4159. var meta_path=[]
  4160. var path_hooks=[]
  4161. if($B.use_VFS){meta_path.push($B.$meta_path[0])
  4162. path_hooks.push($B.$path_hooks[0])}
  4163. if(options.static_stdlib_import!==false){
  4164. meta_path.push($B.$meta_path[1])
  4165. if($B.path.length>3){$B.path.shift()
  4166. $B.path.shift()}}
  4167. meta_path.push($B.$meta_path[2])
  4168. $B.meta_path=meta_path
  4169. path_hooks.push($B.$path_hooks[1])
  4170. $B.path_hooks=path_hooks
  4171. if(options.ipy_id!==undefined){var $elts=[];
  4172. for(var $i=0;$i<options.ipy_id.length;$i++){$elts.push(document.getElementById(options.ipy_id[$i]));}}else{var scripts=document.getElementsByTagName('script'),$elts=[]
  4173. for(var i=0;i<scripts.length;i++){var script=scripts[i]
  4174. if(script.type=="text/python" ||script.type=="text/python3"){$elts.push(script)}}}
  4175. var $href=$B.script_path=window.location.href,$href_elts=$href.split('/')
  4176. $href_elts.pop()
  4177. $B.curdir=$href_elts.join('/')
  4178. if(options.pythonpath!==undefined){$B.path=options.pythonpath
  4179. $B.$options.static_stdlib_import=false}
  4180. if(options.re_module !==undefined){if(options.re_module=='pyre' ||options.re_module=='jsre'){$B.$options.re=options.re}
  4181. console.log("DeprecationWarning: \'re_module\' option of \'brython\' function will be deprecated in future versions of Brython.")}
  4182. $B.scripts=[]
  4183. $B.js={}
  4184. var kk=Object.keys(window)
  4185. var path_links=document.querySelectorAll('head link[rel~=pythonpath]'),_importlib=$B.modules['_importlib'];
  4186. for(var i=0,e;e=path_links[i];++i){var href=e.href;
  4187. $B.path.push(href);
  4188. if(href.slice(-7).toLowerCase()=='.vfs.js' &&
  4189. (' ' + e.rel + ' ').indexOf(' prefetch ')!=-1){
  4190. $B.path_importer_cache[href + '/']=
  4191. $B.imported['_importlib'].VFSPathFinder(href)}
  4192. var filetype=e.hreflang;
  4193. if(filetype){if(filetype.slice(0,2)=='x-')filetype=filetype.slice(2);
  4194. _importlib.optimize_import_for_path(e.href,filetype);}}
  4195. var first_script=true,module_name;
  4196. if(options.ipy_id!==undefined){module_name='__main__';
  4197. var $src="",js,root
  4198. $B.$py_module_path[module_name]=$href;
  4199. for(var $i=0;$i<$elts.length;$i++){var $elt=$elts[$i];
  4200. $src +=($elt.innerHTML ||$elt.textContent);}
  4201. try{
  4202. root=$B.py2js($src,module_name,module_name,'__builtins__')
  4203. js=root.to_js()
  4204. if($B.debug>1)console.log(js)
  4205. eval(js)
  4206. $B.clear_ns(module_name)
  4207. root=null
  4208. js=null}catch($err){root=null
  4209. js=null
  4210. console.log($err)
  4211. if($B.debug>1){console.log($err)
  4212. for(var attr in $err){console.log(attr+' : ',$err[attr])}}
  4213. if($err.$py_error===undefined){console.log('Javascript error',$err)
  4214. $err=_b_.RuntimeError($err+'')}
  4215. var $trace=_b_.getattr($err,'info')+'\n'+$err.__name__+
  4216. ': ' +$err.args
  4217. try{_b_.getattr($B.stderr,'write')($trace)}catch(print_exc_err){console.log($trace)}
  4218. throw $err}}else{
  4219. var defined_ids={}
  4220. for(var i=0;i<$elts.length;i++){var elt=$elts[i]
  4221. if(elt.id){if(defined_ids[elt.id]){throw Error("Brython error : Found 2 scripts with the same id '"+
  4222. elt.id+"'")}else{defined_ids[elt.id]=true}}}
  4223. var scripts=[]
  4224. for(var $i=0;$i<$elts.length;$i++){var $elt=$elts[$i]
  4225. if($elt.type=="text/python"||$elt.type==="text/python3"){if($elt.id){module_name=$elt.id}
  4226. else{if(first_script){module_name='__main__';first_script=false}
  4227. else{module_name='__main__'+$B.UUID()}
  4228. while(defined_ids[module_name]!==undefined){module_name='__main__'+$B.UUID()}}
  4229. $B.scripts.push(module_name)
  4230. var $src=null
  4231. if($elt.src){
  4232. scripts.push({name:module_name,url:$elt.src})}else{
  4233. var $src=($elt.innerHTML ||$elt.textContent)
  4234. $src=$src.replace(/^\n/,'')
  4235. $B.$py_module_path[module_name]=$href
  4236. scripts.push({name: module_name,src: $src,url: $href})}}}}
  4237. if(options.ipy_id===undefined){$B._load_scripts(scripts)}}
  4238. $B.$operators=$operators
  4239. $B.$Node=$Node
  4240. $B.$NodeJSCtx=$NodeJSCtx
  4241. $B.brython=brython})(__BRYTHON__)
  4242. var brython=__BRYTHON__.brython
  4243. __BRYTHON__.$__new__=function(factory){return function(cls){
  4244. var res=factory.apply(null,[])
  4245. res.__class__=cls.$dict
  4246. var init_func=null
  4247. try{init_func=__BRYTHON__.builtins.getattr(res,'__init__')}
  4248. catch(err){}
  4249. if(init_func!==null){var args=[],pos=0
  4250. for(var i=1,_len_i=arguments.length;i < _len_i;i++){args[pos++]=arguments[i]}
  4251. init_func.apply(null,args)
  4252. res.__initialized__=true}
  4253. return res}}
  4254. __BRYTHON__.builtins.object=(function($B){var _b_=$B.builtins
  4255. var $ObjectDict={
  4256. __name__:'object',$native:true}
  4257. var reverse_func={'__lt__':'__gt__','__gt__':'__lt__','__le__': '__ge__','__ge__': '__le__'}
  4258. var $ObjectNI=function(name,op){return function(self,other){var klass=$B.get_class(other),other_comp=_b_.getattr(klass,reverse_func[name])
  4259. if(other_comp.__func__===$ObjectDict[reverse_func[name]]){throw _b_.TypeError('unorderable types: object() '+op+
  4260. ' '+ _b_.str($B.get_class(other).__name__)+'()')}else{return other_comp(other,self)}}}
  4261. var opnames=['add','sub','mul','truediv','floordiv','mod','pow','lshift','rshift','and','xor','or']
  4262. var opsigns=['+','-','*','/','//','%','**','<<','>>','&','^','|']
  4263. $ObjectDict.__delattr__=function(self,attr){_b_.getattr(self,attr)
  4264. delete self[attr];
  4265. return _b_.None}
  4266. $ObjectDict.__dir__=function(self){var objects=[self],pos=1,klass=self.__class__ ||$B.get_class(self)
  4267. objects[pos++]=klass
  4268. var mro=klass.__mro__
  4269. for(var i=0,_len_i=mro.length;i < _len_i;i++){objects[pos++]=mro[i]}
  4270. var res=[],pos=0
  4271. for(var i=0,_len_i=objects.length;i < _len_i;i++){for(var attr in objects[i]){
  4272. if(attr.charAt(0)=='$' && attr.charAt(1)!='$'){
  4273. continue}
  4274. if(!isNaN(parseInt(attr.charAt(0)))){
  4275. continue}
  4276. if(attr=='__mro__'){continue}
  4277. res[pos++]=attr}}
  4278. res=_b_.list(_b_.set(res))
  4279. _b_.list.$dict.sort(res)
  4280. return res}
  4281. $ObjectDict.__eq__=function(self,other){
  4282. var _class=$B.get_class(self)
  4283. if(_class.$native ||_class.__name__=='function'){var _class1=$B.get_class(other)
  4284. if(!_class1.$native && _class1.__name__ !='function'){return _b_.getattr(other,'__eq__')(self)}}
  4285. return self===other}
  4286. $ObjectDict.__format__=function(){var $=$B.args('__format__',2,{self:null,spec:null},['self','spec'],arguments,{},null,null)
  4287. if($.spec!==''){throw _b_.TypeError("non-empty format string passed to object.__format__")}
  4288. return _b_.getattr($.self,'__repr__')()}
  4289. $ObjectDict.__ge__=$ObjectNI('__ge__','>=')
  4290. $ObjectDict.__getattribute__=function(obj,attr){var klass=obj.__class__ ||$B.get_class(obj)
  4291. if(attr==='__class__'){return klass.$factory}
  4292. var res=obj[attr]
  4293. if(res===undefined){
  4294. function check(obj,kl,attr){if(kl.$methods){var method=kl.$methods[attr]
  4295. if(method!==undefined){return method(obj)}}
  4296. var v=kl[attr]
  4297. if(v!==undefined){return v}else if(attr=='__str__' && kl['__repr__']!==undefined){
  4298. return kl['__repr__']}}
  4299. res=check(obj,klass,attr)
  4300. if(res===undefined){var mro=klass.__mro__
  4301. for(var i=0,_len_i=mro.length;i < _len_i;i++){res=check(obj,mro[i],attr)
  4302. if(res!==undefined){break}}}}else{if(res.__set__===undefined){
  4303. return res}}
  4304. if(res!==undefined){if(res.__class__===_b_.property.$dict){return res.__get__(res,obj,klass)}
  4305. var get=res.__get__
  4306. if(get===undefined && res.__class__){var get=res.__class__.__get__
  4307. for(var i=0;i<res.__class__.__mro__.length && get===undefined;i++){get=res.__class__.__mro__[i].__get__}}
  4308. var __get__=get===undefined ? null : _b_.getattr(res,'__get__',null)
  4309. if(__get__!==null){try{return __get__.apply(null,[obj,klass])}
  4310. catch(err){console.log('error in get.apply',err)
  4311. console.log(__get__+'')
  4312. throw err}}
  4313. if(typeof res=='object'){if(__get__ &&(typeof __get__=='function')){get_func=function(x,y){return __get__.apply(x,[y,klass])}}}
  4314. if(__get__===null &&(typeof res=='function')){__get__=function(x){return x}}
  4315. if(__get__!==null){
  4316. res.__name__=attr
  4317. if(attr=='__new__'){res.$type='staticmethod'}
  4318. var res1=__get__.apply(null,[res,obj,klass])
  4319. if(typeof res1=='function'){
  4320. if(res1.__class__===$B.$factory)return res
  4321. else if(res1.__class__===$B.$MethodDict){return res}
  4322. return $B.make_method(attr,klass,res)(obj)}else{
  4323. return res1}}
  4324. return res}else{
  4325. var _ga=obj['__getattr__']
  4326. if(_ga===undefined){_ga=klass['__getattr__']
  4327. if(_ga===undefined){var mro=klass.__mro__
  4328. for(var i=0,len=mro.length;i < len;i++){_ga=mro[i]['__getattr__']
  4329. if(_ga!==undefined){break}}}}
  4330. if(_ga!==undefined){try{return _ga(obj,attr)}
  4331. catch(err){}}
  4332. if(attr.substr(0,2)=='__' && attr.substr(attr.length-2)=='__'){var attr1=attr.substr(2,attr.length-4)
  4333. var rank=opnames.indexOf(attr1)
  4334. if(rank > -1){var rop='__r'+opnames[rank]+'__'
  4335. var func=function(){try{
  4336. if($B.get_class(arguments[0])===klass){throw Error('')}
  4337. return _b_.getattr(arguments[0],rop)(obj)}catch(err){var msg="unsupported operand types for "+
  4338. opsigns[rank]+": '"+ klass.__name__+"' and '"+
  4339. $B.get_class(arguments[0]).__name__+"'"
  4340. throw _b_.TypeError(msg)}}
  4341. func.$infos={__name__ : klass.__name__+'.'+attr}
  4342. return func}}}}
  4343. $ObjectDict.__gt__=$ObjectNI('__gt__','>')
  4344. $ObjectDict.__hash__=function(self){var hash=self.__hashvalue__
  4345. if(hash!==undefined){return hash}
  4346. return self.__hashvalue__=$B.$py_next_hash--;}
  4347. $ObjectDict.__init__=function(){return _b_.None}
  4348. $ObjectDict.__le__=$ObjectNI('__le__','<=')
  4349. $ObjectDict.__lt__=$ObjectNI('__lt__','<')
  4350. $ObjectDict.__mro__=[]
  4351. $ObjectDict.__new__=function(cls){if(cls===undefined){throw _b_.TypeError('object.__new__(): not enough arguments')}
  4352. return{__class__ : cls.$dict}}
  4353. $ObjectDict.__ne__=function(self,other){return !_b_.getattr(self,'__eq__')(other)}
  4354. $ObjectDict.__repr__=function(self){if(self===object)return "<class 'object'>"
  4355. if(self.__class__===$B.$factory)return "<class '"+self.$dict.__name__+"'>"
  4356. if(self.__class__===$B.$type && self.__name__=='classXXX')return "<class '"+self.__name__+"'>"
  4357. if(self.__class__.__module__!==undefined){return "<"+self.__class__.__module__+"."+self.__class__.__name__+" object>"}else{return "<"+self.__class__.__name__+" object>"}}
  4358. $ObjectDict.__setattr__=function(self,attr,val){if(val===undefined){
  4359. throw _b_.TypeError("can't set attributes of built-in/extension type 'object'")}else if(self.__class__===$ObjectDict){
  4360. if($ObjectDict[attr]===undefined){throw _b_.AttributeError("'object' object has no attribute '"+attr+"'")}else{throw _b_.AttributeError("'object' object attribute '"+attr+"' is read-only")}}
  4361. self[attr]=val
  4362. return _b_.None}
  4363. $ObjectDict.__setattr__.__str__=function(){return 'method object.setattr'}
  4364. $ObjectDict.__str__=$ObjectDict.__repr__
  4365. $ObjectDict.__subclasshook__=function(){return _b_.NotImplemented}
  4366. function object(){return{__class__:$ObjectDict}}
  4367. object.$dict=$ObjectDict
  4368. $ObjectDict.$factory=object
  4369. object.__repr__=object.__str__=function(){return "<class 'object'>"}
  4370. $B.make_class=function(class_obj){
  4371. function A(){var res={__class__:A.$dict}
  4372. if(class_obj.init){class_obj.init.apply(null,[res].concat(Array.prototype.slice.call(arguments)))}
  4373. return res}
  4374. A.__class__=$B.$factory
  4375. A.$dict={__class__: $B.type,__name__: class_obj.name}
  4376. A.$dict.__mro__=[object.$dict]
  4377. return A}
  4378. return object})(__BRYTHON__)
  4379. ;(function($B){var _b_=$B.builtins
  4380. $B.$class_constructor=function(class_name,class_obj,parents,parents_names,kwargs){var cl_dict=_b_.dict(),bases=null
  4381. for(var attr in class_obj){cl_dict.$string_dict[attr]=class_obj[attr]}
  4382. if(parents!==undefined){for(var i=0;i<parents.length;i++){if(parents[i]===undefined){
  4383. $B.line_info=class_obj.$def_line
  4384. throw _b_.NameError("name '"+parents_names[i]+"' is not defined")}}}
  4385. bases=parents
  4386. var metaclass=_b_.type
  4387. for(var i=0;i<kwargs.length;i++){var key=kwargs[i][0],val=kwargs[i][1]
  4388. if(key=='metaclass'){metaclass=val}}
  4389. var class_dict={__name__ : class_name.replace('$$',''),__bases__ : bases,__dict__ : cl_dict}
  4390. var items=$B.$dict_items(cl_dict);
  4391. for(var i=0;i<items.length;i++){class_dict[items[i][0]]=items[i][1]}
  4392. class_dict.__mro__=make_mro(bases,cl_dict)
  4393. var is_instanciable=true,non_abstract_methods={},abstract_methods={},mro=[class_dict].concat(class_dict.__mro__)
  4394. for(var i=0;i<mro.length;i++){var kdict=mro[i]
  4395. for(var attr in kdict){if(non_abstract_methods[attr]){continue}
  4396. var v=kdict[attr]
  4397. if(typeof v=='function' && v.__class__!==$B.$factory){if(v.__isabstractmethod__===true){is_instanciable=false
  4398. abstract_methods[attr]=true}else{non_abstract_methods[attr]=true}}}}
  4399. for(var i=0;i<mro.length;i++){var _slots=mro[i].__slots__
  4400. if(_slots!==undefined){_slots=_b_.list(_slots)
  4401. for(var j=0;j<_slots.length;j++){cl_dict.$slots=cl_dict.$slots ||{}
  4402. cl_dict.$slots[_slots[j]]=class_dict.__mro__[i]}}}
  4403. for(var i=1;i<mro.length;i++){if(mro[i].__class__ !==$B.$type){metaclass=mro[i].__class__.$factory}}
  4404. class_dict.__class__=metaclass.$dict
  4405. var meta_new=$B.$type.__getattribute__(metaclass.$dict,'__new__')
  4406. if(meta_new.__func__===$B.$type.__new__){var factory=_b_.type.$dict.__new__(_b_.type,class_name,bases,cl_dict)}else{var factory=meta_new(metaclass,class_name,bases,cl_dict)}
  4407. class_dict.$factory=factory
  4408. for(var i=0;i<parents.length;i++){parents[i].$dict.$subclasses=parents[i].$dict.$subclasses ||[]
  4409. parents[i].$dict.$subclasses.push(factory)}
  4410. if(metaclass===_b_.type){return factory}
  4411. for(var attr in class_dict){factory.$dict[attr]=class_dict[attr]}
  4412. factory.$dict.$factory=factory
  4413. for(var member in metaclass.$dict){if(typeof metaclass.$dict[member]=='function' && member !='__new__'){metaclass.$dict[member].$type='classmethod'}}
  4414. factory.$is_func=true
  4415. if(!is_instanciable){function nofactory(){throw _b_.TypeError("Can't instantiate abstract class interface"+
  4416. " with abstract methods "+Object.keys(abstract_methods).join(', '))}
  4417. for(var attr in factory){nofactory[attr]=factory[attr]}
  4418. return nofactory}
  4419. return factory}
  4420. $B.make_method=function(attr,klass,func){
  4421. var method
  4422. switch(func.$type){case undefined:
  4423. case 'function':
  4424. method=function(instance){var instance_method=function(){var local_args=[instance]
  4425. for(var i=0,_len_i=arguments.length;i < _len_i;i++){local_args.push(arguments[i])}
  4426. return func.apply(instance,local_args)}
  4427. instance_method.__class__=$B.$MethodDict
  4428. instance_method.$infos={__class__:klass.$factory,__func__:func,__name__:attr,__self__:instance}
  4429. return instance_method}
  4430. break
  4431. case 'instancemethod':
  4432. return func
  4433. case 'classmethod':
  4434. method=function(obj){var class_method=function(){var local_args=0;
  4435. if(obj !==undefined){local_args=[obj.__class__.$factory]}else{
  4436. local_args=[klass.$factory]}
  4437. var pos=local_args.length
  4438. for(var i=0,_len_i=arguments.length;i < _len_i;i++){local_args[pos++]=arguments[i]}
  4439. return func.apply(null,local_args)}
  4440. class_method.__class__=$B.$MethodDict
  4441. class_method.$infos={__class__:klass.$factory,__func__:func,__name__:attr}
  4442. return class_method}
  4443. break
  4444. case 'staticmethod':
  4445. method=function(){return func}
  4446. break}
  4447. return method}
  4448. function make_mro(bases,cl_dict){
  4449. var seqs=[],pos1=0
  4450. for(var i=0;i<bases.length;i++){
  4451. if(bases[i]===_b_.str)bases[i]=$B.$StringSubclassFactory
  4452. else if(bases[i]===_b_.list)bases[i]=$B.$ListSubclassFactory
  4453. var bmro=[],pos=0
  4454. if(bases[i].$dict===undefined ||
  4455. bases[i].$dict.__mro__===undefined){throw _b_.TypeError('Object passed as base class is not a class')}
  4456. bmro[pos++]=bases[i].$dict
  4457. var _tmp=bases[i].$dict.__mro__
  4458. if(_tmp[0]===bases[i].$dict){console.log('bizarre',bases[i].$dict)
  4459. _tmp.splice(0,1)}
  4460. for(var k=0;k<_tmp.length;k++){bmro[pos++]=_tmp[k]}
  4461. seqs[pos1++]=bmro}
  4462. if(bases.indexOf(_b_.object)==-1){bases=bases.concat(_b_.tuple([_b_.object]))}
  4463. for(var i=0;i<bases.length;i++)seqs[pos1++]=bases[i].$dict
  4464. var mro=[],mpos=0
  4465. while(1){var non_empty=[],pos=0
  4466. for(var i=0;i<seqs.length;i++){if(seqs[i].length>0)non_empty[pos++]=seqs[i]}
  4467. if(non_empty.length==0)break
  4468. for(var i=0;i<non_empty.length;i++){var seq=non_empty[i],candidate=seq[0],not_head=[],pos=0
  4469. for(var j=0;j<non_empty.length;j++){var s=non_empty[j]
  4470. if(s.slice(1).indexOf(candidate)>-1){not_head[pos++]=s}}
  4471. if(not_head.length>0){candidate=null}
  4472. else{break}}
  4473. if(candidate===null){throw _b_.TypeError("inconsistent hierarchy, no C3 MRO is possible")}
  4474. mro[mpos++]=candidate
  4475. for(var i=0;i<seqs.length;i++){var seq=seqs[i]
  4476. if(seq[0]===candidate){
  4477. seqs[i].shift()}}}
  4478. if(mro[mro.length-1]!==_b_.object.$dict){mro[mpos++]=_b_.object.$dict}
  4479. return mro}
  4480. _b_.type=function(obj,bases,cl_dict){if(arguments.length==1){if(obj.__class__===$B.$factory){
  4481. return obj.$dict.__class__.$factory}
  4482. return $B.get_class(obj).$factory}
  4483. return $B.$type.__new__(_b_.type,obj,bases,cl_dict)}
  4484. _b_.type.__class__=$B.$factory
  4485. $B.$type={$factory: _b_.type,__name__:'type'}
  4486. $B.$type.__class__=$B.$type
  4487. $B.$type.__mro__=[_b_.object.$dict]
  4488. _b_.type.$dict=$B.$type
  4489. $B.$type.__new__=function(cls,name,bases,cl_dict){
  4490. var class_dict={__class__ : $B.$type,__name__ : name.replace('$$',''),__bases__ : bases,__dict__ : cl_dict,$methods :{},$slots: cl_dict.$slots}
  4491. var items=$B.$dict_items(cl_dict);
  4492. for(var i=0;i<items.length;i++){var name=items[i][0],v=items[i][1]
  4493. class_dict[name]=v
  4494. if(typeof v=='function'
  4495. && v.__class__!==$B.$factory
  4496. && v.__class__!==$B.$MethodDict){class_dict.$methods[name]=$B.make_method(name,class_dict,v,v)}}
  4497. class_dict.__mro__=make_mro(bases,cl_dict)
  4498. class_dict.__class__=class_dict.__mro__[0].__class__
  4499. var factory=$instance_creator(class_dict)
  4500. factory.__class__=$B.$factory
  4501. factory.$dict=class_dict
  4502. factory.$is_func=true
  4503. factory.__eq__=function(other){return other===factory.__class__}
  4504. class_dict.$factory=factory
  4505. return factory}
  4506. $B.$factory={__class__:$B.$type,$factory:_b_.type,is_class:true}
  4507. $B.$factory.__mro__=[$B.$type,_b_.object.$dict]
  4508. _b_.type.__class__=$B.$factory
  4509. _b_.object.$dict.__class__=$B.$type
  4510. _b_.object.__class__=$B.$factory
  4511. $B.$type.__getattribute__=function(klass,attr){switch(attr){case '__call__':
  4512. return $instance_creator(klass)
  4513. case '__eq__':
  4514. return function(other){return klass.$factory===other}
  4515. case '__ne__':
  4516. return function(other){return klass.$factory!==other}
  4517. case '__class__':
  4518. return klass.__class__.$factory
  4519. case '__doc__':
  4520. return klass.__doc__ ||_b_.None
  4521. case '__setattr__':
  4522. if(klass['__setattr__']!==undefined)return klass['__setattr__']
  4523. return function(key,value){klass[key]=value}
  4524. case '__delattr__':
  4525. if(klass['__delattr__']!==undefined)return klass['__delattr__']
  4526. return function(key){delete klass[key]}}
  4527. var res=klass[attr]
  4528. if(res===undefined){
  4529. var v=klass[attr]
  4530. if(v===undefined){var mro=klass.__mro__
  4531. for(var i=0;i<mro.length;i++){var v=mro[i][attr]
  4532. if(v!==undefined){res=v
  4533. break}}}else{res=v}
  4534. if(res===undefined){
  4535. var v=klass.__class__[attr]
  4536. if(v===undefined){var cl_mro=klass.__class__.__mro__
  4537. if(cl_mro!==undefined){for(var i=0;i<cl_mro.length;i++){var v=cl_mro[i][attr]
  4538. if(v!==undefined){res=v
  4539. break}}}}else{res=v}}
  4540. if(res===undefined){
  4541. var getattr=null,v=klass.__class__.__getattr__
  4542. if(v===undefined){for(var i=0;i<cl_mro.length;i++){if(cl_mro[i].__getattr__!==undefined){getattr=cl_mro[i].__getattr__
  4543. break}}}else{getattr=v}
  4544. if(getattr!==null){if(getattr.$type=='classmethod'){return getattr(klass.$factory,attr)}
  4545. return getattr(attr)}}}
  4546. if(res===undefined && klass.$slots && klass.$slots[attr]!==undefined){return member_descriptor(klass.$slots[attr],attr)}
  4547. if(res!==undefined){
  4548. if(res.__class__===$B.$PropertyDict)return res
  4549. var get_func=res.__get__
  4550. if(get_func===undefined &&(typeof res=='function')){get_func=function(x){return x}}
  4551. if(get_func===undefined)return res
  4552. if(attr=='__new__'){res.$type='staticmethod'}
  4553. var res1=get_func.apply(null,[res,$B.builtins.None,klass])
  4554. if(res1.__class__===$B.$factory){
  4555. return res1 }
  4556. if(typeof res1=='function'){res.__name__=attr
  4557. var __self__,__func__=res1,__repr__,__str__,args
  4558. switch(res.$type){case undefined:
  4559. case 'function':
  4560. case 'instancemethod':
  4561. args=[]
  4562. __repr__=__str__=function(attr){return function(){if(klass.$native){return "<method '"+attr+"' of '"+
  4563. klass.__name__+"' objects>"}
  4564. return '<function '+klass.__name__+'.'+attr+'>' }}(attr)
  4565. break;
  4566. case 'classmethod':
  4567. args=[klass.$factory]
  4568. __self__=klass
  4569. __repr__=__str__=function(){var x='<built-in method '+klass.__name__+'.'+attr
  4570. x +=' of '+klass.__name__+'>'
  4571. return x}
  4572. break;
  4573. case 'staticmethod':
  4574. args=[]
  4575. __repr__=__str__=function(attr){return function(){return '<function '+klass.__name__+'.'+attr+'>'}}(attr)
  4576. break;}
  4577. var method=(function(initial_args,attr){return function(){
  4578. var local_args=initial_args.slice(),pos=local_args.length
  4579. for(var i=0;i < arguments.length;i++){local_args[pos++]=arguments[i]}
  4580. return res.apply(null,local_args)}})(args,attr)
  4581. method.__class__=$B.$FunctionDict
  4582. method.__eq__=function(other){return other.__func__===__func__}
  4583. for(var attr in res){method[attr]=res[attr]}
  4584. method.__func__=__func__
  4585. method.__repr__=__repr__
  4586. method.__self__=__self__
  4587. method.__str__=__str__
  4588. method.__code__={'__class__': $B.CodeDict}
  4589. method.__doc__=res.__doc__ ||''
  4590. method.im_class=klass
  4591. return method}}}
  4592. function $instance_creator(klass){
  4593. if(klass.$instanciable!==undefined){return function(){throw _b_.TypeError("Can't instantiate abstract "+
  4594. "class interface with abstract methods")}}
  4595. var new_func=klass.__new__
  4596. for(var i=0;i<klass.__mro__.length && new_func===undefined;i++){new_func=klass.__mro__[i].__new__}
  4597. var init_func=klass.__init__
  4598. for(var i=0;i<klass.__mro__.length && init_func===undefined;i++){init_func=klass.__mro__[i].__init__}
  4599. if(init_func===_b_.object.$dict.__init__ &&
  4600. new_func===_b_.object.$dict.__new__){
  4601. return function(){return{__class__: klass}}}else if(new_func===_b_.object.$dict.__new__ ||
  4602. new_func===$B.$type.__new__){
  4603. return function(){var obj={__class__:klass}
  4604. var args=[obj]
  4605. for(var i=0,len=arguments.length;i<len;i++){args.push(arguments[i])}
  4606. init_func.apply(null,args)
  4607. return obj}}else{
  4608. return function(){var args=[klass.$factory]
  4609. for(var i=0,len=arguments.length;i<len;i++){args.push(arguments[i])}
  4610. var obj=new_func.apply(null,args),args=[obj]
  4611. for(var i=0,len=arguments.length;i<len;i++){args.push(arguments[i])}
  4612. if(!obj.__initialized__){init_func.apply(null,args)}
  4613. return obj}}}
  4614. function member_descriptor(klass,attr){return{__class__:member_descriptor.$dict,klass: klass,attr: attr}}
  4615. member_descriptor.__class__=$B.$factory
  4616. member_descriptor.$dict={__class__: $B.$type,__name__: 'member_descriptor',$factory: member_descriptor,__str__: function(self){return "<member '"+self.attr+"' of '"+self.klass.__name__+
  4617. "' objects>"}}
  4618. member_descriptor.$dict.__mro__=[_b_.object.$dict]
  4619. function $MethodFactory(){}
  4620. $MethodFactory.__class__=$B.$factory
  4621. $B.$MethodDict={__class__:$B.$type,__name__:'method',$factory:$MethodFactory}
  4622. $B.$MethodDict.__eq__=function(self,other){return self.$infos !==undefined &&
  4623. other.$infos !==undefined &&
  4624. self.$infos.__func__===other.$infos.__func__ &&
  4625. self.$infos.__self__===other.$infos.__self__}
  4626. $B.$MethodDict.__ne__=function(self,other){return !$B.$MethodDict.__eq__(self,other)}
  4627. $B.$MethodDict.__getattribute__=function(self,attr){
  4628. var infos=self.$infos.__func__.$infos
  4629. if(infos && infos[attr]){if(attr=='__code__'){var res={__class__:$B.$CodeDict}
  4630. for(var attr in infos.__code__){res[attr]=infos.__code__[attr]}
  4631. return res}else{return infos[attr]}}else{return _b_.object.$dict.__getattribute__(self,attr)}}
  4632. $B.$MethodDict.__mro__=[_b_.object.$dict]
  4633. $B.$MethodDict.__repr__=$B.$MethodDict.__str__=function(self){var res='<bound method '+self.$infos.__class__.$dict.__name__+'.'
  4634. res +=self.$infos.__name__+' of '
  4635. return res+_b_.str(self.$infos.__self__)+'>'}
  4636. $MethodFactory.$dict=$B.$MethodDict
  4637. $B.$InstanceMethodDict={__class__:$B.$type,__name__:'instancemethod',__mro__:[_b_.object.$dict],$factory:$MethodFactory}})(__BRYTHON__)
  4638. ;(function($B){var _b_=$B.builtins
  4639. $B.args=function($fname,argcount,slots,var_names,$args,$dobj,extra_pos_args,extra_kw_args){
  4640. var has_kw_args=false,nb_pos=$args.length
  4641. if(nb_pos>0 && $args[nb_pos-1].$nat){has_kw_args=true
  4642. nb_pos--
  4643. var kw_args=$args[nb_pos].kw}
  4644. if(extra_pos_args){slots[extra_pos_args]=[];
  4645. slots[extra_pos_args].__class__=_b_.tuple.$dict}
  4646. if(extra_kw_args){
  4647. slots[extra_kw_args]={__class__:_b_.dict.$dict,$numeric_dict :{},$object_dict :{},$string_dict :{},$str_hash:{},length: 0}}
  4648. if(nb_pos>argcount){
  4649. if(extra_pos_args===null){
  4650. msg=$fname+"() takes "+argcount+' positional argument'+
  4651. (argcount> 1 ? '' : 's')+ ' but more were given'
  4652. throw _b_.TypeError(msg)}else{
  4653. for(var i=argcount;i<nb_pos;i++){slots[extra_pos_args].push($args[i])}
  4654. nb_pos=argcount}}
  4655. for(var i=0;i<nb_pos;i++){slots[var_names[i]]=$args[i]}
  4656. if(has_kw_args){for(var key in kw_args){var value=kw_args[key]
  4657. if(slots[key]===undefined){
  4658. if(extra_kw_args){
  4659. slots[extra_kw_args].$string_dict[key]=value}else{throw _b_.TypeError($fname+"() got an unexpected keyword argument '"+key+"'")}}else if(slots[key]!==null){
  4660. throw _b_.TypeError($fname+"() got multiple values for argument '"+key+"'")}else{
  4661. slots[key]=value}}}
  4662. var missing=[]
  4663. for(var attr in slots){if(slots[attr]===null){if($dobj[attr]!==undefined){slots[attr]=$dobj[attr]}
  4664. else{missing.push("'"+attr+"'")}}}
  4665. if(missing.length>0){if(missing.length==1){throw _b_.TypeError($fname+" missing 1 positional argument: "+missing[0])}else{var msg=$fname+" missing "+missing.length+" positional arguments: "
  4666. msg +=missing.join(' and ')
  4667. throw _b_.TypeError(msg)}}
  4668. return slots}
  4669. $B.wrong_nb_args=function(name,received,expected,positional){if(received<expected){var missing=expected-received
  4670. throw _b_.TypeError(name+'() missing '+missing+
  4671. ' positional argument'+(missing>1 ? 's' : '')+': '+
  4672. positional.slice(received))}else{throw _b_.TypeError(name+'() takes '+expected+' positional argument'+
  4673. (expected>1 ? 's' : '')+ ' but more were given')}}
  4674. $B.get_class=function(obj,from){
  4675. if(obj===null){return $B.$NoneDict}
  4676. var klass=obj.__class__
  4677. if(klass===undefined){switch(typeof obj){case 'number':
  4678. if(obj % 1===0){
  4679. obj.__class__=_b_.int.$dict
  4680. return _b_.int.$dict}
  4681. obj.__class__=_b_.float.$dict
  4682. return _b_.float.$dict
  4683. case 'string':
  4684. obj.__class__=_b_.str.$dict
  4685. return _b_.str.$dict
  4686. case 'boolean':
  4687. obj.__class__=$B.$BoolDict
  4688. return $B.$BoolDict
  4689. case 'function':
  4690. obj.__class__=$B.$FunctionDict
  4691. return $B.$FunctionDict
  4692. case 'object':
  4693. if(Array.isArray(obj)){if(Object.getPrototypeOf(obj)===Array.prototype){obj.__class__=_b_.list.$dict
  4694. return _b_.list.$dict}}else if(obj.constructor===Number)return _b_.float.$dict
  4695. break}}
  4696. return klass}
  4697. $B.$mkdict=function(glob,loc){var res={}
  4698. for(var arg in glob)res[arg]=glob[arg]
  4699. for(var arg in loc)res[arg]=loc[arg]
  4700. return res}
  4701. $B.$list_comp=function(items){
  4702. var ix=$B.UUID()
  4703. var py="x"+ix+"=[]\n",indent=0
  4704. for(var i=1,len=items.length;i < len;i++){py +=' '.repeat(indent)
  4705. var item=items[i]
  4706. item=item.replace(/\s*$/,'').replace(/\s+/g,' ')
  4707. py +=item+':\n'
  4708. indent +=4}
  4709. py +=' '.repeat(indent)
  4710. py +='x'+ix+'.append('+items[0]+')\n'
  4711. return[py,ix]}
  4712. $B.$dict_comp=function(module_name,parent_block_id,items,line_num){
  4713. var ix=$B.UUID(),res='res'+ix,py=res+"={}\n",
  4714. indent=0
  4715. for(var i=1,len=items.length;i<len;i++){py +=' '.repeat(indent)
  4716. var item=items[i].replace(/\s+$/,'').replace(/\n/g,' ')
  4717. py +=item+':\n'
  4718. indent++}
  4719. py +=' '.repeat(indent)+ res + '.update({'+items[0]+'})'
  4720. var dictcomp_name='dc'+ix,root=$B.py2js({src:py,is_comp:true},module_name,dictcomp_name,parent_block_id,line_num),js=root.to_js()
  4721. js +='\nreturn $locals["'+res+'"]\n'
  4722. js='(function(){'+js+'})()'
  4723. $B.clear_ns(dictcomp_name)
  4724. delete $B.$py_src[dictcomp_name]
  4725. return js}
  4726. $B.$gen_expr=function(module_name,parent_block_id,items,line_num){
  4727. var $ix=$B.UUID()
  4728. var py='def ge'+$ix+'():\n'
  4729. var indent=1
  4730. for(var i=1,len=items.length;i < len;i++){py +=' '.repeat(indent)
  4731. var item=items[i].replace(/\s+$/,'').replace(/\n/g,' ')
  4732. py +=item+':\n'
  4733. indent +=4}
  4734. py+=' '.repeat(indent)
  4735. py +='yield ('+items[0]+')'
  4736. var genexpr_name='ge'+$ix,root=$B.py2js({src:py,is_comp:true},module_name,genexpr_name,parent_block_id,line_num),js=root.to_js(),lines=js.split('\n')
  4737. js=lines.join('\n')
  4738. js +='\nvar $res = $locals_'+genexpr_name+'["'+genexpr_name+'"]();\n'+
  4739. '$res.is_gen_expr=true;\nreturn $res\n'
  4740. js='(function(){'+js+'})()\n'
  4741. $B.clear_ns(genexpr_name)
  4742. delete $B.$py_src[genexpr_name]
  4743. return js}
  4744. $B.clear_ns=function(name){
  4745. var len=name.length
  4746. for(var key in __BRYTHON__.modules){if(key.substr(0,len)==name){__BRYTHON__.modules[key]=null
  4747. __BRYTHON__.bound[key]=null
  4748. delete __BRYTHON__.modules[key]
  4749. delete __BRYTHON__.bound[key]}}
  4750. var alt_name=name.replace(/\./g,'_')
  4751. if(alt_name!=name){$B.clear_ns(alt_name)}}
  4752. $B.$search=function(name,global_ns){
  4753. var frame=$B.last($B.frames_stack)
  4754. if(frame[1][name]!==undefined){return frame[1][name]}
  4755. else if(frame[3][name]!==undefined){return frame[3][name]}
  4756. else if(_b_[name]!==undefined){return _b_[name]}
  4757. else{if(frame[0]==frame[2]){throw _b_.NameError("name '"+name+
  4758. "' is not defined")}
  4759. else{throw _b_.UnboundLocalError("local variable '"+name+
  4760. "' referenced before assignment")}}}
  4761. $B.$global_search=function(name){
  4762. var frame=$B.last($B.frames_stack)
  4763. if(frame[3][name]!==undefined){return frame[3][name]}
  4764. else{throw _b_.NameError("name '"+name+"' is not defined")}}
  4765. $B.$local_search=function(name){
  4766. var frame=$B.last($B.frames_stack)
  4767. if(frame[1][name]!==undefined){return frame[1][name]}
  4768. else{throw _b_.UnboundLocalError("local variable '"+name+
  4769. "' referenced before assignment")}}
  4770. $B.$check_def=function(name,value){
  4771. if(value!==undefined){return value}
  4772. throw _b_.NameError("name '"+name+"' is not defined")}
  4773. $B.$check_def_local=function(name,value){
  4774. if(value!==undefined){return value}
  4775. throw _b_.UnboundLocalError("local variable '"+name+
  4776. "' referenced before assignment")}
  4777. $B.$check_def_free=function(name,value){
  4778. if(value!==undefined){return value}
  4779. var res
  4780. for(var i=$B.frames_stack.length-1;i>=0;i--){res=$B.frames_stack[i][1][name]
  4781. if(res!==undefined){return res}
  4782. res=$B.frames_stack[i][3][name]
  4783. if(res!==undefined){return res}}
  4784. throw _b_.NameError("free variable '"+name+
  4785. "' referenced before assignment in enclosing scope")}
  4786. $B.$JS2Py=function(src){if(typeof src==='number'){if(src%1===0)return src
  4787. return _b_.float(src)}
  4788. if(src===null||src===undefined)return _b_.None
  4789. var klass=$B.get_class(src)
  4790. if(klass!==undefined){if(klass===_b_.list.$dict){for(var i=0,_len_i=src.length;i< _len_i;i++)src[i]=$B.$JS2Py(src[i])}else if(klass===$B.JSObject.$dict){src=src.js}else{return src}}
  4791. if(typeof src=="object"){if($B.$isNode(src))return $B.DOMNode(src)
  4792. if($B.$isEvent(src))return $B.$DOMEvent(src)
  4793. if($B.$isNodeList(src))return $B.DOMNode(src)
  4794. if(Array.isArray(src)&&Object.getPrototypeOf(src)===Array.prototype){var res=[],pos=0
  4795. for(var i=0,_len_i=src.length;i<_len_i;i++)res[pos++]=$B.$JS2Py(src[i])
  4796. return res}}
  4797. return $B.JSObject(src)}
  4798. $B.list_key=function(obj,key){key=$B.$GetInt(key)
  4799. if(key<0){key +=obj.length}
  4800. var res=obj[key]
  4801. if(res===undefined){throw _b_.IndexError("list index out of range")}
  4802. return res}
  4803. $B.list_slice=function(obj,start,stop){if(start===null){start=0}
  4804. else{start=$B.$GetInt(start)
  4805. if(start<0){start=Math.max(0,start+obj.length)}}
  4806. if(stop===null){return obj.slice(start)}
  4807. stop=$B.$GetInt(stop)
  4808. if(stop<0){stop=Math.max(0,stop+obj.length)}
  4809. return obj.slice(start,stop)}
  4810. $B.list_slice_step=function(obj,start,stop,step){if(step===null||step==1){return $B.list_slice(obj,start,stop)}
  4811. if(step==0){throw _b_.ValueError("slice step cannot be zero")}
  4812. step=$B.$GetInt(step)
  4813. if(start===null){start=step >=0 ? 0 : obj.length-1}
  4814. else{start=$B.$GetInt(start)
  4815. if(start<0){start=Math.min(0,start+obj.length)}}
  4816. if(stop===null){stop=step >=0 ? obj.length : -1}
  4817. else{stop=$B.$GetInt(stop)
  4818. if(stop<0){stop=Math.max(0,stop+obj.length)}}
  4819. var res=[]
  4820. if(step>0){for(var i=start;i<stop;i+=step){res.push(obj[i])}}else{for(var i=start;i>stop;i+=step){res.push(obj[i])}}
  4821. return res}
  4822. function index_error(obj){var type=typeof obj=='string' ? 'string' : 'list'
  4823. throw _b_.IndexError(type+" index out of range")}
  4824. $B.$getitem=function(obj,item){if(typeof item=='number'){if(Array.isArray(obj)||typeof obj=='string'){item=item >=0 ? item : obj.length+item
  4825. if(obj[item]!==undefined){return obj[item]}
  4826. else{index_error(obj)}}}
  4827. try{item=$B.$GetInt(item)}catch(err){}
  4828. if((Array.isArray(obj)||typeof obj=='string')
  4829. && typeof item=='number'){item=item >=0 ? item : obj.length+item
  4830. if(obj[item]!==undefined){return obj[item]}
  4831. else{index_error(obj)}}
  4832. return _b_.getattr(obj,'__getitem__')(item)}
  4833. $B.set_list_key=function(obj,key,value){try{key=$B.$GetInt(key)}
  4834. catch(err){if(_b_.isinstance(key,_b_.slice)){var s=_b_.slice.$dict.$conv_for_seq(key,obj.length)
  4835. return $B.set_list_slice_step(obj,s.start,s.stop,s.step,value)}}
  4836. if(key<0){key+=obj.length}
  4837. if(obj[key]===undefined){console.log(obj,key)
  4838. throw _b_.IndexError('list assignment index out of range')}
  4839. obj[key]=value}
  4840. $B.set_list_slice=function(obj,start,stop,value){if(start===null){start=0}
  4841. else{start=$B.$GetInt(start)
  4842. if(start<0){start=Math.max(0,start+obj.length)}}
  4843. if(stop===null){stop=obj.length}
  4844. stop=$B.$GetInt(stop)
  4845. if(stop<0){stop=Math.max(0,stop+obj.length)}
  4846. var res=_b_.list(value)
  4847. obj.splice.apply(obj,[start,stop-start].concat(res))}
  4848. $B.set_list_slice_step=function(obj,start,stop,step,value){if(step===null||step==1){return $B.set_list_slice(obj,start,stop,value)}
  4849. if(step==0){throw _b_.ValueError("slice step cannot be zero")}
  4850. step=$B.$GetInt(step)
  4851. if(start===null){start=step>0 ? 0 : obj.length-1}
  4852. else{start=$B.$GetInt(start)
  4853. if(start<0){start=Math.min(0,start+obj.length)}}
  4854. if(stop===null){stop=step>0 ? obj.length : -1}
  4855. else{stop=$B.$GetInt(stop)
  4856. if(stop<0){stop=Math.max(0,stop+obj.length)}}
  4857. var repl=_b_.list(value),j=0,test,nb=0
  4858. if(step>0){test=function(i){return i<stop}}
  4859. else{test=function(i){return i>stop}}
  4860. for(var i=start;test(i);i+=step){nb++}
  4861. if(nb!=repl.length){throw _b_.ValueError('attempt to assign sequence of size '+
  4862. repl.length+' to extended slice of size '+nb)}
  4863. for(var i=start;test(i);i+=step){obj[i]=repl[j]
  4864. j++}}
  4865. $B.$setitem=function(obj,item,value){if(Array.isArray(obj)&& typeof item=='number' && !_b_.isinstance(obj,_b_.tuple)){if(item<0){item+=obj.length}
  4866. if(obj[item]===undefined){throw _b_.IndexError("list assignment index out of range")}
  4867. obj[item]=value
  4868. return}else if(obj.__class__===_b_.dict.$dict){obj.__class__.__setitem__(obj,item,value)
  4869. return}
  4870. _b_.getattr(obj,'__setitem__')(item,value)}
  4871. $B.augm_item_add=function(obj,item,incr){if(Array.isArray(obj)&& typeof item=="number" &&
  4872. obj[item]!==undefined){if(Array.isArray(obj[item])&& Array.isArray(incr)){obj[item]=obj[item].concat(incr)
  4873. return}else if(typeof obj[item]=='string' && typeof incr=='string'){obj[item]+=incr
  4874. return}}
  4875. var ga=_b_.getattr
  4876. try{var augm_func=ga(ga(obj,'__getitem__')(item),'__iadd__')}catch(err){ga(obj,'__setitem__')(item,ga(ga(obj,'__getitem__')(item),'__add__')(incr))
  4877. return}
  4878. augm_func(incr)}
  4879. var augm_item_src=''+$B.augm_item_add
  4880. var augm_ops=[['-=','sub'],['*=','mul']]
  4881. for(var i=0,_len_i=augm_ops.length;i < _len_i;i++){var augm_code=augm_item_src.replace(/add/g,augm_ops[i][1])
  4882. augm_code=augm_code.replace(/\+=/g,augm_ops[i][0])
  4883. eval('$B.augm_item_'+augm_ops[i][1]+'='+augm_code)}
  4884. $B.extend=function(fname,arg){
  4885. for(var i=2;i<arguments.length;i++){var mapping=arguments[i]
  4886. var it=_b_.iter(mapping),getter=_b_.getattr(mapping,'__getitem__')
  4887. while(true){try{var key=_b_.next(it)
  4888. if(typeof key!=='string'){throw _b_.TypeError(fname+"() keywords must be strings")}
  4889. if(arg[key]!==undefined){throw _b_.TypeError(
  4890. fname+"() got multiple values for argument '"+key+"'")}
  4891. arg[key]=getter(key)}catch(err){if(_b_.isinstance(err,[_b_.StopIteration])){break}
  4892. throw err}}}
  4893. return arg}
  4894. $B.extend_list=function(){
  4895. var res=Array.prototype.slice.call(arguments,0,arguments.length-1),last=$B.last(arguments)
  4896. var it=_b_.iter(last)
  4897. while(true){try{res.push(_b_.next(it))}catch(err){if(_b_.isinstance(err,[_b_.StopIteration])){break}
  4898. throw err}}
  4899. return res}
  4900. $B.$test_item=function(expr){
  4901. $B.$test_result=expr
  4902. return _b_.bool(expr)}
  4903. $B.$test_expr=function(){
  4904. return $B.$test_result}
  4905. $B.$is_member=function(item,_set){
  4906. var f,_iter
  4907. try{f=_b_.getattr(_set,"__contains__")}
  4908. catch(err){}
  4909. if(f)return f(item)
  4910. try{_iter=_b_.iter(_set)}
  4911. catch(err){}
  4912. if(_iter){while(1){try{var elt=_b_.next(_iter)
  4913. if(_b_.getattr(elt,"__eq__")(item))return true}catch(err){if(err.__name__=="StopIteration")return false
  4914. throw err}}}
  4915. try{f=_b_.getattr(_set,"__getitem__")}
  4916. catch(err){throw _b_.TypeError("'"+$B.get_class(_set).__name__+"' object is not iterable")}
  4917. if(f){var i=-1
  4918. while(1){i++
  4919. try{var elt=f(i)
  4920. if(_b_.getattr(elt,"__eq__")(item))return true}catch(err){if(err.__name__=='IndexError')return false
  4921. throw err}}}}
  4922. var $io={__class__:$B.$type,__name__:'io'}
  4923. $io.__mro__=[_b_.object.$dict]
  4924. $B.stderr={__class__:$io,write:function(data){console.log(data)},flush:function(){}}
  4925. $B.stderr_buff=''
  4926. $B.stdout={__class__:$io,write: function(data){console.log(data)},flush:function(){}}
  4927. $B.stdin={__class__: $io,__original__:true,closed: false,len:1,pos:0,read: function(){return '';},readline: function(){return '';}}
  4928. $B.jsobject2pyobject=function(obj){switch(obj){case null:
  4929. return _b_.None
  4930. case true:
  4931. return _b_.True
  4932. case false:
  4933. return _b_.False}
  4934. if(typeof obj==='object' && !Array.isArray(obj)&&
  4935. obj.__class__===undefined){
  4936. var res=_b_.dict()
  4937. for(var attr in obj){res.$string_dict[attr]=$B.jsobject2pyobject(obj[attr])}
  4938. return res}
  4939. if(_b_.isinstance(obj,_b_.list)){var res=[],pos=0
  4940. for(var i=0,_len_i=obj.length;i < _len_i;i++){res[pos++]=$B.jsobject2pyobject(obj[i])}
  4941. return res}
  4942. if(obj.__class__!==undefined){if(obj.__class__===_b_.list){for(var i=0,_len_i=obj.length;i < _len_i;i++){obj[i]=$B.jsobject2pyobject(obj[i])}
  4943. return obj}
  4944. return obj}
  4945. if(obj._type_==='iter'){
  4946. return _b_.iter(obj.data)}
  4947. return $B.JSObject(obj)}
  4948. $B.pyobject2jsobject=function(obj){
  4949. switch(obj){case _b_.None:
  4950. return null
  4951. case _b_.True:
  4952. return true
  4953. case _b_.False:
  4954. return false}
  4955. if(_b_.isinstance(obj,[_b_.int,_b_.float,_b_.str]))return obj
  4956. if(_b_.isinstance(obj,[_b_.list,_b_.tuple])){var res=[],pos=0
  4957. for(var i=0,_len_i=obj.length;i < _len_i;i++){res[pos++]=$B.pyobject2jsobject(obj[i])}
  4958. return res}
  4959. if(_b_.isinstance(obj,_b_.dict)){var res={}
  4960. var items=_b_.list(_b_.dict.$dict.items(obj))
  4961. for(var i=0,_len_i=items.length;i < _len_i;i++){res[$B.pyobject2jsobject(items[i][0])]=$B.pyobject2jsobject(items[i][1])}
  4962. return res}
  4963. if(_b_.hasattr(obj,'__iter__')){
  4964. var _a=[],pos=0
  4965. while(1){try{
  4966. _a[pos++]=$B.pyobject2jsobject(_b_.next(obj))}catch(err){if(err.__name__ !=="StopIteration")throw err
  4967. break}}
  4968. return{'_type_': 'iter',data: _a}}
  4969. if(_b_.hasattr(obj,'__getstate__')){return _b_.getattr(obj,'__getstate__')()}
  4970. if(_b_.hasattr(obj,'__dict__')){return $B.pyobject2jsobject(_b_.getattr(obj,'__dict__'))}
  4971. throw _b_.TypeError(_b_.str(obj)+' is not JSON serializable')}
  4972. $B.set_line=function(line_num,module_name){$B.line_info=line_num+','+module_name
  4973. return _b_.None}
  4974. $B.$iterator=function(items,klass){var res={__class__:klass,__iter__:function(){return res},__len__:function(){return items.length},__next__:function(){res.counter++
  4975. if(res.counter<items.length)return items[res.counter]
  4976. throw _b_.StopIteration("StopIteration")},__repr__:function(){return "<"+klass.__name__+" object>"},counter:-1}
  4977. res.__str__=res.toString=res.__repr__
  4978. return res}
  4979. $B.$iterator_class=function(name){var res={__class__:$B.$type,__name__:name,}
  4980. res.__mro__=[_b_.object.$dict]
  4981. function as_array(s){var _a=[],pos=0
  4982. var _it=_b_.iter(s)
  4983. while(1){try{
  4984. _a[pos++]=_b_.next(_it)}catch(err){if(err.__name__=='StopIteration'){break}}}
  4985. return _a}
  4986. function as_list(s){return _b_.list(as_array(s))}
  4987. function as_set(s){return _b_.set(as_array(s))}
  4988. res.__eq__=function(self,other){if(_b_.isinstance(other,[_b_.tuple,_b_.set,_b_.list])){return _b_.getattr(as_list(self),'__eq__')(other)}
  4989. if(_b_.hasattr(other,'__iter__')){return _b_.getattr(as_list(self),'__eq__')(as_list(other))}
  4990. _b_.NotImplementedError("__eq__ not implemented yet for list and " + _b_.type(other))}
  4991. var _ops=['eq','ne']
  4992. var _f=res.__eq__+''
  4993. for(var i=0;i < _ops.length;i++){var _op='__'+_ops[i]+'__'
  4994. eval('res.'+_op+'='+_f.replace(new RegExp('__eq__','g'),_op))}
  4995. res.__or__=function(self,other){if(_b_.isinstance(other,[_b_.tuple,_b_.set,_b_.list])){return _b_.getattr(as_set(self),'__or__')(other)}
  4996. if(_b_.hasattr(other,'__iter__')){return _b_.getattr(as_set(self),'__or__')(as_set(other))}
  4997. _b_.NotImplementedError("__or__ not implemented yet for set and " + _b_.type(other))}
  4998. var _ops=['sub','and','xor','gt','ge','lt','le']
  4999. var _f=res.__or__+''
  5000. for(var i=0;i < _ops.length;i++){var _op='__'+_ops[i]+'__'
  5001. eval('res.'+_op+'='+_f.replace(new RegExp('__or__','g'),_op))}
  5002. res.$factory={__class__:$B.$factory,$dict:res}
  5003. return res}
  5004. $B.$CodeDict={__class__:$B.$type,__name__:'code'}
  5005. $B.$CodeDict.__mro__=[_b_.object.$dict]
  5006. function _code(){}
  5007. _code.__class__=$B.$factory
  5008. _code.$dict=$B.$CodeDict
  5009. $B.$CodeDict.$factory=_code
  5010. function $err(op,klass,other){var msg="unsupported operand type(s) for "+op
  5011. msg +=": '"+klass.__name__+"' and '"+$B.get_class(other).__name__+"'"
  5012. throw _b_.TypeError(msg)}
  5013. var ropnames=['add','sub','mul','truediv','floordiv','mod','pow','lshift','rshift','and','xor','or']
  5014. var ropsigns=['+','-','*','/','//','%','**','<<','>>','&','^','|']
  5015. $B.make_rmethods=function(klass){for(var j=0,_len_j=ropnames.length;j < _len_j;j++){if(klass['__'+ropnames[j]+'__']===undefined){
  5016. klass['__'+ropnames[j]+'__']=(function(name,sign){return function(self,other){try{return _b_.getattr(other,'__r'+name+'__')(self)}
  5017. catch(err){$err(sign,klass,other)}}})(ropnames[j],ropsigns[j])}}}
  5018. $B.set_func_names=function(klass){var name=klass.__name__
  5019. for(var attr in klass){if(typeof klass[attr]=='function'){klass[attr].$infos={__name__ : name+'.'+attr}}}}
  5020. $B.UUID=function(){return $B.$py_UUID++}
  5021. $B.InjectBuiltins=function(){var _str=["var _b_=$B.builtins"],pos=1
  5022. for(var $b in $B.builtins)_str[pos++]='var ' + $b +'=_b_["'+$b+'"]'
  5023. return _str.join(';')}
  5024. $B.$GetInt=function(value){
  5025. if(typeof value=="number"||value.constructor===Number){return value}
  5026. else if(typeof value==="boolean"){return value ? 1 : 0}
  5027. else if(_b_.isinstance(value,_b_.int)){return value}
  5028. else if(_b_.isinstance(value,_b_.float)){return value.valueOf()}
  5029. if(value.__class__!==$B.$factory){try{var v=_b_.getattr(value,'__int__')();return v}catch(e){}
  5030. try{var v=_b_.getattr(value,'__index__')();return v}catch(e){}}
  5031. throw _b_.TypeError("'"+$B.get_class(value).__name__+
  5032. "' object cannot be interpreted as an integer")}
  5033. $B.PyNumber_Index=function(item){switch(typeof item){case "boolean":
  5034. return item ? 1 : 0
  5035. case "number":
  5036. return item
  5037. case "object":
  5038. if(item.__class__===$B.LongInt.$dict){return item}
  5039. var method=_b_.getattr(item,'__index__',null)
  5040. if(method!==null){method=typeof method=='function' ?
  5041. method :
  5042. _b_.getattr(method,'__call__')
  5043. return $B.int_or_bool(method)}
  5044. default:
  5045. throw _b_.TypeError("'"+$B.get_class(item).__name__+
  5046. "' object cannot be interpreted as an integer")}}
  5047. $B.int_or_bool=function(v){switch(typeof v){case "boolean":
  5048. return v ? 1 : 0
  5049. case "number":
  5050. return v
  5051. case "object":
  5052. if(v.__class__===$B.LongInt.$dict){return v}
  5053. else{throw _b_.TypeError("'"+$B.get_class(v).__name__+
  5054. "' object cannot be interpreted as an integer")}
  5055. default:
  5056. throw _b_.TypeError("'"+$B.get_class(v).__name__+
  5057. "' object cannot be interpreted as an integer")}}
  5058. $B.int_value=function(v){
  5059. try{return $B.int_or_bool(v)}
  5060. catch(err){if(_b_.isinstance(v,_b_.complex)&& v.imag==0){return $B.int_or_bool(v.real)}else if(isinstance(v,_b_.float)&& v==Math.floor(v)){return Math.floor(v)}else{throw _b_.TypeError("'"+$B.get_class(v).__name__+
  5061. "' object cannot be interpreted as an integer")}}}
  5062. $B.enter_frame=function(frame){
  5063. $B.frames_stack.push(frame)}
  5064. $B.leave_frame=function(arg){
  5065. if($B.profile > 0)$B.$profile.return();
  5066. if($B.frames_stack.length==0){console.log('empty stack');return}
  5067. $B.frames_stack.pop()}
  5068. $B.memory=function(){var info=[]
  5069. for(var attr in __BRYTHON__){var obj=__BRYTHON__[attr]
  5070. if(obj===null){continue}
  5071. if(Array.isArray(obj)){info.push([obj.length,attr])}
  5072. else if(typeof obj=='object'){info.push([Object.keys(obj).length,attr])}}
  5073. info.sort(function(x,y){return x[0]-y[0]})
  5074. for(var i=0,len=info.length;i<len;i++){console.log(info[i][0],info[i][1],__BRYTHON__[info[i][1]])}}
  5075. $B.$profile_data={}
  5076. $B.$profile=(function(profile){var call_times={},
  5077. _START=0,
  5078. _CALLER=1,_CUMULATED=2,_LAST_RESUMED=3,call_stack=[],
  5079. profile_start=null,
  5080. active=false,
  5081. paused=false,
  5082. cumulated=0;
  5083. var _fhash=function(module,fname,line){return module+"."+fname+":"+line;}
  5084. var _hash=function(module,line){return module+":"+line;}
  5085. var _is_recursive=function(h){for(i=0;i<call_stack.length;i++)
  5086. if(call_stack[i]==h)return true;
  5087. return false;}
  5088. var $profile={'call':function(module,fname,line,caller){if($B.profile > 1 && active){var ctime=new Date();
  5089. var h=_fhash(module,fname,line)
  5090. if(!(h in call_times)){call_times[h]=[];}
  5091. if(call_stack.length > 0){in_func=call_stack[call_stack.length-1];
  5092. func_stack=call_times[in_func]
  5093. inner_most_call=func_stack[func_stack.length-1];
  5094. inner_most_call[_CUMULATED]+=(ctime-inner_most_call[_LAST_RESUMED])
  5095. caller=caller+":"+in_func;}
  5096. call_times[h].push([ctime,caller,0,ctime])
  5097. call_stack.push(h)}},'return':function(){if($B.profile > 1 && active){var h=call_stack.pop()
  5098. if(h in call_times){var t_end=new Date();
  5099. var data=call_times[h].pop();
  5100. t_start=data[_START]
  5101. caller=data[_CALLER]
  5102. t_duration=t_end-t_start;
  5103. t_in_func=data[_CUMULATED]+(t_end-data[_LAST_RESUMED]);
  5104. if(!(h in profile.call_times)){profile.call_times[h]=0;
  5105. profile.call_times_proper[h]=0;
  5106. profile.call_counts[h]=0;
  5107. profile.call_counts_norec[h]=0;
  5108. profile.callers[h]={};}
  5109. profile.call_times[h]+=t_duration;
  5110. profile.call_times_proper[h]+=t_in_func;
  5111. profile.call_counts[h]+=1;
  5112. if(!(caller in profile.callers[h])){profile.callers[h][caller]=[0,0,0,0]}
  5113. if(! _is_recursive(h)){profile.call_counts_norec[h]+=1;
  5114. profile.callers[h][caller][3]++;}
  5115. profile.callers[h][caller][0]+=t_duration;
  5116. profile.callers[h][caller][1]+=t_in_func;
  5117. profile.callers[h][caller][2]++;
  5118. if(call_stack.length > 0){
  5119. in_func=call_stack[call_stack.length-1];
  5120. func_stack=call_times[in_func];
  5121. inner_most_call=func_stack[func_stack.length-1];
  5122. inner_most_call[_LAST_RESUMED]=new Date();}}}},'count':function(module,line){if(active){var h=_hash(module,line);
  5123. if(!(h in profile.line_counts)){profile.line_counts[h]=0;}
  5124. profile.line_counts[h]++;}},'pause':function(){if(active){elapsed=(new Date())-profile_start
  5125. cumulated +=elapsed
  5126. active=false
  5127. paused=true}},'start':function(){if($B.profile > 0){if(! paused )$B.$profile.clear();
  5128. else{paused=false;}
  5129. active=true
  5130. profile_start=new Date()}},'elapsed': function(){if(active)return cumulated +(new Date())-profile_start
  5131. else return cumulated;},'stop':function(){if(active ||paused){profile.profile_duration=((new Date())-profile_start)+cumulated
  5132. active=false
  5133. paused=false}},'clear':function(){cumulated=0;
  5134. profile.line_counts={};
  5135. profile.call_times={};
  5136. profile.call_times_proper={};
  5137. profile.call_counts={};
  5138. profile.call_counts_norec={};
  5139. profile.callers={};
  5140. active=false;
  5141. paused=false;},'status':function(){if($B.profile <=0)return "Disabled";
  5142. if(active)return "Collecting data: active";
  5143. else if(paused)return "Collecting data: paused";
  5144. else return "Stopped";},}
  5145. return $profile;})($B.$profile_data)
  5146. var min_int=Math.pow(-2,53),max_int=Math.pow(2,53)-1
  5147. $B.is_safe_int=function(){for(var i=0;i<arguments.length;i++){var arg=arguments[i]
  5148. if(arg<min_int ||arg>max_int){return false}}
  5149. return true}
  5150. $B.add=function(x,y){var z=(typeof x!='number' ||typeof y!='number')?
  5151. new Number(x+y): x+y
  5152. if(x>min_int && x<max_int && y>min_int && y<max_int
  5153. && z>min_int && z<max_int){return z}
  5154. else if((typeof x=='number' ||x.__class__===$B.LongInt.$dict)
  5155. &&(typeof y=='number' ||y.__class__===$B.LongInt.$dict)){if((typeof x=='number' && isNaN(x))||
  5156. (typeof y=='number' && isNaN(y))){return _b_.float('nan')}
  5157. var res=$B.LongInt.$dict.__add__($B.LongInt(x),$B.LongInt(y))
  5158. return res}else{return z}}
  5159. $B.div=function(x,y){var z=x/y
  5160. if(x>min_int && x<max_int && y>min_int && y<max_int
  5161. && z>min_int && z<max_int){return z}
  5162. else{return $B.LongInt.$dict.__truediv__($B.LongInt(x),$B.LongInt(y))}}
  5163. $B.eq=function(x,y){if(x>min_int && x<max_int && y>min_int && y<max_int){return x==y}
  5164. return $B.LongInt.$dict.__eq__($B.LongInt(x),$B.LongInt(y))}
  5165. $B.floordiv=function(x,y){var z=x/y
  5166. if(x>min_int && x<max_int && y>min_int && y<max_int
  5167. && z>min_int && z<max_int){return Math.floor(z)}
  5168. else{return $B.LongInt.$dict.__floordiv__($B.LongInt(x),$B.LongInt(y))}}
  5169. $B.mul=function(x,y){var z=(typeof x!='number' ||typeof y!='number')?
  5170. new Number(x*y): x*y
  5171. if(x>min_int && x<max_int && y>min_int && y<max_int
  5172. && z>min_int && z<max_int){return z}
  5173. else if((typeof x=='number' ||x.__class__===$B.LongInt.$dict)
  5174. &&(typeof y=='number' ||y.__class__===$B.LongInt.$dict)){if((typeof x=='number' && isNaN(x))||
  5175. (typeof y=='number' && isNaN(y))){return _b_.float('nan')}
  5176. return $B.LongInt.$dict.__mul__($B.LongInt(x),$B.LongInt(y))}else{return z}}
  5177. $B.sub=function(x,y){var z=(typeof x!='number' ||typeof y!='number')?
  5178. new Number(x-y): x-y
  5179. if(x>min_int && x<max_int && y>min_int && y<max_int
  5180. && z>min_int && z<max_int){return z}
  5181. else if((typeof x=='number' ||x.__class__===$B.LongInt.$dict)
  5182. &&(typeof y=='number' ||y.__class__===$B.LongInt.$dict)){if((typeof x=='number' && isNaN(x))||
  5183. (typeof y=='number' && isNaN(y))){return _b_.float('nan')}
  5184. return $B.LongInt.$dict.__sub__($B.LongInt(x),$B.LongInt(y))}else{return z}}
  5185. $B.ge=function(x,y){if(typeof x=='number' && typeof y=='number'){return x>=y}
  5186. else if(typeof x=='number' && typeof y!='number'){return !y.pos}
  5187. else if(typeof x !='number' && typeof y=='number'){return x.pos===true}
  5188. else{return $B.LongInt.$dict.__ge__(x,y)}}
  5189. $B.gt=function(x,y){if(typeof x=='number' && typeof y=='number'){return x>y}
  5190. else if(typeof x=='number' && typeof y!='number'){return !y.pos}
  5191. else if(typeof x !='number' && typeof y=='number'){return x.pos===true}
  5192. else{return $B.LongInt.$dict.__gt__(x,y)}}
  5193. $B.is_none=function(o){return o===undefined ||o==_b_.None;}
  5194. $B.imports=function(){
  5195. var w=window.open('','','width="50%",height=400,resizeable,scrollbars');
  5196. w.document.write("Currently imported modules. Copy and paste in file "+
  5197. "<b>.bundle-include</b> in your application folder, then run "+
  5198. "<code>python -m brython --modules</code> to generate a new version "+
  5199. "of <b>brython_modules.js</b><p>")
  5200. w.document.write("<TEXTAREA rows=20 cols=40>")
  5201. for(var attr in $B.imported){w.document.write(attr+'\n')}
  5202. w.document.write("</TEXTAREA>")
  5203. w.document.close();}
  5204. $B.compiled_imports=function(){
  5205. if(!$B.use_VFS){console.log('only works with VFS')
  5206. return}
  5207. var res={}
  5208. for(var attr in $B.imported){var info=$B.VFS[attr]
  5209. if(info!==undefined){var lang=info[0],src=info[1]
  5210. if(lang=='.js'){res[attr]=['.js',src]}else{res[attr]=['.js',$B.py2js(src,attr,attr,'__builtins__').to_js()]
  5211. if(info[2]!==undefined){res[attr].push(info[2])}}}}
  5212. var w=window.open('','','width="80%",height=400,resizeable,scrollbars')
  5213. w.document.write("Currently imported modules. Copy and paste in file "+
  5214. "<b>brython_modules.js</b> in your application folder<p>"+
  5215. "<TEXTAREA rows=20 cols=40>"+
  5216. "__BRYTHON__.use_VFS = true;\n__BRYTHON__.VFS = ")
  5217. w.document.write(JSON.stringify(res))
  5218. w.document.write("</TEXTAREA>")
  5219. w.document.close();}})(__BRYTHON__)
  5220. if(!Array.indexOf){Array.prototype.indexOf=function(obj){for(var i=0,_len_i=this.length;i < _len_i;i++)if(this[i]==obj)return i
  5221. return -1}}
  5222. if(!String.prototype.repeat){String.prototype.repeat=function(count){if(count < 1)return '';
  5223. var result='',pattern=this.valueOf()
  5224. while(count > 1){if(count & 1)result +=pattern
  5225. count >>=1,pattern +=pattern}
  5226. return result + pattern;}}
  5227. ;(function($B){eval($B.InjectBuiltins())
  5228. _b_.__debug__=false
  5229. var $ObjectDict=_b_.object.$dict,odga=$ObjectDict.__getattribute__
  5230. $B.$comps={'>':'gt','>=':'ge','<':'lt','<=':'le'}
  5231. $B.$inv_comps={'>': 'lt','>=': 'le','<': 'gt','<=': 'gt'}
  5232. function abs(obj){if(isinstance(obj,_b_.int))return _b_.int(Math.abs(obj));
  5233. if(isinstance(obj,_b_.float))return _b_.float(Math.abs(obj));
  5234. if(hasattr(obj,'__abs__')){return getattr(obj,'__abs__')()};
  5235. throw _b_.TypeError("Bad operand type for abs(): '"+$B.get_class(obj)+"'")}
  5236. function all(obj){var iterable=iter(obj)
  5237. while(1){try{var elt=next(iterable)
  5238. if(!bool(elt))return false}catch(err){return true}}}
  5239. function any(obj){var iterable=iter(obj)
  5240. while(1){try{var elt=next(iterable)
  5241. if(bool(elt))return true}catch(err){return false}}}
  5242. function ascii(obj){var res=repr(obj),res1='',cp
  5243. for(var i=0;i<res.length;i++){cp=res.charCodeAt(i)
  5244. if(cp<128){res1 +=res.charAt(i)}
  5245. else if(cp<256){res1 +='\\x'+cp.toString(16)}
  5246. else{res1 +='\\u'+cp.toString(16)}}
  5247. return res1}
  5248. function $builtin_base_convert_helper(obj,base){var prefix="";
  5249. switch(base){case 2:
  5250. prefix='0b';break;
  5251. case 8:
  5252. prefix='0o';break;
  5253. case 16:
  5254. prefix='0x';break;
  5255. default:
  5256. console.log('invalid base:' + base)}
  5257. if(obj.__class__===$B.LongInt.$dict){if(obj.pos)return prefix + $B.LongInt.$dict.to_base(obj,base)
  5258. return '-' + prefix + $B.LongInt.$dict.to_base(-obj,base)}
  5259. var value=$B.$GetInt(obj)
  5260. if(value===undefined){
  5261. throw _b_.TypeError('Error, argument must be an integer or contains an __index__ function')}
  5262. if(value >=0)return prefix + value.toString(base);
  5263. return '-' + prefix +(-value).toString(base);}
  5264. function bin(obj){if(isinstance(obj,_b_.int)){return $builtin_base_convert_helper(obj,2)}
  5265. return getattr(obj,'__index__')()}
  5266. function bool(obj){
  5267. if(obj===null ||obj===undefined )return false
  5268. switch(typeof obj){case 'boolean':
  5269. return obj
  5270. case 'number':
  5271. case 'string':
  5272. if(obj)return true
  5273. return false
  5274. default:
  5275. try{return getattr(obj,'__bool__')()}
  5276. catch(err){try{return getattr(obj,'__len__')()>0}
  5277. catch(err){return true}}}}
  5278. function callable(obj){return hasattr(obj,'__call__')}
  5279. function chr(i){if(i < 0 ||i > 1114111)_b_.ValueError('Outside valid range')
  5280. return String.fromCharCode(i)}
  5281. function classmethod(func){func.$type='classmethod'
  5282. return func}
  5283. classmethod.__class__=$B.$factory
  5284. classmethod.$dict={__class__:$B.$type,__name__:'classmethod',$factory: classmethod}
  5285. classmethod.$dict.__mro__=[$ObjectDict]
  5286. $B.$CodeObjectDict={__class__:$B.$type,__name__:'code',__repr__:function(self){return '<code object '+self.name+', file '+self.filename+'>'},}
  5287. $B.$CodeObjectDict.__str__=$B.$CodeObjectDict.__repr__
  5288. $B.$CodeObjectDict.__mro__=[$ObjectDict]
  5289. function compile(source,filename,mode){var $=$B.args('compile',6,{source:null,filename:null,mode:null,flags:null,dont_inherit:null,optimize:null},['source','filename','mode','flags','dont_inherit','optimize'],arguments,{flags:0,dont_inherit:false,optimize:-1},null,null)
  5290. var module_name='$exec_' + $B.UUID()
  5291. $B.clear_ns(module_name)
  5292. $.__class__=$B.$CodeObjectDict
  5293. $.co_flags=$.flags
  5294. return $}
  5295. compile.__class__=$B.factory
  5296. $B.$CodeObjectDict.$factory=compile
  5297. compile.$dict=$B.$CodeObjectDict
  5298. var __debug__=$B.debug>0
  5299. function delattr(obj,attr){
  5300. var klass=$B.get_class(obj)
  5301. var res=obj[attr]
  5302. if(res===undefined){res=klass[attr]
  5303. if(res===undefined){var mro=klass.__mro__
  5304. for(var i=0;i<mro.length;i++){var res=mro[i][attr]
  5305. if(res!==undefined){break}}}}
  5306. if(res!==undefined && res.__delete__!==undefined){res.__delete__(res,obj,attr)}else{getattr(obj,'__delattr__')(attr)}
  5307. return None}
  5308. function dir(obj){if(obj===undefined){
  5309. var frame=$B.last($B.frames_stack),globals_obj=frame[3],res=_b_.list(),pos=0
  5310. for(var attr in globals_obj){if(attr.charAt(0)=='$' && attr.charAt(1)!='$'){
  5311. continue}
  5312. res[pos++]=attr}
  5313. _b_.list.$dict.sort(res)
  5314. return res}
  5315. var klass=obj.__class__ ||$B.get_class(obj)
  5316. if(klass && klass.is_class){obj=obj.$dict}
  5317. else{
  5318. try{
  5319. var res=getattr(obj,'__dir__')()
  5320. res=_b_.list(res)
  5321. res.sort()
  5322. return res}catch(err){}}
  5323. var res=[],pos=0
  5324. for(var attr in obj){if(attr.charAt(0)!=='$' && attr!=='__class__'){res[pos++]=attr}}
  5325. res.sort()
  5326. return res}
  5327. function divmod(x,y){var klass=x.__class__ ||$B.get_class(x)
  5328. return _b_.tuple([getattr(klass,'__floordiv__')(x,y),getattr(klass,'__mod__')(x,y)])}
  5329. var $EnumerateDict={__class__:$B.$type,__name__:'enumerate'}
  5330. $EnumerateDict.__mro__=[$ObjectDict]
  5331. function enumerate(){var $ns=$B.args("enumerate",2,{iterable:null,start:null},['iterable','start'],arguments,{start:0},null,null)
  5332. var _iter=iter($ns["iterable"])
  5333. var _start=$ns["start"]
  5334. var res={__class__:$EnumerateDict,__getattr__:function(attr){return res[attr]},__iter__:function(){return res},__name__:'enumerate iterator',__next__:function(){res.counter++
  5335. return _b_.tuple([res.counter,next(_iter)])},__repr__:function(){return "<enumerate object>"},__str__:function(){return "<enumerate object>"},counter:_start-1}
  5336. for(var attr in res){if(typeof res[attr]==='function' && attr!=="__class__"){res[attr].__str__=(function(x){return function(){return "<method wrapper '"+x+"' of enumerate object>"}})(attr)}}
  5337. return res}
  5338. enumerate.__class__=$B.$factory
  5339. enumerate.$dict=$EnumerateDict
  5340. $EnumerateDict.$factory=enumerate
  5341. function $eval(src,_globals,_locals){var current_frame=$B.frames_stack[$B.frames_stack.length-1]
  5342. if(current_frame!==undefined){var current_locals_id=current_frame[0].replace(/\./,'_'),current_globals_id=current_frame[2].replace(/\./,'_')}
  5343. var is_exec=arguments[3]=='exec',leave=false
  5344. if(src.__class__===$B.$CodeObjectDict){src=src.source}
  5345. var globals_id='$exec_'+$B.UUID(),locals_id,parent_block_id
  5346. if(_locals===_globals ||_locals===undefined){locals_id=globals_id}else{locals_id='$exec_'+$B.UUID()}
  5347. eval('var $locals_'+globals_id+' = {}\nvar $locals_'+locals_id+' = {}')
  5348. if(_globals===undefined){var gobj=current_frame[3],ex=''
  5349. parent_block_id=current_globals_id
  5350. ex +='var $locals_'+current_globals_id+'=gobj;'
  5351. eval(ex)}else{$B.bound[globals_id]={}
  5352. var items=_b_.dict.$dict.items(_globals),item
  5353. while(1){try{var item=next(items)
  5354. eval('$locals_'+globals_id+'["'+item[0]+'"] = item[1]')
  5355. $B.bound[globals_id][item[0]]=true}catch(err){break}}
  5356. parent_block_id='__builtins__'}
  5357. if(_locals===undefined){if(_globals!==undefined){eval('var $locals_'+locals_id+' = $locals_'+globals_id)}else{var lobj=current_frame[1],ex=''
  5358. for(var attr in current_frame[1]){ex +='$locals_'+locals_id+'["'+attr+
  5359. '"] = current_frame[1]["'+attr+'"];'}
  5360. eval(ex)}}else{var items=_b_.dict.$dict.items(_locals),item
  5361. while(1){try{var item=next(items)
  5362. eval('$locals_'+locals_id+'["'+item[0]+'"] = item[1]')}catch(err){break}}}
  5363. var root=$B.py2js(src,globals_id,locals_id,parent_block_id),leave_frame=true,js,gns,lns
  5364. try{
  5365. if(!is_exec){
  5366. var try_node=root.children[root.children.length-2],instr=try_node.children[try_node.children.length-2]
  5367. var type=instr.C.tree[0].type
  5368. switch(type){case 'expr':
  5369. case 'list_or_tuple':
  5370. case 'op':
  5371. case 'ternary':
  5372. var children=try_node.children
  5373. root.children.splice(root.children.length-2,2)
  5374. for(var i=0;i<children.length-1;i++){root.add(children[i])}
  5375. break
  5376. default:
  5377. leave_frame=false
  5378. throw _b_.SyntaxError("eval() argument must be an expression",'<string>',1,1,src)}}
  5379. js=root.to_js()
  5380. var res=eval(js)
  5381. gns=eval('$locals_'+globals_id)
  5382. if(_locals!==undefined){lns=eval('$locals_'+locals_id)
  5383. var setitem=getattr(_locals,'__setitem__')
  5384. for(var attr in lns){if(attr.charAt(0)=='$'){continue}
  5385. setitem(attr,lns[attr])}}else{for(var attr in lns){current_frame[1][attr]=lns[attr]}}
  5386. if(_globals!==undefined){
  5387. var setitem=getattr(_globals,'__setitem__')
  5388. for(var attr in gns){if(attr.charAt(0)=='$'){continue}
  5389. setitem(attr,gns[attr])}}else{for(var attr in gns){current_frame[3][attr]=gns[attr]}}
  5390. if(res===undefined)return _b_.None
  5391. return res}catch(err){if(err.$py_error===undefined){throw $B.exception(err)}
  5392. throw err}finally{root=null
  5393. js=null
  5394. gns=null
  5395. lns=null
  5396. $B.clear_ns(globals_id)
  5397. $B.clear_ns(locals_id)
  5398. if(!is_exec && leave_frame){
  5399. $B.frames_stack.pop()}}}
  5400. $eval.$is_func=true
  5401. function exec(src,globals,locals){return $eval(src,globals,locals,'exec')||_b_.None}
  5402. exec.$is_func=true
  5403. var $FilterDict={__class__:$B.$type,__name__:'filter'}
  5404. $FilterDict.__iter__=function(self){return self}
  5405. $FilterDict.__repr__=$FilterDict.__str__=function(){return "<filter object>"},$FilterDict.__mro__=[$ObjectDict]
  5406. function filter(){if(arguments.length!=2){throw _b_.TypeError(
  5407. "filter expected 2 arguments, got "+arguments.length)}
  5408. var func=arguments[0],iterable=iter(arguments[1])
  5409. if(func===_b_.None)func=bool
  5410. var __next__=function(){while(true){var _item=next(iterable)
  5411. if(func(_item)){return _item}}}
  5412. return{
  5413. __class__: $FilterDict,__next__: __next__}}
  5414. function format(value,format_spec){if(hasattr(value,'__format__'))return getattr(value,'__format__')(format_spec)
  5415. throw _b_.NotImplementedError("__format__ is not implemented for object '" + _b_.str(value)+ "'")}
  5416. function attr_error(attr,cname){var msg="bad operand type for unary #: '"+cname+"'"
  5417. switch(attr){case '__neg__':
  5418. throw _b_.TypeError(msg.replace('#','-'))
  5419. case '__pos__':
  5420. throw _b_.TypeError(msg.replace('#','+'))
  5421. case '__invert__':
  5422. throw _b_.TypeError(msg.replace('#','~'))
  5423. case '__call__':
  5424. throw _b_.TypeError("'"+cname+"'"+' object is not callable')
  5425. default:
  5426. throw _b_.AttributeError("'"+cname+"' object has no attribute '"+attr+"'")}}
  5427. $B.show_getattr=function(){var items=[]
  5428. for(var attr in $B.counter){items.push([$B.counter[attr],attr])}
  5429. items.sort(function(x,y){return x[0]>y[0]? 1 : x[0]==y[0]? 0 : -1})
  5430. items.reverse()
  5431. for(var i=0;i<10;i++){console.log(items[i])}}
  5432. function getattr(obj,attr,_default){
  5433. var klass=obj.__class__
  5434. if(klass===undefined){
  5435. if(typeof obj=='string'){klass=_b_.str.$dict}
  5436. else if(typeof obj=='number'){klass=obj % 1==0 ? _b_.int.$dict : _b_.float.$dict}else if(obj instanceof Number){klass=_b_.float.$dict}else{klass=$B.get_class(obj)}}
  5437. if(klass===undefined){
  5438. if(obj[attr]!==undefined){if(typeof obj[attr]=="function"){return function(){
  5439. return obj[attr].apply(obj,arguments)}}else{return $B.$JS2Py(obj[attr])}}
  5440. if(_default!==undefined)return _default
  5441. throw _b_.AttributeError('object has no attribute '+attr)}
  5442. switch(attr){case '__call__':
  5443. if(typeof obj=='function'){return obj}else if(klass===$B.JSObject.$dict && typeof obj.js=='function'){return function(){
  5444. var args=[]
  5445. for(var i=0;i<arguments.length;i++){args.push($B.pyobj2jsobj(arguments[i]))}
  5446. var res=obj.js.apply(null,args)
  5447. if(res===undefined){return None}
  5448. return $B.JSObject(res)}}
  5449. break
  5450. case '__class__':
  5451. if(klass.__name__=='classXXX'){
  5452. return klass}
  5453. return klass.$factory
  5454. case '__dict__':
  5455. return $B.obj_dict(obj)
  5456. case '__doc__':
  5457. for(var i=0;i<builtin_names.length;i++){if(obj===_b_[builtin_names[i]]){_get_builtins_doc()
  5458. return $B.builtins_doc[builtin_names[i]]}}
  5459. break
  5460. case '__mro__':
  5461. if(klass.__name__=='classXXX'){
  5462. console.log('newmro')
  5463. var res=[obj],pos=0,mro=obj.__mro__
  5464. for(var i=0;i<mro.length;i++){res[pos++]=mro[i]}
  5465. return res}
  5466. if(klass===$B.$factory){
  5467. var res=[obj.$dict],pos=0,mro=obj.$dict.__mro__
  5468. for(var i=0;i<mro.length;i++){res[pos++]=mro[i].$factory}
  5469. return res}
  5470. break
  5471. case '__subclasses__':
  5472. if(klass===$B.$factory){var subclasses=obj.$dict.$subclasses ||[]
  5473. return function(){return subclasses}}
  5474. break
  5475. case '$$new':
  5476. if(klass===$B.JSObject.$dict && obj.js_func !==undefined){return $B.JSConstructor(obj)}
  5477. break}
  5478. if(typeof obj=='function'){var value=obj.__class__===$B.$factory ? obj.$dict[attr]: obj[attr]
  5479. if(value !==undefined){if(attr=='__module__' ||attr=='__hash__'){
  5480. return value}}}
  5481. if(klass.$native){if(klass[attr]===undefined){var object_attr=_b_.object.$dict[attr]
  5482. if(object_attr!==undefined){klass[attr]=object_attr}
  5483. else{if(_default===undefined){attr_error(attr,klass.__name__)}
  5484. return _default}}
  5485. if(klass.descriptors && klass.descriptors[attr]!==undefined){return klass[attr](obj)}
  5486. if(typeof klass[attr]=='function'){
  5487. if(attr=='__new__')return klass[attr].apply(null,arguments)
  5488. if(klass[attr].$type=='classmethod'){var res=function(){var args=[klass.$factory]
  5489. for(var i=0;i<arguments.length;i++){args.push(arguments[i])}
  5490. return klass[attr].apply(null,args)}
  5491. res.$type='classmethod'
  5492. res.$infos=klass[attr].$infos
  5493. return res}
  5494. var method=function(){var args=[obj],pos=1
  5495. for(var i=0;i<arguments.length;i++){args[pos++]=arguments[i]}
  5496. return klass[attr].apply(null,args)}
  5497. method.__class__=$B.$MethodDict
  5498. method.$infos={__class__: klass.$factory,__func__ : klass[attr],__name__ : attr,__self__ : obj}
  5499. method.__str__=method.__repr__=function(){return '<built-in method '+attr+' of '+klass.__name__+' object>'}
  5500. return method}
  5501. return klass[attr]}
  5502. var is_class=klass.is_class,mro,attr_func
  5503. if(is_class){attr_func=$B.$type.__getattribute__
  5504. if(obj.$dict===undefined){console.log('obj '+obj+' $dict undefined')}
  5505. obj=obj.$dict}else{attr_func=klass.__getattribute__
  5506. if(attr_func===undefined){var mro=klass.__mro__
  5507. for(var i=0,len=mro.length;i<len;i++){attr_func=mro[i]['__getattribute__']
  5508. if(attr_func!==undefined){break}}}}
  5509. if(typeof attr_func!=='function'){console.log(attr+' is not a function '+attr_func)}
  5510. if(attr_func===odga){var res=obj[attr]
  5511. if(res!==undefined && res.__set__===undefined){return obj[attr]}}
  5512. try{var res=attr_func(obj,attr)}
  5513. catch(err){if(_default!==undefined)return _default
  5514. throw err}
  5515. if(res!==undefined){return res}
  5516. if(_default !==undefined){return _default}
  5517. var cname=klass.__name__
  5518. if(is_class){cname=obj.__name__}
  5519. attr_error(attr,cname)}
  5520. function globals(){
  5521. return $B.obj_dict($B.last($B.frames_stack)[3])}
  5522. function hasattr(obj,attr){try{getattr(obj,attr);return true}
  5523. catch(err){return false}}
  5524. function hash(obj){if(arguments.length!=1){throw _b_.TypeError("hash() takes exactly one argument ("+
  5525. arguments.length+" given)")}
  5526. if(obj===undefined)console.log('hash:obj is undefined',obj)
  5527. if(obj.__hashvalue__ !==undefined)return obj.__hashvalue__
  5528. if(isinstance(obj,_b_.int))return obj.valueOf()
  5529. if(isinstance(obj,bool))return _b_.int(obj)
  5530. if(obj.__hash__ !==undefined){return obj.__hashvalue__=obj.__hash__()}
  5531. if(obj.__class__===$B.$factory){return obj.__hashvalue__=$B.$py_next_hash--}
  5532. var hashfunc=getattr(obj,'__hash__',_b_.None)
  5533. if(hashfunc==_b_.None){
  5534. throw _b_.TypeError("unhashable type: '"+
  5535. $B.get_class(obj).__name__+"'",'hash')}
  5536. if(hashfunc.$infos===undefined){return obj.__hashvalue__=hashfunc()}
  5537. if(hashfunc.$infos.__func__===_b_.object.$dict.__hash__){if(getattr(obj,'__eq__').$infos.__func__!==_b_.object.$dict.__eq__){throw _b_.TypeError("unhashable type: '"+
  5538. $B.get_class(obj).__name__+"'",'hash')}else{return _b_.object.$dict.__hash__(obj)}}else{return obj.__hashvalue__=hashfunc()}}
  5539. function _get_builtins_doc(){if($B.builtins_doc===undefined){
  5540. var url=$B.brython_path
  5541. if(url.charAt(url.length-1)=='/'){url=url.substr(0,url.length-1)}
  5542. url +='/builtins_docstrings.js'
  5543. var f=_b_.open(url)
  5544. eval(f.$content)
  5545. $B.builtins_doc=docs}}
  5546. function help(obj){if(obj===undefined)obj='help'
  5547. if(typeof obj=='string' && _b_[obj]!==undefined){_get_builtins_doc()
  5548. var _doc=$B.builtins_doc[obj]
  5549. if(_doc !==undefined && _doc !=''){_b_.print(_doc)
  5550. return}}
  5551. for(var i=0;i<builtin_names.length;i++){if(obj===_b_[builtin_names[i]]){_get_builtins_doc()
  5552. _b_.print(_doc=$B.builtins_doc[builtin_names[i]])}}
  5553. if(typeof obj=='string'){$B.$import("pydoc");
  5554. var pydoc=$B.imported["pydoc"]
  5555. getattr(getattr(pydoc,"help"),"__call__")(obj)
  5556. return}
  5557. try{return getattr(obj,'__doc__')}
  5558. catch(err){console.log('help err '+err);return ''}}
  5559. function hex(x){return $builtin_base_convert_helper(x,16)}
  5560. function id(obj){if(isinstance(obj,[_b_.str,_b_.int,_b_.float])){return getattr(_b_.str(obj),'__hash__')()}else if(obj.$id!==undefined){return obj.$id}
  5561. else{return obj.$id=$B.UUID()}}
  5562. function __import__(mod_name,globals,locals,fromlist,level){
  5563. var $=$B.args('__import__',5,{name:null,globals:null,locals:null,fromlist:null,level:null},['name','globals','locals','fromlist','level'],arguments,{globals:None,locals:None,fromlist:_b_.tuple(),level:0},null,null)
  5564. return $B.$__import__($.name,$.globals,$.locals,$.fromlist);}
  5565. function input(src){var stdin=($B.imported.sys && $B.imported.sys.stdin ||$B.stdin);
  5566. if(stdin.__original__){return prompt(src);}
  5567. var val=_b_.getattr(stdin,'readline')();
  5568. val=val.split('\n')[0];
  5569. if(stdin.len===stdin.pos){_b_.getattr(stdin,'close')();}
  5570. return val;}
  5571. function isinstance(obj,arg){if(obj===null)return arg===None
  5572. if(obj===undefined)return false
  5573. if(arg.constructor===Array){for(var i=0;i<arg.length;i++){if(isinstance(obj,arg[i]))return true}
  5574. return false}
  5575. if(arg===_b_.int &&(obj===True ||obj===False)){return True}
  5576. var klass=obj.__class__
  5577. if(klass==undefined){if(typeof obj=='string' && arg==_b_.str){return true}
  5578. if(obj.contructor==Number && arg==_b_.float){return true}
  5579. if(typeof obj=='number' && arg==_b_.int){return true}
  5580. klass=$B.get_class(obj)}
  5581. if(klass===undefined){return false }
  5582. if(arg.$dict===undefined){return false}
  5583. if(klass==$B.$factory){klass=obj.$dict.__class__}
  5584. function check(kl,arg){if(kl===arg.$dict){return true}
  5585. else if(arg===_b_.str &&
  5586. kl===$B.$StringSubclassFactory.$dict){return true}
  5587. else if(arg===_b_.list &&
  5588. kl===$B.$ListSubclassFactory.$dict){return true}}
  5589. if(check(klass,arg)){return true}
  5590. var mro=klass.__mro__
  5591. for(var i=0;i<mro.length;i++){if(check(mro[i],arg)){return true}}
  5592. var hook=getattr(arg,'__instancecheck__',null)
  5593. if(hook!==null){return hook(obj)}
  5594. return false}
  5595. function issubclass(klass,classinfo){if(arguments.length!==2){throw _b_.TypeError("issubclass expected 2 arguments, got "+arguments.length)}
  5596. if(!klass.__class__ ||klass.__class__!==$B.$factory){throw _b_.TypeError("issubclass() arg 1 must be a class")}
  5597. if(isinstance(classinfo,_b_.tuple)){for(var i=0;i<classinfo.length;i++){if(issubclass(klass,classinfo[i]))return true}
  5598. return false}
  5599. if(classinfo.__class__.is_class){if(klass.$dict===classinfo.$dict ||
  5600. klass.$dict.__mro__.indexOf(classinfo.$dict)>-1){return true}}
  5601. var hook=getattr(classinfo,'__subclasscheck__',null)
  5602. if(hook!==null){return hook(klass)}
  5603. return false}
  5604. var iterator_class=$B.make_class({name:'iterator',init:function(self,getitem,len){self.getitem=getitem
  5605. self.len=len
  5606. self.counter=-1}})
  5607. iterator_class.$dict.__next__=function(self){self.counter++
  5608. if(self.len!==null && self.counter==self.len){throw _b_.StopIteration('')}
  5609. try{return self.getitem(self.counter)}
  5610. catch(err){throw _b_.StopIteration('')}}
  5611. function iter(obj){try{var _iter=getattr(obj,'__iter__')}
  5612. catch(err){var gi=getattr(obj,'__getitem__',null),ln=getattr(obj,'__len__',null)
  5613. if(gi!==null){if(ln!==null){var len=getattr(ln,'__call__')()
  5614. return iterator_class(gi,len)}else{return iterator_class(gi,null)}}
  5615. throw _b_.TypeError("'"+$B.get_class(obj).__name__+"' object is not iterable")}
  5616. var res=_iter()
  5617. try{getattr(res,'__next__')}
  5618. catch(err){if(isinstance(err,_b_.AttributeError)){throw _b_.TypeError(
  5619. "iter() returned non-iterator of type '"+
  5620. $B.get_class(res).__name__+"'")}}
  5621. return res}
  5622. function len(obj){try{return getattr(obj,'__len__')()}
  5623. catch(err){throw _b_.TypeError("object of type '"+$B.get_class(obj).__name__+
  5624. "' has no len()")}}
  5625. function locals(){
  5626. var locals_obj=$B.last($B.frames_stack)[1]
  5627. return $B.obj_dict(locals_obj)}
  5628. var $MapDict={__class__:$B.$type,__name__:'map'}
  5629. $MapDict.__mro__=[$ObjectDict]
  5630. $MapDict.__iter__=function(self){return self}
  5631. function map(){var func=getattr(arguments[0],'__call__')
  5632. var iter_args=[],pos=0
  5633. for(var i=1;i<arguments.length;i++){iter_args[pos++]=iter(arguments[i])}
  5634. var __next__=function(){var args=[],pos=0
  5635. for(var i=0;i<iter_args.length;i++){args[pos++]=next(iter_args[i])}
  5636. return func.apply(null,args)}
  5637. var obj={__class__:$MapDict,__repr__:function(){return "<map object>"},__str__:function(){return "<map object>"},__next__: __next__}
  5638. return obj}
  5639. function $extreme(args,op){
  5640. var $op_name='min'
  5641. if(op==='__gt__')$op_name="max"
  5642. if(args.length==0){throw _b_.TypeError($op_name+" expected 1 arguments, got 0")}
  5643. var last_arg=args[args.length-1],nb_args=args.length,has_default=false,func=false
  5644. if(last_arg.$nat=='kw'){nb_args--
  5645. last_arg=last_arg.kw
  5646. for(var attr in last_arg){switch(attr){case 'key':
  5647. func=last_arg[attr]
  5648. break
  5649. case '$$default':
  5650. var default_value=last_arg[attr]
  5651. has_default=true
  5652. break
  5653. default:
  5654. throw _b_.TypeError("'"+attr+"' is an invalid keyword argument for this function")}}}
  5655. if(!func){func=function(x){return x}}
  5656. if(nb_args==0){throw _b_.TypeError($op_name+" expected 1 arguments, got 0")}else if(nb_args==1){
  5657. var $iter=iter(args[0]),res=null
  5658. while(true){try{var x=next($iter)
  5659. if(res===null ||bool(getattr(func(x),op)(func(res)))){res=x}}catch(err){if(err.__name__=="StopIteration"){if(res===null){if(has_default){return default_value}
  5660. else{throw _b_.ValueError($op_name+"() arg is an empty sequence")}}else{return res}}
  5661. throw err}}}else{if(has_default){throw _b_.TypeError("Cannot specify a default for "+$op_name+"() with multiple positional arguments")}
  5662. var res=null
  5663. for(var i=0;i<nb_args;i++){var x=args[i]
  5664. if(res===null ||bool(getattr(func(x),op)(func(res)))){res=x}}
  5665. return res}}
  5666. function max(){var args=[],pos=0
  5667. for(var i=0;i<arguments.length;i++){args[pos++]=arguments[i]}
  5668. return $extreme(args,'__gt__')}
  5669. function memoryview(obj){throw NotImplementedError('memoryview is not implemented')}
  5670. function min(){var args=[],pos=0
  5671. for(var i=0;i<arguments.length;i++){args[pos++]=arguments[i]}
  5672. return $extreme(args,'__lt__')}
  5673. function next(obj){var ga=getattr(obj,'__next__')
  5674. if(ga!==undefined)return ga()
  5675. throw _b_.TypeError("'"+$B.get_class(obj).__name__+
  5676. "' object is not an iterator")}
  5677. function _NotImplemented(){return{__class__:_NotImplemented.$dict}}
  5678. _NotImplemented.__class__=$B.$factory
  5679. _NotImplemented.$dict={$factory: _NotImplemented,__class__: $B.$type,__name__: 'NotImplementedType'}
  5680. _NotImplemented.$dict.__mro__=[$ObjectDict]
  5681. var NotImplemented={__class__ : _NotImplemented.$dict,__str__: function(){return 'NotImplemented'}}
  5682. function $not(obj){return !bool(obj)}
  5683. function oct(x){return $builtin_base_convert_helper(x,8)}
  5684. function ord(c){
  5685. if(typeof c=='string'){if(c.length==1)return c.charCodeAt(0)
  5686. throw _b_.TypeError('ord() expected a character, but string of length ' +
  5687. c.length + ' found')}
  5688. switch($B.get_class(c)){case _b_.str.$dict:
  5689. if(c.length==1)return c.charCodeAt(0)
  5690. throw _b_.TypeError('ord() expected a character, but string of length ' +
  5691. c.length + ' found')
  5692. case _b_.bytes.$dict:
  5693. case _b_.bytearray.$dict:
  5694. if(c.source.length==1)return c.source[0]
  5695. throw _b_.TypeError('ord() expected a character, but string of length ' +
  5696. c.source.length + ' found')
  5697. default:
  5698. throw _b_.TypeError('ord() expected a character, but ' +
  5699. $B.get_class(c).__name__ + ' was found')}}
  5700. function pow(){var $ns=$B.args('pow',3,{x:null,y:null,z:null},['x','y','z'],arguments,{z:null},null,null)
  5701. var x=$ns['x'],y=$ns['y'],z=$ns['z']
  5702. var res=getattr(x,'__pow__')(y)
  5703. if(z===null){return res}
  5704. else{if(x!=_b_.int(x)||y !=_b_.int(y)){throw _b_.TypeError("pow() 3rd argument not allowed unless "+
  5705. "all arguments are integers")}
  5706. return getattr(res,'__mod__')(z)}}
  5707. function $print(){var $ns=$B.args('print',0,{},[],arguments,{},'args','kw')
  5708. var ks=$ns['kw'].$string_dict
  5709. var end=ks['end']===undefined ? '\n' : ks['end'],sep=ks['sep']===undefined ? ' ' : ks['sep'],file=ks['file']===undefined ? $B.stdout : ks['file'],args=$ns['args']
  5710. getattr(file,'write')(args.map(_b_.str).join(sep)+end)
  5711. return None}
  5712. $print.__name__='print'
  5713. $print.is_func=true
  5714. var $PropertyDict={__class__ : $B.$type,__name__ : 'property',}
  5715. $PropertyDict.__mro__=[$ObjectDict]
  5716. $B.$PropertyDict=$PropertyDict
  5717. function property(fget,fset,fdel,doc){var p={__class__ : $PropertyDict,__doc__ : doc ||"",$type:fget.$type,fget:fget,fset:fset,fdel:fdel,toString:function(){return '<property>'}}
  5718. p.__get__=function(self,obj,objtype){if(obj===undefined)return self
  5719. if(self.fget===undefined)throw _b_.AttributeError("unreadable attribute")
  5720. return getattr(self.fget,'__call__')(obj)}
  5721. if(fset!==undefined){p.__set__=function(self,obj,value){if(self.fset===undefined)throw _b_.AttributeError("can't set attribute")
  5722. getattr(self.fset,'__call__')(obj,value)}}
  5723. p.__delete__=fdel;
  5724. p.getter=function(fget){return property(fget,p.fset,p.fdel,p.__doc__)}
  5725. p.setter=function(fset){return property(p.fget,fset,p.fdel,p.__doc__)}
  5726. p.deleter=function(fdel){return property(p.fget,p.fset,fdel,p.__doc__)}
  5727. return p}
  5728. property.__class__=$B.$factory
  5729. property.$dict=$PropertyDict
  5730. $PropertyDict.$factory=property
  5731. function repr(obj){if(obj.__class__===$B.$factory){
  5732. var func=$B.$type.__getattribute__(obj.$dict.__class__,'__repr__')
  5733. return func(obj)}
  5734. var func=getattr(obj,'__repr__')
  5735. if(func!==undefined){return func()}
  5736. throw _b_.AttributeError("object has no attribute __repr__")}
  5737. var $ReversedDict={__class__:$B.$type,__name__:'reversed'}
  5738. $ReversedDict.__mro__=[$ObjectDict]
  5739. $ReversedDict.__iter__=function(self){return self}
  5740. $ReversedDict.__next__=function(self){self.$counter--
  5741. if(self.$counter<0)throw _b_.StopIteration('')
  5742. return self.getter(self.$counter)}
  5743. function reversed(seq){
  5744. try{return getattr(seq,'__reversed__')()}
  5745. catch(err){if(err.__name__!='AttributeError'){throw err}}
  5746. try{var res={__class__:$ReversedDict,$counter : getattr(seq,'__len__')(),getter:getattr(seq,'__getitem__')}
  5747. return res}catch(err){throw _b_.TypeError("argument to reversed() must be a sequence")}}
  5748. reversed.__class__=$B.$factory
  5749. reversed.$dict=$ReversedDict
  5750. $ReversedDict.$factory=reversed
  5751. function round(arg,n){if(!isinstance(arg,[_b_.int,_b_.float])){if(!hasattr(arg,'__round__'))
  5752. throw _b_.TypeError("type "+arg.__class__+" doesn't define __round__ method")
  5753. if(n===undefined)return getattr(arg,'__round__')()
  5754. else return getattr(arg,'__round__')(n)}
  5755. if(isinstance(arg,_b_.float)&&(arg.value===Infinity ||arg.value===-Infinity)){throw _b_.OverflowError("cannot convert float infinity to integer")}
  5756. if(n===undefined){var floor=Math.floor(arg)
  5757. var diff=Math.abs(arg-floor)
  5758. if(diff==0.5){if(floor % 2){return Math.round(arg)}else{return Math.floor(arg)}}else{return _b_.int(Math.round(arg))}}
  5759. if(!isinstance(n,_b_.int)){throw _b_.TypeError(
  5760. "'"+n.__class__+"' object cannot be interpreted as an integer")}
  5761. var mult=Math.pow(10,n)
  5762. if(isinstance(arg,_b_.float)){return _b_.float(_b_.int.$dict.__truediv__(Number(Math.round(arg.valueOf()*mult)),mult))}else{
  5763. return _b_.int(_b_.int.$dict.__truediv__(Number(Math.round(arg.valueOf()*mult)),mult))}}
  5764. function setattr(obj,attr,value){if(!(typeof attr=='string')){throw _b_.TypeError("setattr(): attribute name must be string")}
  5765. switch(attr){case 'alert':
  5766. case 'case':
  5767. case 'catch':
  5768. case 'constructor':
  5769. case 'Date':
  5770. case 'delete':
  5771. case 'default':
  5772. case 'document':
  5773. case 'Error':
  5774. case 'history':
  5775. case 'function':
  5776. case 'location':
  5777. case 'Math':
  5778. case 'new':
  5779. case 'Number':
  5780. case 'RegExp':
  5781. case 'this':
  5782. case 'throw':
  5783. case 'var':
  5784. case 'super':
  5785. case 'window':
  5786. attr='$$'+attr
  5787. break
  5788. case '__class__':
  5789. obj.__class__=value.$dict;
  5790. return None}
  5791. if(obj.__class__===$B.$factory){
  5792. if(obj.$dict.$methods && typeof value=='function'
  5793. && value.__class__!==$B.$factory
  5794. && value.__class__!==$B.$MethodDict
  5795. ){
  5796. obj.$dict.$methods[attr]=$B.make_method(attr,obj.$dict,value,value)
  5797. return None}else{obj.$dict[attr]=value;return None}}
  5798. var res=obj[attr],klass=obj.__class__ ||$B.get_class(obj)
  5799. if(res===undefined && klass){res=klass[attr]
  5800. if(res===undefined){var mro=klass.__mro__,_len=mro.length
  5801. for(var i=0;i<_len;i++){res=mro[i][attr]
  5802. if(res!==undefined)break}}}
  5803. if(res!==undefined){
  5804. if(res.__set__!==undefined){res.__set__(res,obj,value);return None}
  5805. var rcls=res.__class__,__set1__
  5806. if(rcls!==undefined){var __set1__=rcls.__set__
  5807. if(__set1__===undefined){var mro=rcls.__mro__
  5808. for(var i=0,_len=mro.length;i<_len;i++){__set1__=mro[i].__set__
  5809. if(__set1__){break}}}}
  5810. if(__set1__!==undefined){var __set__=getattr(res,'__set__',null)
  5811. if(__set__ &&(typeof __set__=='function')){__set__.apply(res,[obj,value]);return None}}}
  5812. if(klass && klass.$slots && klass.$slots[attr]===undefined){throw _b_.AttributeError("'"+klass.__name__+"' object has no attribute'"+
  5813. attr+"'")}
  5814. var _setattr=false
  5815. if(klass!==undefined){_setattr=klass.__setattr__
  5816. if(_setattr===undefined){var mro=klass.__mro__
  5817. for(var i=0,_len=mro.length;i<_len;i++){_setattr=mro[i].__setattr__
  5818. if(_setattr){break}}}}
  5819. if(!_setattr){obj[attr]=value}else{_setattr(obj,attr,value)}
  5820. return None}
  5821. function sorted(){var $=$B.args('sorted',1,{iterable:null},['iterable'],arguments,{},null,'kw')
  5822. var _list=_b_.list(iter($.iterable)),args=[_list]
  5823. for(var i=1;i<arguments.length;i++){args.push(arguments[i])}
  5824. _b_.list.$dict.sort.apply(null,args)
  5825. return _list}
  5826. var $StaticmethodDict={__class__:$B.$type,__name__:'staticmethod'}
  5827. $StaticmethodDict.__mro__=[$ObjectDict]
  5828. function staticmethod(func){func.$type='staticmethod'
  5829. return func}
  5830. staticmethod.__class__=$B.$factory
  5831. staticmethod.$dict=$StaticmethodDict
  5832. $StaticmethodDict.$factory=staticmethod
  5833. function sum(iterable,start){if(start===undefined){start=0}else{
  5834. if(typeof start==='str'){throw _b_.TypeError("TypeError: sum() can't sum strings [use ''.join(seq) instead]")}
  5835. if(_b_.isinstance(start,_b_.bytes)){throw _b_.TypeError("TypeError: sum() can't sum bytes [use b''.join(seq) instead]")}}
  5836. var res=start
  5837. var iterable=iter(iterable)
  5838. while(1){try{var _item=next(iterable)
  5839. res=getattr(res,'__add__')(_item)}catch(err){if(err.__name__==='StopIteration'){break}
  5840. else{throw err}}}
  5841. return res}
  5842. var $SuperDict={__class__:$B.$type,__name__:'super'}
  5843. $SuperDict.__getattribute__=function(self,attr){if($SuperDict[attr]!==undefined){
  5844. return function(){return $SuperDict[attr](self)}}
  5845. var mro=self.__thisclass__.$dict.__mro__,res
  5846. for(var i=0;i<mro.length;i++){
  5847. res=mro[i][attr]
  5848. if(res!==undefined){
  5849. if(res.__class__===$PropertyDict){return res.__get__(res,self.__self_class__)}
  5850. if(self.__self_class__!==None){if(mro[i]===_b_.object.$dict){var klass=self.__self_class__.__class__
  5851. if(klass!==$B.$type){if(klass.__mro__[0]===klass){console.log('anomalie',klass)}
  5852. var start=-1,mro2=[klass].concat(klass.__mro__)
  5853. for(var j=0;j<mro2.length;j++){if(mro2[j]===self.__thisclass__.$dict){start=j+1
  5854. break}}
  5855. if(start>-1){for(var j=start;j<mro2.length;j++){var res1=mro2[j][attr]
  5856. if(res1!==undefined){res=res1;break}}}}}
  5857. var _args=[self.__self_class__]
  5858. if(attr=='__new__'){_args=[]}
  5859. var method=(function(initial_args){return function(){
  5860. var local_args=initial_args.slice()
  5861. var pos=initial_args.length
  5862. for(var i=0;i<arguments.length;i++){local_args[pos++]=arguments[i]}
  5863. var x=res.apply(null,local_args)
  5864. if(x===undefined)return None
  5865. return x}})(_args)
  5866. method.__class__={__class__:$B.$type,__name__:'method',__mro__:[$ObjectDict]}
  5867. method.__func__=res
  5868. method.__self__=self
  5869. return method}
  5870. return res}}
  5871. throw _b_.AttributeError("object 'super' has no attribute '"+attr+"'")}
  5872. $SuperDict.__mro__=[$ObjectDict]
  5873. $SuperDict.__repr__=$SuperDict.__str__=function(self){var res="<super: <class '"+self.__thisclass__.$dict.__name__+"'"
  5874. if(self.__self_class__!==undefined){res +=', <'+self.__self_class__.__class__.__name__+' object>'}
  5875. return res+'>'}
  5876. function $$super(_type1,_type2){return{__class__:$SuperDict,__thisclass__:_type1,__self_class__:(_type2 ||None)}}
  5877. $$super.$dict=$SuperDict
  5878. $$super.__class__=$B.$factory
  5879. $SuperDict.$factory=$$super
  5880. $$super.$is_func=true
  5881. var $Reader={__class__:$B.$type,__name__:'reader'}
  5882. $Reader.__enter__=function(self){return self}
  5883. $Reader.__exit__=function(self){return false}
  5884. $Reader.__iter__=function(self){return iter(self.$lines)}
  5885. $Reader.__len__=function(self){return self.lines.length}
  5886. $Reader.__mro__=[$ObjectDict]
  5887. $Reader.close=function(self){self.closed=true}
  5888. $Reader.read=function(self,nb){if(self.closed===true)throw _b_.ValueError('I/O operation on closed file')
  5889. if(nb===undefined)return self.$content
  5890. self.$counter+=nb
  5891. if(self.$bin){var res=self.$content.source.slice(self.$counter-nb,self.$counter)
  5892. return _b_.bytes(res)}
  5893. return self.$content.substr(self.$counter-nb,nb)}
  5894. $Reader.readable=function(self){return true}
  5895. $Reader.readline=function(self,limit){
  5896. self.$lc=self.$lc===undefined ? -1 : self.$lc
  5897. if(self.closed===true)throw _b_.ValueError('I/O operation on closed file')
  5898. if(self.$lc==self.$lines.length-1){return self.$bin ? _b_.bytes(): ''}
  5899. self.$lc++
  5900. var res=self.$lines[self.$lc]
  5901. self.$counter +=(self.$bin ? res.source.length : res.length)
  5902. return res}
  5903. $Reader.readlines=function(self,hint){if(self.closed===true)throw _b_.ValueError('I/O operation on closed file')
  5904. self.$lc=self.$lc===undefined ? -1 : self.$lc
  5905. return self.$lines.slice(self.$lc+1)}
  5906. $Reader.seek=function(self,offset,whence){if(self.closed===True)throw _b_.ValueError('I/O operation on closed file')
  5907. if(whence===undefined)whence=0
  5908. if(whence===0){self.$counter=offset}
  5909. else if(whence===1){self.$counter +=offset}
  5910. else if(whence===2){self.$counter=self.$content.length+offset}}
  5911. $Reader.seekable=function(self){return true}
  5912. $Reader.tell=function(self){return self.$counter}
  5913. $Reader.writable=function(self){return false}
  5914. var $BufferedReader={__class__:$B.$type,__name__:'_io.BufferedReader'}
  5915. $BufferedReader.__mro__=[$Reader,$ObjectDict]
  5916. var $TextIOWrapper={__class__:$B.$type,__name__:'_io.TextIOWrapper'}
  5917. $TextIOWrapper.__mro__=[$Reader,$ObjectDict]
  5918. function $url_open(){
  5919. var $ns=$B.args('open',3,{file:null,mode:null,encoding:null},['file','mode','encoding'],arguments,{mode:'r',encoding:'utf-8'},'args','kw'),$res
  5920. for(var attr in $ns){eval('var '+attr+'=$ns["'+attr+'"]')}
  5921. if(args.length>0)var mode=args[0]
  5922. if(args.length>1)var encoding=args[1]
  5923. var is_binary=mode.search('b')>-1
  5924. if(isinstance(file,$B.JSObject))return new $OpenFile(file.js,mode,encoding)
  5925. if(isinstance(file,_b_.str)){
  5926. if(window.XMLHttpRequest){
  5927. var req=new XMLHttpRequest();}else{
  5928. var req=new ActiveXObject("Microsoft.XMLHTTP");}
  5929. req.onreadystatechange=function(){try{
  5930. var status=this.status
  5931. if(status===404){$res=_b_.IOError('File '+file+' not found')}else if(status!==200){$res=_b_.IOError('Could not open file '+file+' : status '+status)}else{$res=this.responseText
  5932. if(is_binary){$res=_b_.str.$dict.encode($res,'utf-8')}}}catch(err){$res=_b_.IOError('Could not open file '+file+' : error '+err)}}
  5933. var fake_qs='?foo='+$B.UUID()
  5934. req.open('GET',file+fake_qs,false)
  5935. if(is_binary){req.overrideMimeType('text/plain; charset=utf-8');}
  5936. req.send()
  5937. if($res.constructor===Error)throw $res
  5938. if(is_binary){var lf=_b_.bytes('\n','ascii'),lines=_b_.bytes.$dict.split($res,lf)
  5939. for(var i=0;i<lines.length-1;i++){lines[i].source.push(10)}}else{var lines=$res.split('\n')
  5940. for(var i=0;i<lines.length-1;i++){lines[i]+='\n'}}
  5941. var res={$content:$res,$counter:0,$lines:lines,$bin:is_binary,closed:False,encoding:encoding,mode:mode,name:file}
  5942. res.__class__=is_binary ? $BufferedReader : $TextIOWrapper
  5943. return res}}
  5944. var $ZipDict={__class__:$B.$type,__name__:'zip'}
  5945. var $zip_iterator=$B.$iterator_class('zip_iterator')
  5946. $ZipDict.__iter__=function(self){
  5947. return self.$iterator=self.$iterator ||
  5948. $B.$iterator(self.items,$zip_iterator)}
  5949. $ZipDict.__mro__=[$ObjectDict]
  5950. function zip(){var res={__class__:$ZipDict,items:[]}
  5951. if(arguments.length==0)return res
  5952. var $ns=$B.args('zip',0,{},[],arguments,{},'args','kw')
  5953. var _args=$ns['args']
  5954. var args=[],pos=0
  5955. for(var i=0;i<_args.length;i++){args[pos++]=iter(_args[i])}
  5956. var rank=0,items=[]
  5957. while(1){var line=[],flag=true,pos=0
  5958. for(var i=0;i<args.length;i++){try{line[pos++]=next(args[i])}catch(err){if(err.__name__==='StopIteration'){flag=false;break}
  5959. else{throw err}}}
  5960. if(!flag)break
  5961. items[rank++]=_b_.tuple(line)}
  5962. res.items=items
  5963. return res}
  5964. zip.__class__=$B.$factory
  5965. zip.$dict=$ZipDict
  5966. $ZipDict.$factory=zip
  5967. function no_set_attr(klass,attr){if(klass[attr]!==undefined){throw _b_.AttributeError("'"+klass.__name__+"' object attribute '"+
  5968. attr+"' is read-only")}else{throw _b_.AttributeError("'"+klass.__name__+
  5969. "' object has no attribute '"+attr+"'")}}
  5970. var $BoolDict=$B.$BoolDict={__class__:$B.$type,__dir__:$ObjectDict.__dir__,__name__:'bool'}
  5971. bool.__class__=$B.$factory
  5972. bool.$dict=$BoolDict
  5973. $BoolDict.$factory=bool
  5974. var True=true
  5975. var False=false
  5976. var $EllipsisDict={__class__:$B.$type,__name__:'ellipsis'}
  5977. $EllipsisDict.__mro__=[$ObjectDict]
  5978. var Ellipsis={$dict: $EllipsisDict,__bool__ : function(){return True},__class__ : $EllipsisDict}
  5979. $EllipsisDict.$factory=Ellipsis
  5980. for(var $key in $B.$comps){
  5981. switch($B.$comps[$key]){case 'ge':
  5982. case 'gt':
  5983. case 'le':
  5984. case 'lt':
  5985. Ellipsis['__'+$B.$comps[$key]+'__']=(function(k){return function(other){throw _b_.TypeError("unorderable types: ellipsis() "+k+" "+
  5986. $B.get_class(other).__name__)}})($key)}}
  5987. for(var $func in Ellipsis){if(typeof Ellipsis[$func]==='function'){Ellipsis[$func].__str__=(function(f){return function(){return "<method-wrapper "+f+" of Ellipsis object>"}})($func)}}
  5988. var $NoneDict={__class__:$B.$type,__name__:'NoneType'}
  5989. $NoneDict.__mro__=[$ObjectDict]
  5990. $NoneDict.__setattr__=function(self,attr){return no_set_attr($NoneDict,attr)}
  5991. var None={__bool__ : function(){return False},__class__ : $NoneDict,__hash__ : function(){return 0},__repr__ : function(){return 'None'},__str__ : function(){return 'None'},toString : function(){return 'None'}}
  5992. $NoneDict.$factory=function(){return None}
  5993. $NoneDict.$factory.__class__=$B.$factory
  5994. $NoneDict.$factory.$dict=$NoneDict
  5995. for(var $op in $B.$comps){
  5996. var key=$B.$comps[$op]
  5997. switch(key){case 'ge':
  5998. case 'gt':
  5999. case 'le':
  6000. case 'lt':
  6001. $NoneDict['__'+key+'__']=(function(op){return function(other){throw _b_.TypeError("unorderable types: NoneType() "+op+" "+
  6002. $B.get_class(other).__name__+"()")}})($op)}}
  6003. for(var $func in None){if(typeof None[$func]==='function'){None[$func].__str__=(function(f){return function(){return "<method-wrapper "+f+" of NoneType object>"}})($func)}}
  6004. var $FunctionCodeDict={__class__:$B.$type,__name__:'function code'}
  6005. $FunctionCodeDict.__mro__=[$ObjectDict]
  6006. $FunctionCodeDict.$factory={__class__:$B.$factory,$dict:$FunctionCodeDict}
  6007. var $FunctionGlobalsDict={__class:$B.$type,__name__:'function globals'}
  6008. $FunctionGlobalsDict.__mro__=[$ObjectDict]
  6009. $FunctionGlobalsDict.$factory={__class__:$B.$factory,$dict:$FunctionGlobalsDict}
  6010. var $FunctionDict=$B.$FunctionDict={__class__:$B.$type,__code__:{__class__:$FunctionCodeDict,__name__:'function code'},__globals__:{__class__:$FunctionGlobalsDict,__name__:'function globals'},__name__:'function'}
  6011. $FunctionDict.__getattribute__=function(self,attr){
  6012. if(self.$infos && self.$infos[attr]!==undefined){if(attr=='__code__'){var res={__class__:$B.$CodeDict}
  6013. for(var attr in self.$infos.__code__){res[attr]=self.$infos.__code__[attr]}
  6014. return res}else if(attr=='__annotations__'){
  6015. return $B.obj_dict(self.$infos[attr])}else{return self.$infos[attr]}}else{return _b_.object.$dict.__getattribute__(self,attr)}}
  6016. $FunctionDict.__repr__=$FunctionDict.__str__=function(self){return '<function '+self.$infos.__name__+'>'}
  6017. $FunctionDict.__mro__=[$ObjectDict]
  6018. $FunctionDict.__setattr__=function(self,attr,value){if(self.$infos[attr]!==undefined){self.$infos[attr]=value}
  6019. else{self[attr]=value}}
  6020. var $Function=function(){}
  6021. $Function.__class__=$B.$factory
  6022. $FunctionDict.$factory=$Function
  6023. $Function.$dict=$FunctionDict
  6024. _b_.__BRYTHON__=__BRYTHON__
  6025. var builtin_funcs=['abs','all','any','ascii','bin','bool','bytearray','bytes','callable','chr','classmethod','compile','complex','delattr','dict','dir','divmod','enumerate','eval','exec','exit','filter','float','format','frozenset','getattr','globals','hasattr','hash','help','hex','id','input','int','isinstance','issubclass','iter','len','list','locals','map','max','memoryview','min','next','object','oct','open','ord','pow','print','property','quit','range','repr','reversed','round','set','setattr','slice','sorted','staticmethod','str','sum','$$super','tuple','type','vars','zip']
  6026. for(var i=0;i<builtin_funcs.length;i++){var name=builtin_funcs[i]
  6027. if(name=='open'){name1='$url_open'}
  6028. if(name=='super'){name='$$super'}
  6029. if(name=='eval'){name='$eval'}
  6030. $B.builtin_funcs[name]=true}
  6031. $B.builtin_funcs['$eval']=true
  6032. var other_builtins=['Ellipsis','False','None','True','__debug__','__import__','copyright','credits','license','NotImplemented','type']
  6033. var builtin_names=builtin_funcs.concat(other_builtins)
  6034. for(var i=0;i<builtin_names.length;i++){var name=builtin_names[i]
  6035. var orig_name=name
  6036. var name1=name
  6037. if(name=='open'){name1='$url_open'}
  6038. if(name=='super'){name='$$super'}
  6039. if(name=='eval'){name=name1='$$eval'}
  6040. if(name=='print'){name1='$print'}
  6041. $B.bound['__builtins__'][name]=true
  6042. try{_b_[name]=eval(name1)
  6043. if($B.builtin_funcs[name]!==undefined){
  6044. if(_b_[name].__repr__===undefined){
  6045. _b_[name].__repr__=_b_[name].__str__=(function(x){return function(){return '<built-in function '+x+'>'}})(orig_name)}
  6046. _b_[name].__module__='builtins'
  6047. _b_[name].__name__=name
  6048. _b_[name].__defaults__=_b_[name].__defaults__ ||[]
  6049. _b_[name].__kwdefaults__=_b_[name].__kwdefaults__ ||{}
  6050. _b_[name].__annotations__=_b_[name].__annotations__ ||{}}
  6051. _b_[name].__doc__=_b_[name].__doc__ ||''}
  6052. catch(err){}}
  6053. _b_['$$eval']=$eval
  6054. _b_['open']=$url_open
  6055. _b_['print']=$print
  6056. _b_['$$super']=$$super})(__BRYTHON__)
  6057. ;(function($B){eval($B.InjectBuiltins())
  6058. $B.$raise=function(arg){
  6059. if(arg===undefined){var es=$B.current_exception
  6060. if(es!==undefined)throw es
  6061. throw _b_.RuntimeError('No active exception to reraise')}else if(isinstance(arg,BaseException)){throw arg}else if(arg.__class__===$B.$factory && issubclass(arg,BaseException)){throw arg()}else{throw _b_.TypeError("exceptions must derive from BaseException")}}
  6062. $B.$syntax_err_line=function(exc,module,pos,line_num){
  6063. var pos2line={}
  6064. var lnum=1
  6065. var src=$B.$py_src[module]
  6066. if(src===undefined){console.log('no src for',module)}
  6067. var line_pos={1:0}
  6068. for(var i=0,_len_i=src.length;i < _len_i;i++){pos2line[i]=lnum
  6069. if(src.charAt(i)=='\n'){line_pos[++lnum]=i}}
  6070. if(line_num===undefined){line_num=pos2line[pos]}
  6071. exc.$line_info=line_num+','+module
  6072. var lines=src.split('\n')
  6073. var line=lines[line_num-1]
  6074. var lpos=pos-line_pos[line_num]
  6075. var len=line.length
  6076. line=line.replace(/^\s*/,'')
  6077. lpos-=len-line.length
  6078. exc.args=_b_.tuple([$B.$getitem(exc.args,0),module,line_num,lpos,line])}
  6079. $B.$SyntaxError=function(module,msg,pos,line_num,root){if(root!==undefined && root.line_info!==undefined){
  6080. line_num=root.line_info}
  6081. var exc=_b_.SyntaxError(msg)
  6082. $B.$syntax_err_line(exc,module,pos,line_num)
  6083. throw exc}
  6084. $B.$IndentationError=function(module,msg,pos){var exc=_b_.IndentationError(msg)
  6085. $B.$syntax_err_line(exc,module,pos)
  6086. throw exc}
  6087. var $TracebackDict={__class__:$B.$type,__name__:'traceback'}
  6088. $TracebackDict.__getattribute__=function(self,attr){if(self.stack.length==0){alert('no stack',attr)}
  6089. var last_frame=$B.last(self.stack)
  6090. if(last_frame==undefined){alert('last frame undef ');
  6091. console.log(self.stack,Object.keys(self.stack))}
  6092. var line_info=last_frame[1].$line_info
  6093. switch(attr){case 'tb_frame':
  6094. return frame(self.stack)
  6095. case 'tb_lineno':
  6096. if(line_info===undefined){return -1}
  6097. else{return parseInt(line_info.split(',')[0])}
  6098. case 'tb_lasti':
  6099. if(line_info===undefined){return '<unknown>'}
  6100. else{var info=line_info.split(',')
  6101. var src=$B.$py_src[info[1]]
  6102. if(src!==undefined){return src.split('\n')[parseInt(info[0]-1)].trim()}else{return '<unknown>'}}
  6103. case 'tb_next':
  6104. if(self.stack.length==1){return None}
  6105. else{return traceback(self.stack.slice(0,self.stack.length-1))}
  6106. default:
  6107. return $TracebackDict[attr]}}
  6108. $TracebackDict.__mro__=[_b_.object.$dict]
  6109. $TracebackDict.__str__=function(self){return '<traceback object>'}
  6110. function traceback(stack){return{__class__ : $TracebackDict,stack : stack}}
  6111. traceback.__class__=$B.$factory
  6112. traceback.$dict=$TracebackDict
  6113. $TracebackDict.$factory=traceback
  6114. var $FrameDict={__class__:$B.$type,__name__:'frame'}
  6115. $FrameDict.__getattr__=function(self,attr){
  6116. if(attr=='f_back'){if(self.$pos>0){return frame(self.$stack,self.$pos-1)}}}
  6117. $FrameDict.__mro__=[_b_.object.$dict]
  6118. function to_dict(obj){var res=_b_.dict()
  6119. var setitem=_b_.dict.$dict.__setitem__
  6120. for(var attr in obj){if(attr.charAt(0)=='$'){continue}
  6121. setitem(res,attr,obj[attr])}
  6122. return res}
  6123. function frame(stack,pos){var fs=stack
  6124. var res={__class__:$FrameDict,f_builtins :{},
  6125. $stack: stack,}
  6126. if(pos===undefined){pos=fs.length-1}
  6127. res.$pos=pos
  6128. if(fs.length){var _frame=fs[pos]
  6129. var locals_id=_frame[0]
  6130. try{res.f_locals=$B.obj_dict(_frame[1])}catch(err){console.log('err '+err)
  6131. throw err}
  6132. res.f_globals=$B.obj_dict(_frame[3])
  6133. if(_frame[1].$line_info===undefined){res.f_lineno=-1}
  6134. else{res.f_lineno=parseInt(_frame[1].$line_info.split(',')[0])}
  6135. res.f_code={__class__:$B.$CodeDict,co_code:None,
  6136. co_name: locals_id,
  6137. co_filename: _frame[3].__name__ }
  6138. if(res.f_code.co_filename===undefined){console.log(_frame[0],_frame[1],_frame[2],_frame[3]);
  6139. alert('no cofilename')}}
  6140. return res}
  6141. frame.__class__=$B.$factory
  6142. frame.$dict=$FrameDict
  6143. $FrameDict.$factory=frame
  6144. $B._frame=frame
  6145. var $BaseExceptionDict={__class__:$B.$type,__bases__ :[_b_.object],__module__:'builtins',__name__:'BaseException',args:[]}
  6146. $BaseExceptionDict.__init__=function(self){var args=arguments[1]===undefined ?[]:[arguments[1]]
  6147. self.args=_b_.tuple(args)}
  6148. $BaseExceptionDict.__repr__=function(self){return self.__class__.__name__+repr(self.args)}
  6149. $BaseExceptionDict.__str__=function(self){return _b_.str(self.args[0])}
  6150. $BaseExceptionDict.__mro__=[_b_.object.$dict]
  6151. $BaseExceptionDict.__new__=function(cls){var err=_b_.BaseException()
  6152. err.__name__=cls.$dict.__name__
  6153. err.__class__=cls.$dict
  6154. return err}
  6155. $BaseExceptionDict.__getattr__=function(self,attr){if(attr=='info'){var name=self.__class__.__name__
  6156. if(name=='SyntaxError' ||name=='IndentationError'){return 'File "'+self.args[1]+'", line '+self.args[2]+'\n '+
  6157. self.args[4]}
  6158. var info='Traceback (most recent call last):'
  6159. if(self.$js_exc!==undefined){for(var attr in self.$js_exc){if(attr==='message')continue
  6160. try{info +='\n '+attr+' : '+self.$js_exc[attr]}
  6161. catch(_err){}}
  6162. info+='\n'}
  6163. for(var i=0;i<self.$stack.length;i++){var frame=self.$stack[i]
  6164. if(!frame[1]||!frame[1].$line_info){continue}
  6165. var line_info=frame[1].$line_info.split(',')
  6166. if($B.$py_src[line_info[1]]===undefined){continue}
  6167. var lines=$B.$py_src[line_info[1]].split('\n'),module=line_info[1]
  6168. if(module.charAt(0)=='$'){module='<module>'}
  6169. info +='\n module '+module+' line '+line_info[0]
  6170. var line=lines[parseInt(line_info[0])-1]
  6171. if(line)line=line.replace(/^[ ]+/g,'')
  6172. if(line===undefined){console.log('line undef...',line_info,$B.$py_src[line_info[1]])}
  6173. info +='\n '+line}
  6174. return info}else if(attr=='traceback'){
  6175. return traceback(self.$stack)}else{throw AttributeError(self.__class__.__name__+
  6176. "has no attribute '"+attr+"'")}}
  6177. $BaseExceptionDict.with_traceback=function(self,tb){self.traceback=tb
  6178. return self}
  6179. $B.set_func_names($BaseExceptionDict)
  6180. var BaseException=function(){var err=Error()
  6181. err.__name__='BaseException'
  6182. err.args=_b_.tuple(Array.prototype.slice.call(arguments))
  6183. err.__class__=$BaseExceptionDict
  6184. err.$py_error=true
  6185. err.$stack=$B.frames_stack.slice()
  6186. $B.current_exception=err
  6187. eval('//placeholder//');
  6188. return err}
  6189. BaseException.__class__=$B.$factory
  6190. BaseException.$dict=$BaseExceptionDict
  6191. $BaseExceptionDict.$factory=BaseException
  6192. _b_.BaseException=BaseException
  6193. $B.exception=function(js_exc){
  6194. if(!js_exc.$py_error){
  6195. if(js_exc.info===undefined){var _frame=$B.last($B.frames_stack)
  6196. if(_frame===undefined){_frame=$B.pmframe}
  6197. if(_frame && _frame[1].$line_info!==undefined){var line_info=_frame[1].$line_info.split(',')
  6198. var mod_name=line_info[1]
  6199. var module=$B.modules[mod_name]
  6200. if(module){if(module.caller!==undefined){
  6201. var mod_name=line_info[1]}
  6202. var lib_module=mod_name
  6203. var line_num=parseInt(line_info[0])
  6204. if($B.$py_src[mod_name]===undefined){console.log('pas de py_src pour '+mod_name)
  6205. console.log(js_exc)}
  6206. var lines=$B.$py_src[mod_name].split('\n'),msg=js_exc.message.toString()
  6207. msg +="\n module '"+lib_module+"' line "+line_num
  6208. msg +='\n'+lines[line_num-1]
  6209. js_exc.msg=msg
  6210. js_exc.info_in_msg=true}}else{console.log('error ',js_exc)}}
  6211. var exc=Error()
  6212. exc.__name__='Internal Javascript error: '+(js_exc.__name__ ||js_exc.name)
  6213. exc.__class__=_b_.Exception.$dict
  6214. exc.$js_exc=js_exc
  6215. if(js_exc.name=='ReferenceError'){exc.__name__='NameError'
  6216. exc.__class__=_b_.NameError.$dict
  6217. js_exc.message=js_exc.message.replace('$$','')}else if(js_exc.name=="InternalError"){exc.__name__='RuntimeError'
  6218. exc.__class__=_b_.RuntimeError.$dict}
  6219. var $message=js_exc.msg ||'<'+js_exc+'>'
  6220. exc.args=_b_.tuple([$message])
  6221. exc.info=''
  6222. exc.$py_error=true
  6223. exc.$stack=$B.frames_stack.slice()}else{var exc=js_exc}
  6224. $B.current_exception=exc
  6225. return exc}
  6226. $B.is_exc=function(exc,exc_list){
  6227. if(exc.__class__===undefined)exc=$B.exception(exc)
  6228. var exc_class=exc.__class__.$factory
  6229. for(var i=0;i<exc_list.length;i++){if(issubclass(exc_class,exc_list[i]))return true}
  6230. return false}
  6231. $B.clear_exc=function(){$B.current_exception=null}
  6232. function $make_exc(names,parent){
  6233. var _str=[],pos=0
  6234. for(var i=0;i<names.length;i++){var name=names[i],code=''
  6235. if(Array.isArray(name)){
  6236. var code=name[1],name=name[0]}
  6237. $B.bound['__builtins__'][name]=true
  6238. var $exc=(BaseException+'').replace(/BaseException/g,name)
  6239. $exc=$exc.replace('//placeholder//',code)
  6240. _str[pos++]='var $'+name+'Dict={__class__:$B.$type,__name__:"'+name+'"}'
  6241. _str[pos++]='$'+name+'Dict.__bases__ = [parent]'
  6242. _str[pos++]='$'+name+'Dict.__module__ = "builtins"'
  6243. _str[pos++]='$'+name+'Dict.__mro__=[_b_.'+parent.$dict.__name__+
  6244. '.$dict].concat(parent.$dict.__mro__)'
  6245. _str[pos++]='_b_.'+name+'='+$exc
  6246. _str[pos++]='_b_.'+name+'.__class__=$B.$factory'
  6247. _str[pos++]='$'+name+'Dict.$factory=_b_.'+name
  6248. _str[pos++]='_b_.'+name+'.$dict=$'+name+'Dict'}
  6249. eval(_str.join(';'))}
  6250. $make_exc(['SystemExit','KeyboardInterrupt','GeneratorExit','Exception'],BaseException)
  6251. $make_exc([['StopIteration','err.value = arguments[0]'],'ArithmeticError','AssertionError','AttributeError','BufferError','EOFError','ImportError','LookupError','MemoryError','NameError','OSError','ReferenceError','RuntimeError','SyntaxError','SystemError','TypeError','ValueError','Warning'],_b_.Exception)
  6252. $make_exc(['FloatingPointError','OverflowError','ZeroDivisionError'],_b_.ArithmeticError)
  6253. $make_exc(['IndexError','KeyError'],_b_.LookupError)
  6254. $make_exc(['UnboundLocalError'],_b_.NameError)
  6255. $make_exc(['BlockingIOError','ChildProcessError','ConnectionError','FileExistsError','FileNotFoundError','InterruptedError','IsADirectoryError','NotADirectoryError','PermissionError','ProcessLookupError','TimeoutError'],_b_.OSError)
  6256. $make_exc(['BrokenPipeError','ConnectionAbortedError','ConnectionRefusedError','ConnectionResetError'],_b_.ConnectionError)
  6257. $make_exc(['NotImplementedError'],_b_.RuntimeError)
  6258. $make_exc(['IndentationError'],_b_.SyntaxError)
  6259. $make_exc(['TabError'],_b_.IndentationError)
  6260. $make_exc(['UnicodeError'],_b_.ValueError)
  6261. $make_exc(['UnicodeDecodeError','UnicodeEncodeError','UnicodeTranslateError'],_b_.UnicodeError)
  6262. $make_exc(['DeprecationWarning','PendingDeprecationWarning','RuntimeWarning','SyntaxWarning','UserWarning','FutureWarning','ImportWarning','UnicodeWarning','BytesWarning','ResourceWarning'],_b_.Warning)
  6263. $make_exc(['EnvironmentError','IOError','VMSError','WindowsError'],_b_.OSError)
  6264. $B.$NameError=function(name){
  6265. throw _b_.NameError("name '"+name+"' is not defined")}
  6266. $B.$TypeError=function(msg){throw _b_.TypeError(msg)}})(__BRYTHON__)
  6267. ;(function($B){var _b_=$B.builtins,None=_b_.None,$RangeDict={__class__:$B.$type,__dir__:_b_.object.$dict.__dir__,__name__:'range',$native:true,descriptors:{start:true,step:true,stop:true}}
  6268. $RangeDict.__contains__=function(self,other){if($RangeDict.__len__(self)==0){return false}
  6269. try{other=$B.int_or_bool(other)}
  6270. catch(err){
  6271. try{$RangeDict.index(self,other);return true}
  6272. catch(err){return false}}
  6273. var sub=$B.sub(other,self.start),fl=$B.floordiv(sub,self.step),res=$B.mul(self.step,fl)
  6274. if($B.eq(res,sub)){if($B.gt(self.stop,self.start)){return $B.ge(other,self.start)&& $B.gt(self.stop,other)}else{return $B.ge(self.start,other)&& $B.gt(other,self.stop)}}else{return false}}
  6275. $RangeDict.__delattr__=function(self,attr,value){throw _b_.AttributeError('readonly attribute')}
  6276. $RangeDict.__eq__=function(self,other){if(_b_.isinstance(other,range)){var len=$RangeDict.__len__(self)
  6277. if(!$B.eq(len,$RangeDict.__len__(other))){return false}
  6278. if(len==0){return true}
  6279. if(!$B.eq(self.start,other.start)){return false}
  6280. if(len==1){return true}
  6281. return $B.eq(self.step,other.step)}
  6282. return false}
  6283. function compute_item(r,i){var len=$RangeDict.__len__(r)
  6284. if(len==0){return r.start}
  6285. else if(i>len){return r.stop}
  6286. return $B.add(r.start,$B.mul(r.step,i))}
  6287. $RangeDict.__getitem__=function(self,rank){if(_b_.isinstance(rank,_b_.slice)){var norm=_b_.slice.$dict.$conv_for_seq(rank,$RangeDict.__len__(self)),substep=$B.mul(self.step,norm.step),substart=compute_item(self,norm.start),substop=compute_item(self,norm.stop)
  6288. return range(substart,substop,substep)}
  6289. if(typeof rank !="number"){rank=$B.$GetInt(rank)}
  6290. if($B.gt(0,rank)){rank=$B.add(rank,$RangeDict.__len__(self))}
  6291. var res=$B.add(self.start,$B.mul(rank,self.step))
  6292. if(($B.gt(self.step,0)&&($B.ge(res,self.stop)||$B.gt(self.start,res)))||
  6293. ($B.gt(0,self.step)&&($B.ge(self.stop,res)||$B.gt(res,self.start)))){throw _b_.IndexError('range object index out of range')}
  6294. return res }
  6295. $RangeDict.__hash__=function(self){var len=$RangeDict.__len__(self)
  6296. if(len==0){return _b_.hash(_b_.tuple([0,None,None]))}
  6297. if(len==1){return _b_.hash(_b_.tuple([1,self.start,None]))}
  6298. return _b_.hash(_b_.tuple([len,self.start,self.step]))}
  6299. var $RangeIterator=function(obj){return{__class__:$RangeIterator.$dict,obj: obj}}
  6300. $RangeIterator.__class__=$B.$factory
  6301. $RangeIterator.$dict={__class__: $B.$type,__name__: 'range_iterator',$factory: $RangeIterator,__iter__: function(self){return self},__next__: function(self){return _b_.next(self.obj)}}
  6302. $RangeIterator.$dict.__mro__=[_b_.object.$dict]
  6303. $RangeDict.__iter__=function(self){var res={__class__ : $RangeDict,start:self.start,stop:self.stop,step:self.step}
  6304. if(self.$safe){res.$counter=self.start-self.step}else{res.$counter=$B.sub(self.start,self.step)}
  6305. return $RangeIterator(res)}
  6306. $RangeDict.__len__=function(self){var len
  6307. if($B.gt(self.step,0)){if($B.ge(self.start,self.stop)){return 0}
  6308. var n=$B.sub(self.stop,$B.add(1,self.start)),q=$B.floordiv(n,self.step)
  6309. len=$B.add(1,q)}else{if($B.ge(self.stop,self.start)){return 0}
  6310. var n=$B.sub(self.start,$B.add(1,self.stop)),q=$B.floordiv(n,$B.mul(-1,self.step))
  6311. len=$B.add(1,q)}
  6312. if($B.maxsize===undefined){$B.maxsize=$B.LongInt.$dict.__pow__($B.LongInt(2),63)
  6313. $B.maxsize=$B.LongInt.$dict.__sub__($B.maxsize,1)}
  6314. return len}
  6315. $RangeDict.__next__=function(self){if(self.$safe){self.$counter +=self.step
  6316. if((self.step>0 && self.$counter >=self.stop)
  6317. ||(self.step<0 && self.$counter <=self.stop)){throw _b_.StopIteration('')}}else{self.$counter=$B.add(self.$counter,self.step)
  6318. if(($B.gt(self.step,0)&& $B.ge(self.$counter,self.stop))
  6319. ||($B.gt(0,self.step)&& $B.ge(self.stop,self.$counter))){throw _b_.StopIteration('')}}
  6320. return self.$counter}
  6321. $RangeDict.__mro__=[_b_.object.$dict]
  6322. $RangeDict.__reversed__=function(self){var n=$B.sub($RangeDict.__len__(self),1)
  6323. return range($B.add(self.start,$B.mul(n,self.step)),$B.sub(self.start,self.step),$B.mul(-1,self.step))}
  6324. $RangeDict.__repr__=$RangeDict.__str__=function(self){var res='range('+_b_.str(self.start)+', '+_b_.str(self.stop)
  6325. if(self.step!=1)res +=', '+_b_.str(self.step)
  6326. return res+')'}
  6327. $RangeDict.__setattr__=function(self,attr,value){throw _b_.AttributeError('readonly attribute')}
  6328. $RangeDict.start=function(self){return self.start}
  6329. $RangeDict.step=function(self){return self.step},$RangeDict.stop=function(self){return self.stop}
  6330. $RangeDict.count=function(self,ob){if(_b_.isinstance(ob,[_b_.int,_b_.float,_b_.bool])){return _b_.int($RangeDict.__contains__(self,ob))}else{var comp=_b_.getattr(ob,'__eq__'),it=$RangeDict.__iter__(self)
  6331. _next=$RangeIterator.$dict.__next__,nb=0
  6332. while(true){try{if(comp(_next(it))){nb++}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){return nb}
  6333. throw err}}}}
  6334. $RangeDict.index=function(self,other){var $=$B.args('index',2,{self:null,other:null},['self','other'],arguments,{},null,null),self=$.self,other=$.other
  6335. try{other=$B.int_or_bool(other)}catch(err){var comp=_b_.getattr(other,'__eq__'),it=$RangeDict.__iter__(self),_next=$RangeIterator.$dict.__next__,nb=0
  6336. while(true){try{if(comp(_next(it))){return nb}
  6337. nb++}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){throw _b_.ValueError(_b_.str(other)+' not in range')}
  6338. throw err}}}
  6339. var sub=$B.sub(other,self.start),fl=$B.floordiv(sub,self.step),res=$B.mul(self.step,fl)
  6340. if($B.eq(res,sub)){if(($B.gt(self.stop,self.start)&& $B.ge(other,self.start)
  6341. && $B.gt(self.stop,other))||
  6342. ($B.ge(self.start,self.stop)&& $B.ge(self.start,other)
  6343. && $B.gt(other,self.stop))){return fl}else{throw _b_.ValueError(_b_.str(other)+' not in range')}}else{throw _b_.ValueError(_b_.str(other)+' not in range')}}
  6344. function range(){var $=$B.args('range',3,{start:null,stop:null,step:null},['start','stop','step'],arguments,{stop:null,step:null},null,null),start=$.start,stop=$.stop,step=$.step,safe
  6345. if(stop===null && step===null){stop=$B.PyNumber_Index(start)
  6346. safe=typeof stop==="number"
  6347. return{__class__:$RangeDict,start: 0,stop: stop,step: 1,$is_range: true,$safe: safe}}
  6348. if(step===null){step=1}
  6349. start=$B.PyNumber_Index(start)
  6350. stop=$B.PyNumber_Index(stop)
  6351. step=$B.PyNumber_Index(step)
  6352. if(step==0){throw _b_.ValueError("range() arg 3 must not be zero")}
  6353. safe=(typeof start=='number' && typeof stop=='number' &&
  6354. typeof step=='number')
  6355. return{__class__: $RangeDict,start: start,stop: stop,step: step,$is_range: true,$safe: safe}}
  6356. range.__class__=$B.$factory
  6357. range.$dict=$RangeDict
  6358. $RangeDict.$factory=range
  6359. range.$is_func=true
  6360. var $SliceDict={__class__:$B.$type,__name__:'slice',$native:true,descriptors:{start:true,step:true,stop:true}}
  6361. $SliceDict.__mro__=[_b_.object.$dict]
  6362. $SliceDict.__repr__=$SliceDict.__str__=function(self){return 'slice('+_b_.str(self.start)+','+
  6363. _b_.str(self.stop)+','+_b_.str(self.step)+')'}
  6364. $SliceDict.__setattr__=function(self,attr,value){throw _b_.AttributeError('readonly attribute')}
  6365. $SliceDict.$conv=function(self,len){
  6366. return{start: self.start===_b_.None ? 0 : self.start,stop: self.stop===_b_.None ? len : self.stop,step: self.step===_b_.None ? 1 : self.step}}
  6367. $SliceDict.$conv_for_seq=function(self,len){
  6368. var step=self.step===None ? 1 : $B.PyNumber_Index(self.step),step_is_neg=$B.gt(0,step),len_1=$B.sub(len,1)
  6369. if(step==0){throw Error('ValueError : slice step cannot be zero');}
  6370. var start
  6371. if(self.start===None){start=step_is_neg ? len_1 : 0;}else{
  6372. start=$B.PyNumber_Index(self.start);
  6373. if($B.gt(0,start))start=$B.add(start,len);
  6374. if($B.gt(0,start))start=step<0 ? -1 : 0
  6375. if($B.ge(start,len))start=step<0 ? len_1 : len;}
  6376. if(self.stop===None){stop=step_is_neg ? -1 : len;}else{
  6377. stop=$B.PyNumber_Index(self.stop);
  6378. if($B.gt(0,stop))stop +=len
  6379. if($B.gt(0,stop))stop=step<0 ? -1 : 0
  6380. if($B.ge(stop,len))stop=step_is_neg ? len_1 : len;}
  6381. return{start: start,stop: stop,step: step}}
  6382. $SliceDict.start=function(self){return self.start}
  6383. $SliceDict.step=function(self){return self.step}
  6384. $SliceDict.stop=function(self){return self.stop}
  6385. $SliceDict.indices=function(self,length){var len=$B.$GetInt(length)
  6386. if(len < 0)_b_.ValueError('length should not be negative')
  6387. if(self.step > 0){var _len=_b_.min(len,self.stop)
  6388. return _b_.tuple([self.start,_len,self.step])}else if(self.step==_b_.None){var _len=_b_.min(len,self.stop)
  6389. var _start=self.start
  6390. if(_start==_b_.None)_start=0
  6391. return _b_.tuple([_start,_len,1])}
  6392. _b_.NotImplementedError("Error! negative step indices not implemented yet")}
  6393. function slice(){var $=$B.args('slice',3,{start:null,stop:null,step:null},['start','stop','step'],arguments,{stop:null,step:null},null,null),start,stop,step
  6394. if($.stop===null && $.step===null){start=_b_.None
  6395. stop=$.start
  6396. step=_b_.None}else{start=$.start
  6397. stop=$.stop
  6398. step=$.step===null ? _b_.None : $.step}
  6399. var res={__class__ : $SliceDict,start:start,stop:stop,step:step}
  6400. return res}
  6401. slice.__class__=$B.$factory
  6402. slice.$dict=$SliceDict
  6403. $SliceDict.$factory=slice
  6404. slice.$is_func=true
  6405. _b_.range=range
  6406. _b_.slice=slice})(__BRYTHON__)
  6407. ;(function($B){var _b_=$B.builtins
  6408. var $ObjectDict=_b_.object.$dict
  6409. var isinstance=_b_.isinstance,getattr=_b_.getattr,None=_b_.None
  6410. var from_unicode={},to_unicode={}
  6411. var $BytearrayDict={__class__:$B.$type,__name__:'bytearray'}
  6412. var mutable_methods=['__delitem__','clear','copy','count','index','pop','remove','reverse','sort']
  6413. for(var i=0,_len_i=mutable_methods.length;i < _len_i;i++){var method=mutable_methods[i]
  6414. $BytearrayDict[method]=(function(m){return function(self){var args=[self.source],pos=1
  6415. for(var i=1,_len_i=arguments.length;i < _len_i;i++)args[pos++]=arguments[i]
  6416. return _b_.list.$dict[m].apply(null,args)}})(method)}
  6417. var $bytearray_iterator=$B.$iterator_class('bytearray_iterator')
  6418. $BytearrayDict.__iter__=function(self){return $B.$iterator(self.source,$bytearray_iterator)}
  6419. $BytearrayDict.__mro__=[$ObjectDict]
  6420. $BytearrayDict.__repr__=$BytearrayDict.__str__=function(self){return 'bytearray('+$BytesDict.__repr__(self)+")"}
  6421. $BytearrayDict.__setitem__=function(self,arg,value){if(isinstance(arg,_b_.int)){if(!isinstance(value,_b_.int)){throw _b_.TypeError('an integer is required')}else if(value>255){throw _b_.ValueError("byte must be in range(0, 256)")}
  6422. var pos=arg
  6423. if(arg<0)pos=self.source.length+pos
  6424. if(pos>=0 && pos<self.source.length){self.source[pos]=value}
  6425. else{throw _b_.IndexError('list index out of range')}}else if(isinstance(arg,_b_.slice)){var start=arg.start===None ? 0 : arg.start
  6426. var stop=arg.stop===None ? self.source.length : arg.stop
  6427. if(start<0)start=self.source.length+start
  6428. if(stop<0)stop=self.source.length+stop
  6429. self.source.splice(start,stop-start)
  6430. if(_b_.hasattr(value,'__iter__')){var $temp=_b_.list(value)
  6431. for(var i=$temp.length-1;i>=0;i--){if(!isinstance($temp[i],_b_.int)){throw _b_.TypeError('an integer is required')}else if($temp[i]>255){throw ValueError("byte must be in range(0, 256)")}
  6432. self.source.splice(start,0,$temp[i])}}else{throw _b_.TypeError("can only assign an iterable")}}else{
  6433. throw _b_.TypeError('list indices must be integer, not '+$B.get_class(arg).__name__)}}
  6434. $BytearrayDict.append=function(self,b){if(arguments.length!=2){throw _b_.TypeError(
  6435. "append takes exactly one argument ("+(arguments.length-1)+" given)")}
  6436. if(!isinstance(b,_b_.int))throw _b_.TypeError("an integer is required")
  6437. if(b>255)throw ValueError("byte must be in range(0, 256)")
  6438. self.source[self.source.length]=b}
  6439. $BytearrayDict.insert=function(self,pos,b){if(arguments.length!=3){throw _b_.TypeError(
  6440. "insert takes exactly 2 arguments ("+(arguments.length-1)+" given)")}
  6441. if(!isinstance(b,_b_.int))throw _b_.TypeError("an integer is required")
  6442. if(b>255)throw ValueError("byte must be in range(0, 256)")
  6443. _b_.list.$dict.insert(self.source,pos,b)}
  6444. function bytearray(source,encoding,errors){var obj={__class__:$BytearrayDict}
  6445. $BytearrayDict.__init__(obj,source,encoding,errors)
  6446. return obj}
  6447. bytearray.__class__=$B.$factory
  6448. bytearray.$dict=$BytearrayDict
  6449. $BytearrayDict.$factory=bytearray
  6450. bytearray.__code__={}
  6451. bytearray.__code__.co_argcount=1
  6452. bytearray.__code__.co_consts=[]
  6453. bytearray.__code__.co_varnames=['i']
  6454. var $BytesDict={__class__ : $B.$type,__name__ : 'bytes'}
  6455. $BytesDict.__add__=function(self,other){if(!isinstance(other,bytes)){throw _b_.TypeError("can't concat bytes to " + _b_.str(other))}
  6456. self.source=self.source.concat(other.source)
  6457. return self}
  6458. var $bytes_iterator=$B.$iterator_class('bytes_iterator')
  6459. $BytesDict.__iter__=function(self){return $B.$iterator(self.source,$bytes_iterator)}
  6460. $BytesDict.__eq__=function(self,other){return getattr(self.source,'__eq__')(other.source)}
  6461. $BytesDict.__ge__=function(self,other){return _b_.list.$dict.__ge__(self.source,other.source)}
  6462. $BytesDict.__getitem__=function(self,arg){var i
  6463. if(isinstance(arg,_b_.int)){var pos=arg
  6464. if(arg<0)pos=self.source.length+pos
  6465. if(pos>=0 && pos<self.source.length)return self.source[pos]
  6466. throw _b_.IndexError('index out of range')}else if(isinstance(arg,_b_.slice)){var step=arg.step===None ? 1 : arg.step
  6467. if(step>0){var start=arg.start===None ? 0 : arg.start
  6468. var stop=arg.stop===None ? getattr(self.source,'__len__')(): arg.stop}else{var start=arg.start===None ?
  6469. getattr(self.source,'__len__')()-1 : arg.start
  6470. var stop=arg.stop===None ? 0 : arg.stop}
  6471. if(start<0)start=self.source.length+start
  6472. if(stop<0)stop=self.source.length+stop
  6473. var res=[],i=null,pos=0
  6474. if(step>0){if(stop<=start)return ''
  6475. for(i=start;i<stop;i+=step)res[pos++]=self.source[i]}else{
  6476. if(stop>=start)return ''
  6477. for(i=start;i>=stop;i+=step)res[pos++]=self.source[i]}
  6478. return bytes(res)}else if(isinstance(arg,bool)){return self.source.__getitem__(_b_.int(arg))}}
  6479. $BytesDict.__gt__=function(self,other){return _b_.list.$dict.__gt__(self.source,other.source)}
  6480. $BytesDict.__hash__=function(self){if(self===undefined){return $BytesDict.__hashvalue__ ||$B.$py_next_hash-- }
  6481. var hash=1;
  6482. for(var i=0,_len_i=self.length;i < _len_i;i++){hash=(101*hash + self.source[i])& 0xFFFFFFFF}
  6483. return hash}
  6484. $BytesDict.__init__=function(self,source,encoding,errors){var int_list=[],pos=0
  6485. if(source===undefined){}else if(isinstance(source,_b_.int)){var i=source
  6486. while(i--)int_list[pos++]=0}else{if(isinstance(source,_b_.str)){if(encoding===undefined)
  6487. throw _b_.TypeError("string argument without an encoding")
  6488. int_list=encode(source,encoding)}else{
  6489. int_list=_b_.list(source)}}
  6490. self.source=int_list
  6491. self.encoding=encoding
  6492. self.errors=errors}
  6493. $BytesDict.__le__=function(self,other){return _b_.list.$dict.__le__(self.source,other.source)}
  6494. $BytesDict.__len__=function(self){return self.source.length}
  6495. $BytesDict.__lt__=function(self,other){return _b_.list.$dict.__lt__(self.source,other.source)}
  6496. $BytesDict.__mro__=[$ObjectDict]
  6497. $BytesDict.__mul__=function(){var $=$B.args('__mul__',2,{self:null,other:null},['self','other'],arguments,{},null,null),other=$B.PyNumber_Index($.other),res=bytes()
  6498. for(var i=0;i<other;i++){res.source=res.source.concat($.self.source)}
  6499. return res}
  6500. $BytesDict.__ne__=function(self,other){return !$BytesDict.__eq__(self,other)}
  6501. $BytesDict.__repr__=$BytesDict.__str__=function(self){var res="b'"
  6502. for(var i=0,_len_i=self.source.length;i < _len_i;i++){var s=self.source[i]
  6503. if(s<32 ||s>=128){var hx=s.toString(16)
  6504. hx=(hx.length==1 ? '0' : '')+ hx
  6505. res +='\\x'+hx}else{res +=String.fromCharCode(s)}}
  6506. return res+"'"}
  6507. $BytesDict.__reduce_ex__=function(self){return $BytesDict.__repr__(self)}
  6508. $BytesDict.decode=function(self,encoding,errors){if(encoding===undefined)encoding='utf-8'
  6509. if(errors===undefined)errors='strict'
  6510. switch(errors){case 'strict':
  6511. case 'ignore':
  6512. case 'replace':
  6513. case 'surrogateescape':
  6514. case 'xmlcharrefreplace':
  6515. case 'backslashreplace':
  6516. return decode(self.source,encoding,errors)
  6517. default:}}
  6518. $BytesDict.join=function(){var $ns=$B.args('join',2,{self:null,iterable:null},['self','iterable'],arguments,{}),self=$ns['self'],iterable=$ns['iterable']
  6519. var next_func=_b_.getattr(_b_.iter(iterable),'__next__'),res=bytes(),empty=true
  6520. while(true){try{var item=next_func()
  6521. if(empty){empty=false}
  6522. else{res=$BytesDict.__add__(res,self)}
  6523. res=$BytesDict.__add__(res,item)}catch(err){if(isinstance(err,_b_.StopIteration)){break}
  6524. throw err}}
  6525. return res}
  6526. $BytesDict.maketrans=function(from,to){var _t=[]
  6527. for(var i=0;i < 256;i++)_t[i]=i
  6528. for(var i=0,_len_i=from.source.length;i < _len_i;i++){var _ndx=from.source[i]
  6529. _t[_ndx]=to.source[i]}
  6530. return bytes(_t)}
  6531. $BytesDict.split=function(){var $=$B.args('split',2,{self:null,sep:null},['self','sep'],arguments,{},null,null),res=[],start=0,stop=0
  6532. var seps=$.sep.source,len=seps.length,src=$.self.source,blen=src.length
  6533. while(stop<blen){var match=true
  6534. for(var i=0;i<len && match;i++){if(src[stop+i]!=seps[i]){match=false}}
  6535. if(match){res.push(bytes(src.slice(start,stop)))
  6536. start=stop+len
  6537. stop=start}else{stop++}}
  6538. if(match ||(stop>start)){res.push(bytes(src.slice(start,stop)))}
  6539. return res}
  6540. function _strip(self,cars,lr){if(cars===undefined){cars=[],pos=0
  6541. var ws='\r\n \t'
  6542. for(var i=0,_len_i=ws.length;i < _len_i;i++)cars[pos++]=ws.charCodeAt(i)}else if(isinstance(cars,bytes)){cars=cars.source}else{throw _b_.TypeError("Type str doesn't support the buffer API")}
  6543. if(lr=='l'){for(var i=0,_len_i=self.source.length;i < _len_i;i++){if(cars.indexOf(self.source[i])==-1)break}
  6544. return bytes(self.source.slice(i))}
  6545. for(var i=self.source.length-1;i>=0;i--){if(cars.indexOf(self.source[i])==-1)break}
  6546. return bytes(self.source.slice(0,i+1))}
  6547. $BytesDict.lstrip=function(self,cars){return _strip(self,cars,'l')}
  6548. $BytesDict.rstrip=function(self,cars){return _strip(self,cars,'r')}
  6549. $BytesDict.startswith=function(){var $=$B.args('startswith',2,{self: null,start: null},['self','start'],arguments,{},null,null)
  6550. if(_b_.isinstance($.start,bytes)){var res=true
  6551. for(var i=0;i<$.start.source.length && res;i++){res=$.self.source[i]==$.start.source[i]}
  6552. return res}else if(_b_.isinstance($.start,_b_.tuple)){var items=[]
  6553. for(var i=0;i<$.start.length;i++){if(_b_.isinstance($.start[i],bytes)){items=items.concat($.start[i].source)}else{throw _b_.TypeError("startswith first arg must be bytes or "+
  6554. "a tuple of bytes, not "+$B.get_class($.start).__name__)}}
  6555. var start=bytes(items)
  6556. return $BytesDict.startswith($.self,start)}else{throw _b_.TypeError("startswith first arg must be bytes or a tuple of bytes, not "+
  6557. $B.get_class($.start).__name__)}}
  6558. $BytesDict.strip=function(self,cars){var res=$BytesDict.lstrip(self,cars)
  6559. return $BytesDict.rstrip(res,cars)}
  6560. $BytesDict.translate=function(self,table,_delete){if(_delete===undefined){_delete=[]}
  6561. else if(isinstance(_delete,bytes)){_delete=_delete.source}
  6562. else{throw _b_.TypeError("Type "+$B.get_class(_delete).__name+" doesn't support the buffer API")}
  6563. var res=[],pos=0
  6564. if(isinstance(table,bytes)&& table.source.length==256){for(var i=0,_len_i=self.source.length;i < _len_i;i++){if(_delete.indexOf(self.source[i])>-1)continue
  6565. res[pos++]=table.source[self.source[i]]}}
  6566. return bytes(res)}
  6567. $BytesDict.upper=function(self){var _res=[],pos=0
  6568. for(var i=0,_len_i=self.source.length;i < _len_i;i++)_res[pos++]=self.source[i].toUpperCase()
  6569. return bytes(_res)}
  6570. function $UnicodeEncodeError(encoding,code_point,position){throw _b_.UnicodeEncodeError("'"+encoding+
  6571. "' codec can't encode character "+_b_.hex(code_point)+
  6572. " in position "+position)}
  6573. function $UnicodeDecodeError(encoding,position){throw _b_.UnicodeDecodeError("'"+encoding+
  6574. "' codec can't decode bytes in position "+position)}
  6575. function _hex(int){return int.toString(16)}
  6576. function _int(hex){return parseInt(hex,16)}
  6577. function normalise(encoding){var enc=encoding.toLowerCase()
  6578. if(enc.substr(0,7)=='windows'){enc='cp'+enc.substr(7)}
  6579. enc=enc.replace('-','')
  6580. enc=enc.replace('-','_')
  6581. return enc}
  6582. function load_decoder(enc){
  6583. if(to_unicode[enc]===undefined){load_encoder(enc)
  6584. to_unicode[enc]={}
  6585. for(var attr in from_unicode[enc]){to_unicode[enc][from_unicode[enc][attr]]=attr}}}
  6586. function load_encoder(enc){
  6587. if(from_unicode[enc]===undefined){var mod=_b_.__import__('encodings.'+enc),table=mod[enc].decoding_table
  6588. from_unicode[enc]={}
  6589. for(var i=0;i<table.length;i++){from_unicode[enc][table.charCodeAt(i)]=i}}}
  6590. function decode(b,encoding,errors){var s='',enc=normalise(encoding)
  6591. switch(enc){case 'utf_8':
  6592. case 'utf-8':
  6593. case 'utf8':
  6594. case 'U8':
  6595. case 'UTF':
  6596. var i=0,cp
  6597. var _int_800=_int('800'),_int_c2=_int('c2'),_int_1000=_int('1000')
  6598. var _int_e0=_int('e0'),_int_e1=_int('e1'),_int_e3=_int('e3')
  6599. var _int_a0=_int('a0'),_int_80=_int('80'),_int_2000=_int('2000')
  6600. while(i<b.length){if(b[i]<=127){s +=String.fromCharCode(b[i])
  6601. i +=1}else if(b[i]<_int_e0){if(i<b.length-1){cp=b[i+1]+ 64*(b[i]-_int_c2)
  6602. s +=String.fromCharCode(cp)
  6603. i +=2}else{$UnicodeDecodeError(encoding,i)}}else if(b[i]==_int_e0){if(i<b.length-2){var zone=b[i+1]-_int_a0
  6604. cp=b[i+2]-_int_80+_int_800+64*zone
  6605. s +=String.fromCharCode(cp)
  6606. i +=3}else{$UnicodeDecodeError(encoding,i)}}else if(b[i]<_int_e3){if(i<b.length-2){var zone=b[i+1]-_int_80
  6607. cp=b[i+2]-_int_80+_int_1000+64*zone
  6608. s +=String.fromCharCode(cp)
  6609. i +=3}else{$UnicodeDecodeError(encoding,i)}}else{if(i<b.length-2){var zone1=b[i]-_int_e1-1
  6610. var zone=b[i+1]-_int_80+64*zone1
  6611. cp=b[i+2]-_int_80+_int_2000+64*zone
  6612. s +=String.fromCharCode(cp)
  6613. i +=3}else{if(errors=='surrogateescape'){s+='\\udc' + _hex(b[i])
  6614. i+=1}else{
  6615. $UnicodeDecodeError(encoding,i)}}}}
  6616. break;
  6617. case 'latin_1':
  6618. case 'windows1252':
  6619. case 'iso-8859-1':
  6620. case 'iso8859-1':
  6621. case '8859':
  6622. case 'cp819':
  6623. case 'latin':
  6624. case 'latin1':
  6625. case 'L1':
  6626. for(var i=0,_len_i=b.length;i < _len_i;i++)s +=String.fromCharCode(b[i])
  6627. break;
  6628. case 'ascii':
  6629. for(var i=0,_len_i=b.length;i < _len_i;i++){var cp=b[i]
  6630. if(cp<=127){s +=String.fromCharCode(cp)}
  6631. else{var msg="'ascii' codec can't decode byte 0x"+cp.toString(16)
  6632. msg +=" in position "+i+": ordinal not in range(128)"
  6633. throw _b_.UnicodeDecodeError(msg)}}
  6634. break;
  6635. default:
  6636. try{load_decoder(enc)}
  6637. catch(err){throw _b_.LookupError("unknown encoding: "+ enc)}
  6638. for(var i=0,_len_i=b.length;i < _len_i;i++){var u=to_unicode[enc][b[i]]
  6639. if(u!==undefined){s+=String.fromCharCode(u)}
  6640. else{s +=String.fromCharCode(b[i])}}
  6641. break;}
  6642. return s}
  6643. function encode(s,encoding){var t=[],pos=0,enc=normalise(encoding)
  6644. switch(enc){case 'utf-8':
  6645. case 'utf8':
  6646. var _int_800=_int('800'),_int_c2=_int('c2'),_int_1000=_int('1000')
  6647. var _int_e0=_int('e0'),_int_e1=_int('e1'),_int_a0=_int('a0'),_int_80=_int('80')
  6648. var _int_2000=_int('2000'),_int_D000=_int('D000')
  6649. for(var i=0,_len_i=s.length;i < _len_i;i++){var cp=s.charCodeAt(i)
  6650. if(cp<=127){t[pos++]=cp}else if(cp<_int_800){var zone=Math.floor((cp-128)/64)
  6651. t[pos++]=_int_c2+zone
  6652. t[pos++]=cp -64*zone}else if(cp<_int_1000){var zone=Math.floor((cp-_int_800)/64)
  6653. t[pos++]=_int_e0
  6654. t[pos++]=_int_a0+zone
  6655. t[pos++]=_int_80 + cp - _int_800 - 64 * zone}else if(cp<_int_2000){var zone=Math.floor((cp-_int_1000)/64)
  6656. t[pos++]=_int_e1+Math.floor((cp-_int_1000)/_int_1000)
  6657. t[pos++]=_int_80+zone
  6658. t[pos++]=_int_80 + cp - _int_1000 -64*zone}else if(cp<_int_D000){var zone=Math.floor((cp-_int_2000)/64)
  6659. var zone1=Math.floor((cp-_int_2000)/_int_1000)
  6660. t[pos++]=_int_e1+Math.floor((cp-_int_1000)/_int_1000)
  6661. t[pos++]=_int_80+zone-zone1*64
  6662. t[pos++]=_int_80 + cp - _int_2000 - 64 * zone}}
  6663. break;
  6664. case 'latin1':
  6665. case 'iso8859_1':
  6666. case 'windows1252':
  6667. for(var i=0,_len_i=s.length;i < _len_i;i++){var cp=s.charCodeAt(i)
  6668. if(cp<=255){t[pos++]=cp}
  6669. else{$UnicodeEncodeError(encoding,i)}}
  6670. break;
  6671. case 'ascii':
  6672. for(var i=0,_len_i=s.length;i < _len_i;i++){var cp=s.charCodeAt(i)
  6673. if(cp<=127){t[pos++]=cp}
  6674. else{$UnicodeEncodeError(encoding,i)}}
  6675. break;
  6676. default:
  6677. try{load_encoder(enc)}
  6678. catch(err){throw _b_.LookupError("unknown encoding: "+ enc)}
  6679. for(var i=0,_len_i=s.length;i < _len_i;i++){var cp=s.charCodeAt(i)
  6680. if(from_unicode[enc][cp]===undefined){$UnicodeEncodeError(encoding,cp,i)}
  6681. t[pos++]=from_unicode[enc][cp]}
  6682. break}
  6683. return t}
  6684. function bytes(source,encoding,errors){
  6685. var obj={__class__:$BytesDict}
  6686. $BytesDict.__init__(obj,source,encoding,errors)
  6687. return obj}
  6688. bytes.__class__=$B.$factory
  6689. bytes.$dict=$BytesDict
  6690. $BytesDict.$factory=bytes
  6691. bytes.__code__={}
  6692. bytes.__code__.co_argcount=1
  6693. bytes.__code__.co_consts=[]
  6694. bytes.__code__.co_varnames=['i']
  6695. for(var $attr in $BytesDict){if($BytearrayDict[$attr]===undefined){$BytearrayDict[$attr]=(function(attr){return function(){return $BytesDict[attr].apply(null,arguments)}})($attr)}}
  6696. $B.set_func_names($BytesDict)
  6697. $B.set_func_names($BytearrayDict)
  6698. _b_.bytes=bytes
  6699. _b_.bytearray=bytearray})(__BRYTHON__)
  6700. ;(function($B){eval($B.InjectBuiltins())
  6701. var $ObjectDict=_b_.object.$dict
  6702. var $LocationDict={__class__:$B.$type,__name__:'Location'}
  6703. $LocationDict.__mro__=[$ObjectDict]
  6704. function $Location(){
  6705. var obj={}
  6706. for(var x in window.location){if(typeof window.location[x]==='function'){obj[x]=(function(f){return function(){return f.apply(window.location,arguments)}})(window.location[x])}else{obj[x]=window.location[x]}}
  6707. if(obj['replace']===undefined){
  6708. obj['replace']=function(url){window.location=url}}
  6709. obj.__class__=$LocationDict
  6710. obj.toString=function(){return window.location.toString()}
  6711. obj.__repr__=obj.__str__=obj.toString
  6712. return obj}
  6713. $LocationDict.$factory=$Location
  6714. $Location.$dict=$LocationDict
  6715. var $JSConstructorDict={__class__:$B.$type,__name__:'JSConstructor'}
  6716. $JSConstructorDict.__call__=function(self){
  6717. var args=[null]
  6718. for(var i=1,_len_i=arguments.length;i < _len_i;i++){args.push(pyobj2jsobj(arguments[i]))}
  6719. var factory=self.func.bind.apply(self.func,args)
  6720. var res=new factory()
  6721. return $B.$JS2Py(res)}
  6722. $JSConstructorDict.__mro__=[$ObjectDict]
  6723. function JSConstructor(obj){return{
  6724. __class__:$JSConstructorDict,func:obj.js_func}}
  6725. JSConstructor.__class__=$B.$factory
  6726. JSConstructor.$dict=$JSConstructorDict
  6727. $JSConstructorDict.$factory=JSConstructor
  6728. var jsobj2pyobj=$B.jsobj2pyobj=function(jsobj){switch(jsobj){case true:
  6729. case false:
  6730. return jsobj}
  6731. if(Array.isArray(jsobj))return _b_.list(jsobj)
  6732. if(typeof jsobj==='number'){if(jsobj.toString().indexOf('.')==-1)return _b_.int(jsobj)
  6733. return _b_.float(jsobj)}
  6734. return $B.JSObject(jsobj)}
  6735. var pyobj2jsobj=$B.pyobj2jsobj=function(pyobj){
  6736. if(pyobj===true ||pyobj===false)return pyobj
  6737. if(pyobj===_b_.None)return null
  6738. var klass=$B.get_class(pyobj)
  6739. if(klass===undefined){
  6740. return pyobj;}
  6741. if(klass===$JSObjectDict ||klass===$JSConstructorDict){
  6742. if(pyobj.js_func!==undefined){return pyobj.js_func}
  6743. return pyobj.js}else if(klass===$B.DOMNodeDict ||
  6744. klass.__mro__.indexOf($B.DOMNodeDict)>-1){
  6745. return pyobj.elt}else if([_b_.list.$dict,_b_.tuple.$dict].indexOf(klass)>-1){
  6746. var res=[]
  6747. for(var i=0,_len_i=pyobj.length;i < _len_i;i++){res.push(pyobj2jsobj(pyobj[i]))}
  6748. return res}else if(klass===_b_.dict.$dict){
  6749. var jsobj={}
  6750. var items=_b_.list(_b_.dict.$dict.items(pyobj))
  6751. for(var j=0,_len_j=items.length;j < _len_j;j++){if(typeof items[j][1]=='function'){
  6752. items[j][1].bind(jsobj)}
  6753. jsobj[items[j][0]]=pyobj2jsobj(items[j][1])}
  6754. return jsobj}else if(klass===$B.builtins.float.$dict){
  6755. return pyobj.valueOf()}else if(klass===$B.$FunctionDict){
  6756. return function(){try{var args=[]
  6757. for(var i=0;i<arguments.length;i++){if(arguments[i]===undefined){args.push(_b_.None)}
  6758. else{args.push(jsobj2pyobj(arguments[i]))}}
  6759. return pyobj.apply(this,args)}catch(err){console.log(err)
  6760. console.log(_b_.getattr(err,'info'))
  6761. console.log(err.__name__+':',err.args.length > 0 ? err.args[0]: '' )
  6762. throw err}}}else{
  6763. return pyobj}}
  6764. var $JSObjectDict={__class__:$B.$type,__name__:'JSObject',toString:function(){return '(JSObject)'}}
  6765. $JSObjectDict.__bool__=function(self){return(new Boolean(self.js)).valueOf()}
  6766. $JSObjectDict.__delattr__=function(self,attr){_b_.getattr(self,attr)
  6767. delete self.js[attr]
  6768. return _b_.None}
  6769. $JSObjectDict.__dir__=function(self){return Object.keys(self.js)}
  6770. $JSObjectDict.__getattribute__=function(self,attr){if(attr.substr(0,2)=='$$')attr=attr.substr(2)
  6771. if(self.js===null)return $ObjectDict.__getattribute__(None,attr)
  6772. if(attr==='__class__')return $JSObjectDict
  6773. if(self.__class__===$JSObjectDict && attr=="$bind" &&
  6774. self.js[attr]===undefined &&
  6775. self.js['addEventListener']!==undefined){attr='addEventListener'}
  6776. var js_attr=self.js[attr]
  6777. if(self.js_func && self.js_func[attr]!==undefined){js_attr=self.js_func[attr]}
  6778. if(js_attr !==undefined){if(typeof js_attr=='function'){
  6779. var res=function(){
  6780. var args=[]
  6781. for(var i=0,_len_i=arguments.length;i < _len_i;i++){if(arguments[i].$nat!=undefined){
  6782. throw TypeError("A Javascript function can't "+
  6783. "take keyword arguments")}else{args.push(pyobj2jsobj(arguments[i]))}}
  6784. if(attr==='replace' && self.js===location){location.replace(args[0])
  6785. return}
  6786. var new_this=self.js;
  6787. if(self.js_func){
  6788. new_this=self.js_func;}
  6789. if(this !==null && this !==undefined && this !==window){new_this=this}
  6790. var result=js_attr.apply(new_this,args)
  6791. if(result===undefined){result=this}
  6792. return $B.$JS2Py(result)}
  6793. res.__repr__=function(){return '<function '+attr+'>'}
  6794. res.__str__=function(){return '<function '+attr+'>'}
  6795. res.prototype=js_attr.prototype
  6796. return{__class__:$JSObjectDict,js:res,js_func:js_attr}}else{if(Array.isArray(js_attr)){return js_attr}
  6797. return $B.$JS2Py(js_attr)}}else if(self.js===window && attr==='$$location'){
  6798. return $Location()}
  6799. var res=self.__class__[attr]
  6800. if(res===undefined){
  6801. var mro=self.__class__.__mro__
  6802. for(var i=0,_len_i=mro.length;i < _len_i;i++){var v=mro[i][attr]
  6803. if(v!==undefined){res=v
  6804. break}}}
  6805. if(res!==undefined){if(typeof res==='function'){
  6806. return function(){var args=[self]
  6807. for(var i=0,_len_i=arguments.length;i < _len_i;i++){arg=arguments[i]
  6808. if(arg &&(arg.__class__===$JSObjectDict ||arg.__class__===$JSConstructorDict)){args.push(arg.js)}else{args.push(arg)}}
  6809. return res.apply(self,args)}}
  6810. return $B.$JS2Py(res)}else{
  6811. throw _b_.AttributeError("no attribute "+attr+' for '+self.js)}}
  6812. $JSObjectDict.__getitem__=function(self,rank){if(typeof self.js.length=='number'){if((typeof rank=="number" ||typeof rank=="boolean")&&
  6813. typeof self.js.item=='function'){var rank_to_int=_b_.int(rank)
  6814. if(rank_to_int<0){rank_to_int+=self.js.length}
  6815. var res=JSObject(self.js.item(rank_to_int))
  6816. if(res===undefined){throw _b_.KeyError(rank)}
  6817. return res}else if(typeof rank=="string" &&
  6818. typeof self.js.getNamedItem=='function'){var res=JSObject(self.js.getNamedItem(rank))
  6819. if(res===undefined){throw _b_.keyError(rank)}
  6820. return res}}
  6821. try{return getattr(self.js,'__getitem__')(rank)}
  6822. catch(err){if(self.js[rank]!==undefined){return JSObject(self.js[rank])}
  6823. throw _b_.KeyError(rank)}}
  6824. var $JSObject_iterator=$B.$iterator_class('JS object iterator')
  6825. $JSObjectDict.__iter__=function(self){var items=[]
  6826. if(window.Symbol && self.js[Symbol.iterator]!==undefined){
  6827. if(self.js.length!==undefined && self.js.item!==undefined){for(var i=0;i<self.js.length ;i++){items.push(JSObject(self.js[i]))}}else{for(var item in self.js){if(self.js.hasOwnProperty(item )){items.push(jsobj2pyobj(item))}}}
  6828. return $B.$iterator(items,$JSObject_iterator)}else if(self.js.length!==undefined && self.js.item !==undefined){
  6829. for(var i=0;i<self.js.length ;i++){items.push(JSObject(self.js[i]))}
  6830. return $B.$iterator(items,$JSObject_iterator)}
  6831. var _dict=$JSObjectDict.to_dict(self)
  6832. return _b_.dict.$dict.__iter__(_dict)}
  6833. $JSObjectDict.__len__=function(self){if(typeof self.js.length=='number'){return self.js.length}
  6834. try{return getattr(self.js,'__len__')()}
  6835. catch(err){throw _b_.AttributeError(self.js+' has no attribute __len__')}}
  6836. $JSObjectDict.__mro__=[$ObjectDict]
  6837. $JSObjectDict.__repr__=function(self){if(self.js instanceof Date){return self.js.toString()}
  6838. var proto=Object.getPrototypeOf(self.js)
  6839. if(proto){var name=proto.constructor.name
  6840. if(name===undefined){
  6841. var proto_str=proto.constructor.toString()
  6842. name=proto_str.substring(8,proto_str.length-1)}
  6843. return "<"+name+" object>"}
  6844. return "<JSObject wraps "+self.js+">"}
  6845. $JSObjectDict.__setattr__=function(self,attr,value){if(isinstance(value,JSObject)){self.js[attr]=value.js}
  6846. else{self.js[attr]=value
  6847. if(typeof value=='function'){self.js[attr]=function(){var args=[]
  6848. for(var i=0,len=arguments.length;i<len;i++){args.push($B.$JS2Py(arguments[i]))}
  6849. try{return value.apply(null,args)}
  6850. catch(err){err=$B.exception(err)
  6851. var info=_b_.getattr(err,'info')
  6852. if(err.args.length > 0){err.toString=function(){return info+'\n'+err.__class__.__name__+
  6853. ': '+_b_.repr(err.args[0])}}else{
  6854. err.toString=function(){return info+'\n'+err.__class__.__name__}}
  6855. console.log(err+'')
  6856. throw err}}}}}
  6857. $JSObjectDict.__setitem__=$JSObjectDict.__setattr__
  6858. $JSObjectDict.__str__=$JSObjectDict.__repr__
  6859. var no_dict={'string':true,'function':true,'number':true,'boolean':true}
  6860. $JSObjectDict.bind=function(self,evt,func){self.js.addEventListener(evt,func)
  6861. return _b_.None}
  6862. $JSObjectDict.to_dict=function(self){
  6863. var res=_b_.dict()
  6864. for(var key in self.js){var value=self.js[key]
  6865. if(typeof value=='object' && !Array.isArray(value)){_b_.dict.$dict.__setitem__(res,key,$JSObjectDict.to_dict(JSObject(value)))}else{_b_.dict.$dict.__setitem__(res,key,value)}}
  6866. return res}
  6867. function JSObject(obj){if(obj===null){return _b_.None}
  6868. if(typeof obj=='function'){return{__class__:$JSObjectDict,js:obj,js_func:obj}}
  6869. var klass=$B.get_class(obj)
  6870. if(klass===_b_.float.$dict)return _b_.float(obj)
  6871. if(klass!==undefined)return obj
  6872. return{__class__:$JSObjectDict,js:obj}}
  6873. JSObject.__class__=$B.$factory
  6874. JSObject.$dict=$JSObjectDict
  6875. $JSObjectDict.$factory=JSObject
  6876. $B.JSObject=JSObject
  6877. $B.JSConstructor=JSConstructor})(__BRYTHON__)
  6878. ;(function($B){$B.stdlib={}
  6879. var pylist=['VFS_import','__future__','_abcoll','_codecs','_collections','_csv','_dummy_thread','_functools','_imp','_io','_markupbase','_random','_socket','_sre','_string','_strptime','_struct','_sysconfigdata','_testcapi','_thread','_threading_local','_warnings','_weakref','_weakrefset','abc','antigravity','argparse','atexit','base64','bdb','binascii','bisect','calendar','cmd','code','codecs','codeop','colorsys','configparser','Clib','copy','copyreg','csv','datetime','decimal','difflib','doctest','errno','external_import','fnmatch','formatter','fractions','functools','gc','genericpath','getopt','gettext','glob','heapq','imp','inspect','io','itertools','keyword','linecache','locale','marshal','numbers','opcode','operator','optparse','os','pdb','pickle','platform','posix','posixpath','pprint','profile','pwd','pydoc','queue','re','reprlib','select','shutil','signal','site','site-packages.__future__','site-packages.docs','site-packages.header','site-packages.highlight','site-packages.test_sp','site-packages.turtle','socket','sre_compile','sre_constants','sre_parse','stat','string','struct','subprocess','sys','sysconfig','tarfile','tempfile','test.namespace_pkgs.module_and_namespace_package.a_test','textwrap','this','threading','time','timeit','token','tokenize','traceback','types','uuid','warnings','weakref','webbrowser','zipfile','zlib']
  6880. for(var i=0;i<pylist.length;i++)$B.stdlib[pylist[i]]=['py']
  6881. var js=['_ajax','_base64','_jsre','_multiprocessing','_posixsubprocess','_profile','_svg','_sys','aes','builtins','dis','hashlib','hmac-md5','hmac-ripemd160','hmac-sha1','hmac-sha224','hmac-sha256','hmac-sha3','hmac-sha384','hmac-sha512','json','long_int','math','md5','modulefinder','pbkdf2','rabbit','rabbit-legacy','random','rc4','ripemd160','sha1','sha224','sha256','sha3','sha384','sha512','tripledes']
  6882. for(var i=0;i<js.length;i++)$B.stdlib[js[i]]=['js']
  6883. var pkglist=['asyncio','browser','collections','concurrent','concurrent.futures','encodings','html','http','importlib','jqueryui','logging','multiprocessing','multiprocessing.dummy','pydoc_data','site-packages.ui','test','test.encoded_modules','test.leakers','test.namespace_pkgs.not_a_namespace_pkg.foo','test.support','test.test_email','test.test_importlib','test.test_importlib.builtin','test.test_importlib.extension','test.test_importlib.frozen','test.test_importlib.import_','test.test_importlib.source','test.test_json','test.tracedmodules','unittest','unittest.test','unittest.test.testmock','urllib','xml','xml.dom','xml.etree','xml.parsers','xml.sax']
  6884. for(var i=0;i<pkglist.length;i++)$B.stdlib[pkglist[i]]=['py',true]})(__BRYTHON__)
  6885. ;(function($B){var _b_=$B.builtins
  6886. $B.$ModuleDict={__class__ : $B.$type,__name__ : 'module'}
  6887. $B.$ModuleDict.__repr__=$B.$ModuleDict.__str__=function(self){return '<module '+self.__name__+'>'}
  6888. $B.$ModuleDict.__mro__=[_b_.object.$dict]
  6889. $B.$ModuleDict.__setattr__=function(self,attr,value){if(self.__name__=='__builtins__'){
  6890. $B.builtins[attr]=value}else{self[attr]=value}}
  6891. function module(name,doc,package){return{__class__:$B.$ModuleDict,__name__:name,__doc__:doc||_b_.None,__package__:package||_b_.None}}
  6892. module.__class__=$B.$factory
  6893. module.$dict=$B.$ModuleDict
  6894. $B.$ModuleDict.$factory=module
  6895. var loader=function(){}
  6896. var Loader={__class__:$B.$type,__name__ : 'Loader'}
  6897. Loader.__mro__=[_b_.object.$dict]
  6898. Loader.$factory=loader
  6899. loader.$dict=Loader
  6900. loader.__class__=$B.$factory
  6901. function parent_package(mod_name){var parts=mod_name.split('.');
  6902. parts.pop();
  6903. return parts.join('.');}
  6904. function $importer(){
  6905. var $xmlhttp=new XMLHttpRequest();
  6906. var fake_qs;
  6907. switch($B.$options.cache){case 'version':
  6908. fake_qs="?v="+$B.version_info[2]
  6909. break;
  6910. case 'browser':
  6911. fake_qs=''
  6912. break;
  6913. default:
  6914. fake_qs="?v="+(new Date().getTime())}
  6915. var timer=setTimeout(function(){$xmlhttp.abort()
  6916. throw _b_.ImportError("No module named '"+module+"'")},5000)
  6917. return[$xmlhttp,fake_qs,timer]}
  6918. function $download_module(module,url,package,blocking){var imp=$importer(),$xmlhttp=imp[0],fake_qs=imp[1],timer=imp[2],res=null,mod_name=module.__name__,no_block=Array.isArray(blocking)||blocking===false,res,t0=new Date()
  6919. $B.download_time=$B.download_time ||0
  6920. if(no_block){console.log('download non blocking',mod_name)
  6921. $xmlhttp.open('GET',url+fake_qs,true)}else{$xmlhttp.open('GET',url+fake_qs,false)}
  6922. if($B.$CORS){$xmlhttp.onload=function(){if($xmlhttp.status==200 ||$xmlhttp.status==0){res=$xmlhttp.responseText}else{
  6923. res=_b_.FileNotFoundError("No module named '"+mod_name+"'")}}
  6924. $xmlhttp.onerror=function(){res=_b_.FileNotFoundError("No module named '"+mod_name+"'")}}else{
  6925. $xmlhttp.onreadystatechange=function(){if(this.readyState==4){window.clearTimeout(timer)
  6926. if(this.status==200 ||$xmlhttp.status==0){res=this.responseText
  6927. module.$last_modified=this.getResponseHeader('Last-Modified')
  6928. if(no_block){var ext=url.substr(url.length-2)
  6929. if(ext=='py'){try{import_py1(module,mod_name,url,package,res)}
  6930. catch(err){console.log(err);throw err}}else if(ext=='js'){try{run_js(res,url,module)}
  6931. catch(err){console.log(err);throw err}}
  6932. console.log('non blocking ok',mod_name)
  6933. blocking[1]()
  6934. return}}else{
  6935. console.log('Error '+this.status+
  6936. ' means that Python module '+mod_name+
  6937. ' was not found at url '+url)
  6938. res=_b_.FileNotFoundError("No module named '"+mod_name+"'")}}}}
  6939. if('overrideMimeType' in $xmlhttp){$xmlhttp.overrideMimeType("text/plain")}
  6940. $xmlhttp.send()
  6941. if(!no_block){
  6942. if(res==null)throw _b_.FileNotFoundError("No module named '"+mod_name+"' (res is null)")
  6943. if(res.constructor===Error){throw res}
  6944. $B.download_time +=(new Date())-t0
  6945. return res}}
  6946. $B.$download_module=$download_module
  6947. function import_js(module,path,blocking){try{var module_contents=$download_module(module,path,undefined,blocking)
  6948. if(Array.isArray(blocking)){return}}catch(err){return null}
  6949. run_js(module_contents,path,module)
  6950. return true}
  6951. function run_js(module_contents,path,module){
  6952. try{eval(module_contents);
  6953. if($B.$options.store){module.$js=module_contents}}catch(err){console.log(err)
  6954. throw err}
  6955. try{$module}
  6956. catch(err){console.log('no $module')
  6957. throw _b_.ImportError("name '$module' is not defined in module")}
  6958. if(module !==undefined){
  6959. for(var attr in $module){module[attr]=$module[attr];}
  6960. $module=module;}
  6961. else{
  6962. $module.__class__=$B.$ModuleDict
  6963. $module.__name__=module.name
  6964. $module.__repr__=$module.__str__=function(){if($B.builtin_module_names.indexOf(module.name)> -1){return "<module '"+module.name+"' (built-in)>"}
  6965. return "<module '"+module.name+"' from "+path+" >"}
  6966. $module.toString=function(){return "<module '"+module.name+"' from "+path+" >"}
  6967. if(module.name !='builtins'){
  6968. $module.__file__=path}}
  6969. $B.imported[module.__name__]=$module
  6970. return true}
  6971. function show_ns(){var kk=Object.keys(window)
  6972. for(var i=0,_len_i=kk.length;i < _len_i;i++){console.log(kk[i])
  6973. if(kk[i].charAt(0)=='$'){console.log(eval(kk[i]))}}
  6974. console.log('---')}
  6975. function import_py1(module,mod_name,path,package,module_contents){console.log('importpy1',mod_name)
  6976. $B.imported[mod_name]={__class__: $B.$ModuleDict,$is_package: module.$is_package,$last_modified: module.$last_modified}
  6977. if(path.substr(path.length-12)=='/__init__.py'){
  6978. $B.imported[mod_name].__package__=mod_name
  6979. $B.imported[mod_name].__path__=path
  6980. $B.imported[mod_name].$is_package=module.$is_package=true}else if(package){$B.imported[mod_name].__package__=package}else{var mod_elts=mod_name.split('.')
  6981. mod_elts.pop()
  6982. $B.imported[mod_name].__package__=mod_elts.join('.')}
  6983. $B.imported[mod_name].__file__=path
  6984. return run_py(module_contents,path,module)}
  6985. function import_py(module,path,package,blocking){
  6986. var mod_name=module.__name__,module_contents=$download_module(module,path,package,blocking)
  6987. if(Array.isArray(blocking)){return}
  6988. $B.imported[mod_name].$is_package=module.$is_package
  6989. $B.imported[mod_name].$last_modified=module.$last_modified
  6990. if(path.substr(path.length-12)=='/__init__.py'){
  6991. $B.imported[mod_name].__package__=mod_name
  6992. $B.imported[mod_name].__path__=path
  6993. $B.imported[mod_name].$is_package=module.$is_package=true}else if(package){$B.imported[mod_name].__package__=package}else{var mod_elts=mod_name.split('.')
  6994. mod_elts.pop()
  6995. $B.imported[mod_name].__package__=mod_elts.join('.')}
  6996. $B.imported[mod_name].__file__=path
  6997. return run_py(module_contents,path,module)}
  6998. function run_py(module_contents,path,module,compiled){var root,js
  6999. if(!compiled){var $Node=$B.$Node,$NodeJSCtx=$B.$NodeJSCtx
  7000. $B.$py_module_path[module.__name__]=path
  7001. root=$B.py2js(module_contents,module.__name__,module.__name__,'__builtins__')
  7002. var body=root.children
  7003. root.children=[]
  7004. var mod_node=new $Node('expression')
  7005. new $NodeJSCtx(mod_node,'var $module=(function()')
  7006. root.insert(0,mod_node)
  7007. for(var i=0,_len_i=body.length;i < _len_i;i++){mod_node.add(body[i])}
  7008. var ret_node=new $Node('expression')
  7009. new $NodeJSCtx(ret_node,'return $locals_'+module.__name__.replace(/\./g,'_'))
  7010. mod_node.add(ret_node)
  7011. var ex_node=new $Node('expression')
  7012. new $NodeJSCtx(ex_node,')(__BRYTHON__)')
  7013. root.add(ex_node)}
  7014. try{js=(compiled)? module_contents : root.to_js()
  7015. if($B.$options.debug==10){console.log('code for module '+module.__name__)
  7016. console.log(js)}
  7017. eval(js)}catch(err){console.log(err+' for module '+module.__name__)
  7018. root=null
  7019. js=null
  7020. throw err}finally{$B.clear_ns(module.__name__)}
  7021. try{
  7022. var mod=eval('$module')
  7023. for(var attr in mod){module[attr]=mod[attr];}
  7024. module.__initializing__=false
  7025. $B.imported[module.__name__]=module
  7026. return true}catch(err){console.log(''+err+' '+' for module '+module.name)
  7027. for(var attr in err)console.log(attr+' '+err[attr])
  7028. if($B.debug>0){console.log('line info '+__BRYTHON__.line_info)}
  7029. throw err}finally{root=null
  7030. js=null}}
  7031. $B.run_py=run_py
  7032. function new_spec(fields){
  7033. fields.__class__=$B.$ModuleDict
  7034. return fields;}
  7035. function finder_VFS(){return{__class__:finder_VFS.$dict}}
  7036. finder_VFS.__class__=$B.$factory
  7037. finder_VFS.$dict={$factory: finder_VFS,__class__: $B.$type,__name__: 'VFSFinder',create_module : function(cls,spec){
  7038. return _b_.None;},exec_module : function(cls,module){var stored=module.__spec__.loader_state.stored;
  7039. delete module.__spec__['loader_state'];
  7040. var ext=stored[0],module_contents=stored[1];
  7041. module.$is_package=stored[2]||false;
  7042. var path=$B.brython_path+'Lib/'+module.__name__
  7043. if(module.$is_package){path +='/__init__.py'}
  7044. module.__file__=path
  7045. if(ext=='.js'){run_js(module_contents,module.__path__,module)}
  7046. else{
  7047. run_py(module_contents,module.__path__,module,ext=='.pyc.js')}
  7048. if($B.debug>1){console.log('import '+module.__name__+' from VFS')}},find_module: function(cls,name,path){return{__class__:Loader,load_module:function(name,path){var spec=cls.$dict.find_spec(cls,name,path)
  7049. var mod=module(name)
  7050. $B.imported[name]=mod
  7051. mod.__spec__=spec
  7052. cls.$dict.exec_module(cls,mod)}}},find_spec : function(cls,fullname,path,prev_module){if(!$B.use_VFS){return _b_.None;}
  7053. var stored=$B.VFS[fullname];
  7054. if(stored===undefined){return _b_.None;}
  7055. var is_package=stored[2],is_builtin=$B.builtin_module_names.indexOf(fullname)> -1;
  7056. return new_spec({name : fullname,loader: cls,
  7057. origin : is_builtin? 'built-in' : 'brython_stdlib',
  7058. submodule_search_locations: is_package?[]: _b_.None,loader_state:{stored: stored},
  7059. cached: _b_.None,parent: is_package? fullname : parent_package(fullname),has_location: _b_.False});}}
  7060. finder_VFS.$dict.__mro__=[_b_.object.$dict]
  7061. finder_VFS.$dict.create_module.$type='classmethod'
  7062. finder_VFS.$dict.exec_module.$type='classmethod'
  7063. finder_VFS.$dict.find_module.$type='classmethod'
  7064. finder_VFS.$dict.find_spec.$type='classmethod'
  7065. function finder_stdlib_static(){return{__class__:finder_stdlib_static.$dict}}
  7066. finder_stdlib_static.__class__=$B.$factory
  7067. finder_stdlib_static.$dict={$factory : finder_stdlib_static,__class__ : $B.$type,__name__ : 'StdlibStatic',create_module : function(cls,spec){
  7068. return _b_.None;},exec_module : function(cls,module,blocking){var metadata=module.__spec__.loader_state;
  7069. module.$is_package=metadata.is_package;
  7070. if(metadata.ext=='py'){import_py(module,metadata.path,module.__package__,blocking);}
  7071. else{
  7072. import_js(module,metadata.path,blocking);}
  7073. delete module.__spec__['loader_state'];},find_module: function(cls,name,path){var spec=cls.$dict.find_spec(cls,name,path)
  7074. if(spec===_b_.None){return _b_.None}
  7075. return{__class__:Loader,load_module:function(name,path){var mod=module(name)
  7076. $B.imported[name]=mod
  7077. mod.__spec__=spec
  7078. mod.__package__=spec.parent
  7079. cls.$dict.exec_module(cls,mod,spec.blocking)}}},find_spec: function(cls,fullname,path,prev_module){if($B.stdlib && $B.$options.static_stdlib_import){var address=$B.stdlib[fullname];
  7080. if(address===undefined){var elts=fullname.split('.')
  7081. if(elts.length>1){elts.pop()
  7082. var package=$B.stdlib[elts.join('.')]
  7083. if(package && package[1]){address=['py']}}}
  7084. if(address !==undefined){var ext=address[0],is_pkg=address[1]!==undefined,path=$B.brython_path +((ext=='py')? 'Lib/' : 'libs/')+
  7085. fullname.replace(/\./g,'/'),metadata={ext: ext,is_package: is_pkg,path: path +(is_pkg? '/__init__.py' :
  7086. ((ext=='py')? '.py' : '.js')),address: address}
  7087. var res=new_spec(
  7088. {name : fullname,loader: cls,
  7089. origin : metadata.path,submodule_search_locations: is_pkg?[path]: _b_.None,loader_state: metadata,
  7090. cached: _b_.None,parent: is_pkg? fullname :
  7091. parent_package(fullname),has_location: _b_.True});
  7092. return res}}
  7093. return _b_.None;}}
  7094. finder_stdlib_static.$dict.__mro__=[_b_.object.$dict]
  7095. finder_stdlib_static.$dict.create_module.$type='classmethod'
  7096. finder_stdlib_static.$dict.exec_module.$type='classmethod'
  7097. finder_stdlib_static.$dict.find_module.$type='classmethod'
  7098. finder_stdlib_static.$dict.find_spec.$type='classmethod'
  7099. function finder_path(){return{__class__:finder_path.$dict}}
  7100. finder_path.__class__=$B.$factory
  7101. finder_path.$dict={$factory: finder_path,__class__: $B.$type,__name__: 'ImporterPath',create_module : function(cls,spec){
  7102. return _b_.None;},exec_module : function(cls,module){var _spec=_b_.getattr(module,'__spec__'),code=_spec.loader_state.code;
  7103. module.$is_package=_spec.loader_state.is_package,delete _spec.loader_state['code'];
  7104. var src_type=_spec.loader_state.type
  7105. if(src_type=='py' ||src_type=='pyc.js'){run_py(code,_spec.origin,module,src_type=='pyc.js');}
  7106. else if(_spec.loader_state.type=='js'){run_js(code,_spec.origin,module)}},find_module: function(cls,name,path){return finder_path.$dict.find_spec(cls,name,path)},find_spec : function(cls,fullname,path,prev_module,blocking){if($B.is_none(path)){
  7107. path=$B.path}
  7108. for(var i=0,li=path.length;i<li;++i){var path_entry=path[i];
  7109. if(path_entry[path_entry.length - 1]!='/'){path_entry +='/'}
  7110. var finder=$B.path_importer_cache[path_entry];
  7111. if(finder===undefined){var finder_notfound=true;
  7112. for(var j=0,lj=$B.path_hooks.length;
  7113. j < lj && finder_notfound;
  7114. ++j){var hook=$B.path_hooks[j];
  7115. try{
  7116. finder=(typeof hook=='function' ? hook : _b_.getattr(hook,'__call__'))(path_entry)
  7117. finder_notfound=false;}
  7118. catch(e){if(e.__class__ !==_b_.ImportError.$dict){throw e;}}}
  7119. if(finder_notfound){$B.path_importer_cache[path_entry]=_b_.None;}}
  7120. if($B.is_none(finder))
  7121. continue;
  7122. var find_spec=_b_.getattr(finder,'find_spec'),fs_func=typeof find_spec=='function' ?
  7123. find_spec :
  7124. _b_.getattr(find_spec,'__call__')
  7125. var spec=fs_func(fullname,prev_module,blocking);
  7126. if(!$B.is_none(spec)){return spec;}}
  7127. return _b_.None;}}
  7128. finder_path.$dict.__mro__=[_b_.object.$dict]
  7129. finder_path.$dict.create_module.$type='classmethod'
  7130. finder_path.$dict.exec_module.$type='classmethod'
  7131. finder_path.$dict.find_module.$type='classmethod'
  7132. finder_path.$dict.find_spec.$type='classmethod'
  7133. function vfs_hook(path){if(path.substr(-1)=='/'){path=path.slice(0,-1);}
  7134. var ext=path.substr(-7);
  7135. if(ext !='.vfs.js'){throw _b_.ImportError('VFS file URL must end with .vfs.js extension');}
  7136. self={__class__: vfs_hook.$dict,path: path};
  7137. vfs_hook.$dict.load_vfs(self);
  7138. return self;}
  7139. vfs_hook.__class__=$B.$factory
  7140. vfs_hook.$dict={$factory: vfs_hook,__class__: $B.$type,__name__: 'VfsPathFinder',load_vfs: function(self){try{var code=$download_module({__name__:'<VFS>'},self.path)}
  7141. catch(e){self.vfs=undefined;
  7142. throw new _b_.ImportError(e.$message ||e.message);}
  7143. eval(code);
  7144. try{
  7145. self.vfs=$vfs;}
  7146. catch(e){throw new _b_.ImportError('Expecting $vfs var in VFS file');}
  7147. $B.path_importer_cache[self.path + '/']=self;},find_spec: function(self,fullname,module){if(self.vfs===undefined){try{vfs_hook.$dict.load_vfs(self)}
  7148. catch(e){console.log("Could not load VFS while importing '" + fullname + "'");
  7149. return _b_.None;}}
  7150. var stored=self.vfs[fullname];
  7151. if(stored===undefined){return _b_.None;}
  7152. var is_package=stored[2];
  7153. return new_spec({name : fullname,loader: finder_VFS,
  7154. origin : self.path + '#' + fullname,
  7155. submodule_search_locations: is_package?[self.path]:
  7156. _b_.None,loader_state:{stored: stored},
  7157. cached: _b_.None,parent: is_package? fullname : parent_package(fullname),has_location: _b_.True});},invalidate_caches: function(self){self.vfs=undefined;}}
  7158. vfs_hook.$dict.__mro__=[_b_.object.$dict]
  7159. function url_hook(path_entry,hint){return{__class__: url_hook.$dict,path_entry:path_entry,hint:hint }}
  7160. url_hook.__class__=$B.$factory
  7161. url_hook.$dict={$factory: url_hook,__class__: $B.$type,__name__ : 'UrlPathFinder',__repr__: function(self){return '<UrlPathFinder' +(self.hint? " for '" + self.hint + "'":
  7162. "(unbound)")+ ' at ' + self.path_entry + '>'},find_spec : function(self,fullname,module,blocking){var loader_data={},notfound=true,hint=self.hint,base_path=self.path_entry + fullname.match(/[^.]+$/g)[0],modpaths=[];
  7163. var tryall=hint===undefined;
  7164. if(tryall ||hint=='js'){
  7165. modpaths=[[base_path + '.js','js',false]];}
  7166. if(tryall ||hint=='pyc.js'){
  7167. modpaths=modpaths.concat([[base_path + '.pyc.js','pyc.js',false],[base_path + '/__init__.pyc.js','pyc.js',true]]);}
  7168. if(tryall ||hint=='py'){
  7169. modpaths=modpaths.concat([[base_path + '.py','py',false],[base_path + '/__init__.py','py',true]]);}
  7170. for(var j=0;notfound && j < modpaths.length;++j){try{var file_info=modpaths[j],module={__name__:fullname,$is_package: false}
  7171. loader_data.code=$download_module(module,file_info[0],undefined,blocking);
  7172. notfound=false;
  7173. loader_data.type=file_info[1];
  7174. loader_data.is_package=file_info[2];
  7175. if(hint===undefined){self.hint=file_info[1];
  7176. $B.path_importer_cache[self.path_entry]=self;}
  7177. if(loader_data.is_package){
  7178. $B.path_importer_cache[base_path + '/']=
  7179. url_hook(base_path + '/',self.hint);}
  7180. loader_data.path=file_info[0];}catch(err){}}
  7181. if(!notfound){return new_spec({name : fullname,loader: finder_path,origin : loader_data.path,
  7182. submodule_search_locations: loader_data.is_package?[base_path]:
  7183. _b_.None,loader_state: loader_data,
  7184. cached: _b_.None,parent: loader_data.is_package? fullname :
  7185. parent_package(fullname),has_location: _b_.True});}
  7186. return _b_.None;},invalidate_caches : function(self){}}
  7187. url_hook.$dict.__mro__=[_b_.object.$dict]
  7188. $B.path_importer_cache={};
  7189. var _sys_paths=[[$B.script_dir + '/','py'],[$B.brython_path + 'Lib/','py'],[$B.brython_path + 'Lib/site-packages/','py'],[$B.brython_path + 'libs/','js']];
  7190. for(i=0;i < _sys_paths.length;++i){var _path=_sys_paths[i],_type=_path[1];
  7191. _path=_path[0];
  7192. $B.path_importer_cache[_path]=url_hook(_path,_type);}
  7193. delete _path;
  7194. delete _type;
  7195. delete _sys_paths;
  7196. $B.$__import__=function(mod_name,globals,locals,fromlist,level,blocking){
  7197. var modobj=$B.imported[mod_name],parsed_name=mod_name.split('.');
  7198. if(modobj==_b_.None){
  7199. throw _b_.ImportError(mod_name)}
  7200. if(modobj===undefined){
  7201. if($B.is_none(fromlist)){fromlist=[];}
  7202. for(var i=0,modsep='',_mod_name='',len=parsed_name.length - 1,__path__=_b_.None;i <=len;++i){var _parent_name=_mod_name;
  7203. _mod_name +=modsep + parsed_name[i];
  7204. modsep='.';
  7205. var modobj=$B.imported[_mod_name];
  7206. if(modobj==_b_.None){
  7207. throw _b_.ImportError(_mod_name)}
  7208. else if(modobj===undefined){try{$B.import_hooks(_mod_name,__path__,undefined,blocking)}
  7209. catch(err){delete $B.imported[_mod_name]
  7210. throw err}
  7211. if($B.is_none($B.imported[_mod_name])){throw _b_.ImportError(_mod_name)}
  7212. else{
  7213. if(_parent_name){_b_.setattr($B.imported[_parent_name],parsed_name[i],$B.imported[_mod_name]);}}}
  7214. if(i < len){try{
  7215. __path__=_b_.getattr($B.imported[_mod_name],'__path__')}catch(e){
  7216. if(i==len-1 && $B.imported[_mod_name][parsed_name[len]]&&
  7217. $B.imported[_mod_name][parsed_name[len]].__class__===$B.$ModuleDict){return $B.imported[_mod_name][parsed_name[len]]}
  7218. throw _b_.ImportError(_mod_name)}}}}
  7219. else if(Array.isArray(blocking)){var frames=$B.frames_stack
  7220. for(var i=0;i<frames.length;i++){var locals_id='$locals_'+frames[i][0].replace(/\./g,'_')
  7221. eval('var '+locals_id+'=frames[i][1]')}
  7222. eval('var $locals='+locals_id)
  7223. blocking[1]()}
  7224. if(fromlist.length > 0){
  7225. return $B.imported[mod_name]}
  7226. else{
  7227. return $B.imported[parsed_name[0]]}}
  7228. $B.$import=function(mod_name,fromlist,aliases,locals,blocking){var parts=mod_name.split('.');
  7229. if(mod_name[mod_name.length - 1]=='.'){parts.pop()}
  7230. var norm_parts=[],prefix=true;
  7231. for(var i=0,_len_i=parts.length;i < _len_i;i++){var p=parts[i];
  7232. if(prefix && p==''){
  7233. elt=norm_parts.pop();
  7234. if(elt===undefined){throw _b_.ImportError("Parent module '' not loaded, "+
  7235. "cannot perform relative import");}}
  7236. else{
  7237. prefix=false;
  7238. norm_parts.push(p.substr(0,2)=='$$' ? p.substr(2): p)}}
  7239. var mod_name=norm_parts.join('.')
  7240. if($B.$options.debug==10){console.log('$import '+mod_name)
  7241. console.log('use VFS ? '+$B.use_VFS)
  7242. console.log('use static stdlib paths ? '+$B.static_stdlib_import)}
  7243. var current_frame=$B.frames_stack[$B.frames_stack.length-1],_globals=current_frame[3],__import__=_globals['__import__'],globals=$B.obj_dict(_globals);
  7244. if(__import__===undefined){
  7245. __import__=$B.$__import__;}
  7246. var importer=typeof __import__=='function' ?
  7247. __import__ :
  7248. _b_.getattr(__import__,'__call__'),modobj=importer(mod_name,globals,undefined,fromlist,0,blocking);
  7249. if(!fromlist ||fromlist.length==0){
  7250. var alias=aliases[mod_name];
  7251. if(alias){locals[alias]=$B.imported[mod_name];}
  7252. else{
  7253. locals[norm_parts[0]]=modobj;}}
  7254. else{
  7255. var __all__=fromlist,thunk={};
  7256. if(fromlist && fromlist[0]=='*'){__all__=_b_.getattr(modobj,'__all__',thunk);
  7257. if(__all__ !==thunk){
  7258. aliases={};}}
  7259. if(__all__===thunk){
  7260. for(var attr in modobj){if(attr[0]!=='_'){locals[attr]=modobj[attr];}}}
  7261. else{
  7262. for(var i=0,l=__all__.length;i < l;++i){var name=__all__[i];
  7263. var alias=aliases[name]||name;
  7264. try{
  7265. locals[alias]=_b_.getattr(modobj,name);}
  7266. catch($err1){
  7267. try{_b_.getattr(__import__,'__call__')(mod_name + '.' + name,globals,undefined,[],0);
  7268. locals[alias]=_b_.getattr(modobj,name);}
  7269. catch($err3){
  7270. if(mod_name==="__future__"){
  7271. var frame=$B.last($B.frames_stack),line_info=frame[3].$line_info,line_elts=line_info.split(','),line_num=parseInt(line_elts[0])
  7272. $B.$SyntaxError(frame[2],"future feature "+name+" is not defined",undefined,line_num)}
  7273. throw _b_.ImportError("cannot import name '"+name+"'")}}}}}}
  7274. $B.$import_non_blocking=function(mod_name,func){console.log('import non blocking',mod_name)
  7275. $B.$import(mod_name,[],[],{},[false,func])
  7276. console.log('after async import',$B.imported[mod_name])}
  7277. $B.$path_hooks=[vfs_hook,url_hook];
  7278. $B.$meta_path=[finder_VFS,finder_stdlib_static,finder_path];
  7279. function optimize_import_for_path(path,filetype){if(path.slice(-1)!='/'){path=path + '/' }
  7280. var value=(filetype=='none')? _b_.None : url_hook(path,filetype);
  7281. $B.path_importer_cache[path]=value;}
  7282. _importlib_module={__class__ : $B.$ModuleDict,__name__ : '_importlib',Loader: Loader,VFSFinder: finder_VFS,StdlibStatic: finder_stdlib_static,ImporterPath: finder_path,VFSPathFinder : vfs_hook,UrlPathFinder: url_hook,optimize_import_for_path : optimize_import_for_path}
  7283. _importlib_module.__repr__=_importlib_module.__str__=function(){return "<module '_importlib' (built-in)>"}
  7284. $B.imported['_importlib']=$B.modules['_importlib']=_importlib_module})(__BRYTHON__)
  7285. ;(function($B){eval($B.InjectBuiltins())
  7286. var $ObjectDict=_b_.object.$dict
  7287. function $err(op,other){var msg="unsupported operand type(s) for "+op
  7288. msg +=": 'float' and '"+$B.get_class(other).__name__+"'"
  7289. throw _b_.TypeError(msg)}
  7290. var $FloatDict={__class__:$B.$type,__dir__:$ObjectDict.__dir__,__name__:'float',$native:true}
  7291. $FloatDict.as_integer_ratio=function(self){if(self.valueOf()==Number.POSITIVE_INFINITY ||
  7292. self.valueOf()==Number.NEGATIVE_INFINITY){throw _b_.OverflowError("Cannot pass infinity to float.as_integer_ratio.")}
  7293. if(!Number.isFinite(self.valueOf())){throw _b_.ValueError("Cannot pass NaN to float.as_integer_ratio.")}
  7294. var tmp=_b_.$frexp(self.valueOf())
  7295. var fp=tmp[0]
  7296. var exponent=tmp[1]
  7297. for(var i=0;i < 300;i++){if(fp==Math.floor(fp)){break}else{
  7298. fp *=2
  7299. exponent--}}
  7300. numerator=float(fp)
  7301. py_exponent=abs(exponent)
  7302. denominator=1
  7303. py_exponent=_b_.getattr(int(denominator),"__lshift__")(py_exponent)
  7304. if(exponent > 0){numerator=numerator * py_exponent}else{
  7305. denominator=py_exponent}
  7306. return _b_.tuple([_b_.int(numerator),_b_.int(denominator)])}
  7307. $FloatDict.__bool__=function(self){return _b_.bool(self.valueOf())}
  7308. $FloatDict.__class__=$B.$type
  7309. $FloatDict.__eq__=function(self,other){if(isNaN(self)&& isNaN(other)){return false}
  7310. if(isinstance(other,_b_.int))return self==other
  7311. if(isinstance(other,float)){
  7312. return self.valueOf()==other.valueOf()}
  7313. if(isinstance(other,_b_.complex)){if(other.imag !=0)return false
  7314. return self==other.real}
  7315. if(_b_.hasattr(other,'__eq__')){return _b_.getattr(other,'__eq__')(self.value)}
  7316. return self.value===other}
  7317. $FloatDict.__floordiv__=function(self,other){if(isinstance(other,[_b_.int,float])){if(other.valueOf()==0)throw ZeroDivisionError('division by zero')
  7318. return float(Math.floor(self/other))}
  7319. if(hasattr(other,'__rfloordiv__')){return getattr(other,'__rfloordiv__')(self)}
  7320. $err('//',other)}
  7321. $FloatDict.fromhex=function(arg){
  7322. if(!isinstance(arg,_b_.str)){throw _b_.ValueError('argument must be a string')}
  7323. var value=arg.trim()
  7324. switch(value.toLowerCase()){case '+inf':
  7325. case 'inf':
  7326. case '+infinity':
  7327. case 'infinity':
  7328. return $FloatClass(Infinity)
  7329. case '-inf':
  7330. case '-infinity':
  7331. return $FloatClass(-Infinity)
  7332. case '+nan':
  7333. case 'nan':
  7334. return $FloatClass(Number.NaN)
  7335. case '-nan':
  7336. return $FloatClass(-Number.NaN)
  7337. case '':
  7338. throw _b_.ValueError('count not convert string to float')}
  7339. var _m=/^(\d*\.?\d*)$/.exec(value)
  7340. if(_m !==null)return $FloatClass(parseFloat(_m[1]))
  7341. var _m=/^(\+|-)?(0x)?([0-9A-F]+\.?)?(\.[0-9A-F]+)?(p(\+|-)?\d+)?$/i.exec(value)
  7342. if(_m==null)throw _b_.ValueError('invalid hexadecimal floating-point string')
  7343. var _sign=_m[1]
  7344. var _int=parseInt(_m[3]||'0',16)
  7345. var _fraction=_m[4]||'.0'
  7346. var _exponent=_m[5]||'p0'
  7347. if(_sign=='-'){_sign=-1}else{_sign=1}
  7348. var _sum=_int
  7349. for(var i=1,_len_i=_fraction.length;i < _len_i;i++){_sum+=parseInt(_fraction.charAt(i),16)/Math.pow(16,i)}
  7350. return new Number(_sign * _sum * Math.pow(2,parseInt(_exponent.substring(1))))}
  7351. $FloatDict.__getformat__=function(arg){if(arg=='double' ||arg=='float')return 'IEEE, little-endian'
  7352. throw _b_.ValueError("__getformat__() argument 1 must be 'double' or 'float'")}
  7353. function preformat(self,fmt){if(fmt.empty){return _b_.str(self)}
  7354. if(fmt.type && 'eEfFgGn%'.indexOf(fmt.type)==-1){throw _b_.ValueError("Unknown format code '"+fmt.type+
  7355. "' for object of type 'float'")}
  7356. if(isNaN(self)){if(fmt.type=='f'||fmt.type=='g'){return 'nan'}
  7357. else{return 'NAN'}}
  7358. if(self==Number.POSITIVE_INFINITY){if(fmt.type=='f'||fmt.type=='g'){return 'inf'}
  7359. else{return 'INF'}}
  7360. if(fmt.precision===undefined && fmt.type !==undefined){fmt.precision=6}
  7361. if(fmt.type=='%'){self *=100}
  7362. if(fmt.type=='e'){var res=self.toExponential(fmt.precision),exp=parseInt(res.substr(res.search('e')+1))
  7363. if(Math.abs(exp)<10){res=res.substr(0,res.length-1)+'0'+
  7364. res.charAt(res.length-1)}
  7365. return res }
  7366. if(fmt.precision!==undefined){
  7367. var prec=fmt.precision
  7368. if(prec==0){return Math.round(self)+''}
  7369. var res=self.toFixed(prec),pt_pos=res.indexOf('.')
  7370. if(fmt.type!==undefined &&
  7371. (fmt.type=='%' ||fmt.type.toLowerCase()=='f')){if(pt_pos==-1){res +='.'+'0'.repeat(fmt.precision)}
  7372. else{var missing=fmt.precision-res.length+pt_pos+1
  7373. if(missing>0)res +='0'.repeat(missing)}}else{var res1=self.toExponential(fmt.precision-1),exp=parseInt(res1.substr(res1.search('e')+1))
  7374. if(exp<-4 ||exp>=fmt.precision-1){res=res1
  7375. if(Math.abs(exp)<10){res=res.substr(0,res.length-1)+'0'+
  7376. res.charAt(res.length-1)}}}}else{var res=_b_.str(self)}
  7377. if(fmt.type===undefined||'gGn'.indexOf(fmt.type)!=-1){
  7378. while(res.charAt(res.length-1)=='0'){res=res.substr(0,res.length-1)}
  7379. if(res.charAt(res.length-1)=='.'){if(fmt.type===undefined){res +='0'}
  7380. else{res=res.substr(0,res.length-1)}}}
  7381. if(fmt.sign!==undefined){if((fmt.sign==' ' ||fmt.sign=='+')&& self>0){res=fmt.sign+res}}
  7382. if(fmt.type=='%'){res+='%'}
  7383. return res}
  7384. $FloatDict.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
  7385. fmt.align=fmt.align ||'>'
  7386. var raw=preformat(self,fmt).split('.'),_int=raw[0]
  7387. if(fmt.comma){var len=_int.length,nb=Math.ceil(_int.length/3),chunks=[]
  7388. for(var i=0;i<nb;i++){chunks.push(_int.substring(len-3*i-3,len-3*i))}
  7389. chunks.reverse()
  7390. raw[0]=chunks.join(',')}
  7391. return $B.format_width(raw.join('.'),fmt)}
  7392. $FloatDict.__hash__=function(self){if(self===undefined){return $FloatDict.__hashvalue__ ||$B.$py_next_hash-- }
  7393. var _v=self.valueOf()
  7394. if(_v===Infinity)return 314159
  7395. if(_v===-Infinity)return -271828
  7396. if(isNaN(_v))return 0
  7397. if(_v==Math.round(_v))return Math.round(_v)
  7398. var r=_b_.$frexp(_v)
  7399. r[0]*=Math.pow(2,31)
  7400. var hipart=_b_.int(r[0])
  7401. r[0]=(r[0]- hipart)* Math.pow(2,31)
  7402. var x=hipart + _b_.int(r[0])+(r[1]<< 15)
  7403. return x & 0xFFFFFFFF}
  7404. _b_.$isninf=function(x){var x1=x
  7405. if(isinstance(x,float))x1=x.valueOf()
  7406. return x1==-Infinity ||x1==Number.NEGATIVE_INFINITY}
  7407. _b_.$isinf=function(x){var x1=x
  7408. if(isinstance(x,float))x1=x.valueOf()
  7409. return x1==Infinity ||x1==-Infinity ||x1==Number.POSITIVE_INFINITY ||x1==Number.NEGATIVE_INFINITY}
  7410. _b_.$fabs=function(x){return x>0?float(x):float(-x)}
  7411. _b_.$frexp=function(x){var x1=x
  7412. if(isinstance(x,float))x1=x.valueOf()
  7413. if(isNaN(x1)||_b_.$isinf(x1)){return[x1,-1]}
  7414. if(x1==0)return[0,0]
  7415. var sign=1,ex=0,man=x1
  7416. if(man < 0.){sign=-sign
  7417. man=-man}
  7418. while(man < 0.5){man *=2.0
  7419. ex--}
  7420. while(man >=1.0){man *=0.5
  7421. ex++}
  7422. man *=sign
  7423. return[man ,ex]}
  7424. _b_.$ldexp=function(x,i){if(_b_.$isninf(x))return float('-inf')
  7425. if(_b_.$isinf(x))return float('inf')
  7426. var y=x
  7427. if(isinstance(x,float))y=x.valueOf()
  7428. if(y==0)return y
  7429. var j=i
  7430. if(isinstance(i,float))j=i.valueOf()
  7431. return y * Math.pow(2,j)}
  7432. $FloatDict.hex=function(self){
  7433. var DBL_MANT_DIG=53
  7434. var TOHEX_NBITS=DBL_MANT_DIG + 3 -(DBL_MANT_DIG+2)%4;
  7435. switch(self.valueOf()){case Infinity:
  7436. case -Infinity:
  7437. case Number.NaN:
  7438. case -Number.NaN:
  7439. return self
  7440. case -0:
  7441. return '-0x0.0p0'
  7442. case 0:
  7443. return '0x0.0p0'}
  7444. var _a=_b_.$frexp(_b_.$fabs(self.valueOf()))
  7445. var _m=_a[0],_e=_a[1]
  7446. var _shift=1 - Math.max(-1021 - _e,0)
  7447. _m=_b_.$ldexp(_m,_shift)
  7448. _e -=_shift
  7449. var _int2hex='0123456789ABCDEF'.split('')
  7450. var _s=_int2hex[Math.floor(_m)]
  7451. _s+='.'
  7452. _m -=Math.floor(_m)
  7453. for(var i=0;i <(TOHEX_NBITS-1)/4;i++){_m*=16.0
  7454. _s+=_int2hex[Math.floor(_m)]
  7455. _m-=Math.floor(_m)}
  7456. var _esign='+'
  7457. if(_e < 0){_esign='-'
  7458. _e=-_e}
  7459. if(self.value < 0)return "-0x" + _s + 'p' + _esign + _e;
  7460. return "0x" + _s + 'p' + _esign + _e;}
  7461. $FloatDict.__init__=function(self,value){self=new Number(value)}
  7462. $FloatDict.__int__=function(self){return parseInt(self)}
  7463. $FloatDict.is_integer=function(self){return _b_.int(self)==self}
  7464. $FloatDict.__mod__=function(self,other){
  7465. if(other==0){throw ZeroDivisionError('float modulo')}
  7466. if(isinstance(other,_b_.int))return new Number((self%other+other)%other)
  7467. if(isinstance(other,float)){
  7468. var q=Math.floor(self/other),r=self-other*q
  7469. return new Number(r)}
  7470. if(isinstance(other,_b_.bool)){var bool_value=0;
  7471. if(other.valueOf())bool_value=1;
  7472. return new Number((self%bool_value+bool_value)%bool_value)}
  7473. if(hasattr(other,'__rmod__'))return getattr(other,'__rmod__')(self)
  7474. $err('%',other)}
  7475. $FloatDict.__mro__=[$ObjectDict]
  7476. $FloatDict.__mul__=function(self,other){if(isinstance(other,_b_.int)){if(other.__class__==$B.LongInt.$dict){return new Number(self*parseFloat(other.value))}
  7477. return new Number(self*other)}
  7478. if(isinstance(other,float))return new Number(self*other)
  7479. if(isinstance(other,_b_.bool)){var bool_value=0;
  7480. if(other.valueOf())bool_value=1;
  7481. return new Number(self*bool_value)}
  7482. if(isinstance(other,_b_.complex)){return _b_.complex(float(self*other.real),float(self*other.imag))}
  7483. if(hasattr(other,'__rmul__'))return getattr(other,'__rmul__')(self)
  7484. $err('*',other)}
  7485. $FloatDict.__ne__=function(self,other){return !$FloatDict.__eq__(self,other)}
  7486. $FloatDict.__neg__=function(self,other){return float(-self)}
  7487. $FloatDict.__pos__=function(self){return self}
  7488. $FloatDict.__pow__=function(self,other){var other_int=isinstance(other,_b_.int)
  7489. if(other_int ||isinstance(other,float)){if(self==1){return self}
  7490. if(other==0){return new Number(1)}
  7491. if(self==-1 &&
  7492. (!isFinite(other)||other.__class__===$B.LongInt.$dict ||!$B.is_safe_int(other))
  7493. && !isNaN(other)){return new Number(1)}
  7494. else if(self==0 && isFinite(other)&& other<0){throw _b_.ZeroDivisionError("0.0 cannot be raised to a negative power")}else if(self==Number.NEGATIVE_INFINITY && !isNaN(other)){if(other<0 && other%2==1){return new Number(-0.0)}else if(other<0){return new Number(0)}
  7495. else if(other>0 && other%2==1){return Number.NEGATIVE_INFINITY}else{return Number.POSITIVE_INFINITY}}else if(self==Number.POSITIVE_INFINITY && !isNaN(other)){return other>0 ? self : new Number(0)}
  7496. if(other==Number.NEGATIVE_INFINITY && !isNaN(self)){return Math.abs(self)<1 ? Number.POSITIVE_INFINITY : new Number(0)}else if(other==Number.POSITIVE_INFINITY && !isNaN(self)){return Math.abs(self)<1 ? new Number(0): Number.POSITIVE_INFINITY}
  7497. if(self<0 && !_b_.getattr(other,'__eq__')(_b_.int(other))){
  7498. return _b_.complex.$dict.__pow__(_b_.complex(self,0),other)}
  7499. return float(Math.pow(self,other))}else if(isinstance(other,_b_.complex)){var preal=Math.pow(self,other.real),ln=Math.log(self)
  7500. return _b_.complex(preal*Math.cos(ln),preal*Math.sin(ln))}
  7501. if(hasattr(other,'__rpow__'))return getattr(other,'__rpow__')(self)
  7502. $err("** or pow()",other)}
  7503. $FloatDict.__repr__=$FloatDict.__str__=function(self){if(self===float)return "<class 'float'>"
  7504. if(self.valueOf()==Infinity)return 'inf'
  7505. if(self.valueOf()==-Infinity)return '-inf'
  7506. if(isNaN(self.valueOf()))return 'nan'
  7507. var res=self.valueOf()+''
  7508. if(res.indexOf('.')==-1)res+='.0'
  7509. return _b_.str(res)}
  7510. $FloatDict.__setattr__=function(self,attr,value){if(self.constructor===Number){if($FloatDict[attr]===undefined){throw _b_.AttributeError("'float' object has no attribute '"+attr+"'")}else{throw _b_.AttributeError("'float' object attribute '"+attr+"' is read-only")}}
  7511. self[attr]=value
  7512. return $N}
  7513. $FloatDict.__truediv__=function(self,other){if(isinstance(other,[_b_.int,float])){if(other.valueOf()==0)throw ZeroDivisionError('division by zero')
  7514. return float(self/other)}
  7515. if(isinstance(other,_b_.complex)){var cmod=other.real*other.real+other.imag*other.imag
  7516. if(cmod==0)throw ZeroDivisionError('division by zero')
  7517. return _b_.complex(float(self*other.real/cmod),float(-self*other.imag/cmod))}
  7518. if(hasattr(other,'__rtruediv__'))return getattr(other,'__rtruediv__')(self)
  7519. $err('/',other)}
  7520. var $op_func=function(self,other){if(isinstance(other,_b_.int)){if(typeof other=='boolean'){return other ? self-1 : self}else if(other.__class__===$B.LongInt.$dict){return float(self-parseInt(other.value))}else{return float(self-other)}}
  7521. if(isinstance(other,float))return float(self-other)
  7522. if(isinstance(other,_b_.bool)){var bool_value=0;
  7523. if(other.valueOf())bool_value=1;
  7524. return float(self-bool_value)}
  7525. if(isinstance(other,_b_.complex)){return _b_.complex(self - other.real,-other.imag)}
  7526. if(hasattr(other,'__rsub__'))return getattr(other,'__rsub__')(self)
  7527. $err('-',other)}
  7528. $op_func +=''
  7529. var $ops={'+':'add','-':'sub'}
  7530. for(var $op in $ops){var $opf=$op_func.replace(/-/gm,$op)
  7531. $opf=$opf.replace(/__rsub__/gm,'__r'+$ops[$op]+'__')
  7532. eval('$FloatDict.__'+$ops[$op]+'__ = '+$opf)}
  7533. var $comp_func=function(self,other){if(isinstance(other,_b_.int)){if(other.__class__===$B.LongInt.$dict){return self > parseInt(other.value)}
  7534. return self > other.valueOf()}
  7535. if(isinstance(other,float))return self > other
  7536. if(isinstance(other,_b_.bool)){return self.valueOf()> _b_.bool.$dict.__hash__(other)}
  7537. if(hasattr(other,'__int__')||hasattr(other,'__index__')){return $IntDict.__gt__(self,$B.$GetInt(other))}
  7538. var inv_op=getattr(other,'__le__',null)
  7539. if(inv_op !==null){return inv_op(self)}
  7540. var inv_op=getattr(other,'__le__',null)
  7541. if(inv_op !==null){return inv_op(self)}
  7542. throw _b_.TypeError(
  7543. 'unorderable types: float() > '+$B.get_class(other).__name__+"()")}
  7544. $comp_func +=''
  7545. for(var $op in $B.$comps){eval("$FloatDict.__"+$B.$comps[$op]+'__ = '+
  7546. $comp_func.replace(/>/gm,$op).
  7547. replace(/__gt__/gm,'__'+$B.$comps[$op]+'__').
  7548. replace(/__le__/,'__'+$B.$inv_comps[$op]+'__'))}
  7549. $B.make_rmethods($FloatDict)
  7550. var $notimplemented=function(self,other){throw _b_.TypeError(
  7551. "unsupported operand types for OPERATOR: 'float' and '"+
  7552. $B.get_class(other).__name__+"'")}
  7553. $notimplemented +=''
  7554. for(var $op in $B.$operators){
  7555. if($B.augmented_assigns[$op]===undefined){var $opfunc='__'+$B.$operators[$op]+'__'
  7556. if($FloatDict[$opfunc]===undefined){eval('$FloatDict.'+$opfunc+"="+$notimplemented.replace(/OPERATOR/gm,$op))}}}
  7557. function $FloatClass(value){return new Number(value)}
  7558. function to_digits(s){
  7559. var arabic_digits='\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669',res=''
  7560. for(var i=0;i<s.length;i++){var x=arabic_digits.indexOf(s[i])
  7561. if(x>-1){res +=x}
  7562. else{res +=s[i]}}
  7563. return res}
  7564. var float=function(value){switch(value){case undefined:
  7565. return $FloatClass(0.0)
  7566. case Number.MAX_VALUE:
  7567. return $FloatClass(Infinity)
  7568. case -Number.MAX_VALUE:
  7569. return $FloatClass(-Infinity)}
  7570. if(typeof value=="number")return new Number(value)
  7571. if(isinstance(value,float)){return value}
  7572. if(isinstance(value,_b_.bytes)){var s=getattr(value,'decode')('latin-1')
  7573. return float(getattr(value,'decode')('latin-1'))}
  7574. if(hasattr(value,'__float__')){return $FloatClass(getattr(value,'__float__')())}
  7575. if(typeof value=='string'){value=value.trim()
  7576. switch(value.toLowerCase()){case '+inf':
  7577. case 'inf':
  7578. case '+infinity':
  7579. case 'infinity':
  7580. return Number.POSITIVE_INFINITY
  7581. case '-inf':
  7582. case '-infinity':
  7583. return Number.NEGATIVE_INFINITY
  7584. case '+nan':
  7585. case 'nan':
  7586. return Number.NaN
  7587. case '-nan':
  7588. return -Number.NaN
  7589. case '':
  7590. throw _b_.ValueError('count not convert string to float')
  7591. default:
  7592. value=to_digits(value)
  7593. if(isFinite(value))return $FloatClass(eval(value))
  7594. else{
  7595. _b_.str.$dict.encode(value,'latin-1')
  7596. throw _b_.ValueError("Could not convert to float(): '"+_b_.str(value)+"'")}}}
  7597. throw _b_.TypeError("float() argument must be a string or a number, not '"+
  7598. $B.get_class(value).__name__+"'")}
  7599. float.__class__=$B.$factory
  7600. float.$dict=$FloatDict
  7601. $FloatDict.$factory=float
  7602. $FloatDict.__new__=$B.$__new__(float)
  7603. $B.$FloatClass=$FloatClass
  7604. _b_.float=float})(__BRYTHON__)
  7605. ;(function($B){eval($B.InjectBuiltins())
  7606. var $ObjectDict=_b_.object.$dict,$N=_b_.None
  7607. function $err(op,other){var msg="unsupported operand type(s) for "+op
  7608. msg +=": 'int' and '"+$B.get_class(other).__name__+"'"
  7609. throw _b_.TypeError(msg)}
  7610. var $IntDict={__class__:$B.$type,__name__:'int',__dir__:$ObjectDict.__dir__,toString:function(){return '$IntDict'},$native:true,descriptors:{'numerator':true,'denominator':true,'imag':true,'real':true}}
  7611. $IntDict.from_bytes=function(){var $=$B.args("from_bytes",3,{bytes:null,byteorder:null,signed:null},['bytes','byteorder','signed'],arguments,{signed:False},null,null)
  7612. var x=$.bytes,byteorder=$.byteorder,signed=$.signed
  7613. var _bytes,_len
  7614. if(isinstance(x,[_b_.list,_b_.tuple])){_bytes=x
  7615. _len=len(x)}else if(isinstance(x,[_b_.bytes,_b_.bytearray])){_bytes=x.source
  7616. _len=x.source.length}else{
  7617. _b_.TypeError("Error! " + _b_.type(x)+ " is not supported in int.from_bytes. fix me!")}
  7618. switch(byteorder){case 'big':
  7619. var num=_bytes[_len - 1];
  7620. var _mult=256
  7621. for(var i=(_len - 2);i >=0;i--){
  7622. num=$B.add($B.mul(_mult,_bytes[i]),num)
  7623. _mult=$B.mul(_mult,256)}
  7624. if(!signed)return num
  7625. if(_bytes[0]< 128)return num
  7626. return $B.sub(num,_mult)
  7627. case 'little':
  7628. var num=_bytes[0]
  7629. if(num >=128)num=num - 256
  7630. var _mult=256
  7631. for(var i=1;i < _len;i++){num=$B.add($B.mul(_mult,_bytes[i]),num)
  7632. _mult=$B.mul(_mult,256)}
  7633. if(!signed)return num
  7634. if(_bytes[_len - 1]< 128)return num
  7635. return $B.sub(num,_mult)}
  7636. throw _b_.ValueError("byteorder must be either 'little' or 'big'");}
  7637. $IntDict.to_bytes=function(length,byteorder,star){
  7638. throw _b_.NotImplementedError("int.to_bytes is not implemented yet")}
  7639. $IntDict.__abs__=function(self){return abs(self)}
  7640. $IntDict.__bool__=function(self){return new Boolean(self.valueOf())}
  7641. $IntDict.__ceil__=function(self){return Math.ceil(self)}
  7642. $IntDict.__class__=$B.$type
  7643. $IntDict.__divmod__=function(self,other){return divmod(self,other)}
  7644. $IntDict.__eq__=function(self,other){
  7645. if(other===undefined)return self===int
  7646. if(isinstance(other,int))return self.valueOf()==other.valueOf()
  7647. if(isinstance(other,_b_.float))return self.valueOf()==other.valueOf()
  7648. if(isinstance(other,_b_.complex)){if(other.imag !=0)return False
  7649. return self.valueOf()==other.real}
  7650. if(hasattr(other,'__eq__'))return getattr(other,'__eq__')(self)
  7651. return self.valueOf()===other}
  7652. function preformat(self,fmt){if(fmt.empty){return _b_.str(self)}
  7653. if(fmt.type && 'bcdoxXn'.indexOf(fmt.type)==-1){throw _b_.ValueError("Unknown format code '"+fmt.type+
  7654. "' for object of type 'int'")}
  7655. switch(fmt.type){case undefined:
  7656. case 'd':
  7657. return self.toString()
  7658. case 'b':
  7659. return(fmt.alternate ? '0b' : '')+ self.toString(2)
  7660. case 'c':
  7661. return _b_.chr(self)
  7662. case 'o':
  7663. return(fmt.alternate ? '0o' : '')+ self.toString(8)
  7664. case 'x':
  7665. return(fmt.alternate ? '0x' : '')+ self.toString(16)
  7666. case 'X':
  7667. return(fmt.alternate ? '0X' : '')+ self.toString(16).toUpperCase()
  7668. case 'n':
  7669. return self }
  7670. return res}
  7671. $IntDict.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
  7672. if(fmt.type && 'eEfFgG%'.indexOf(fmt.type)!=-1){
  7673. return _b_.float.$dict.__format__(self,format_spec)}
  7674. fmt.align=fmt.align ||'>'
  7675. var res=preformat(self,fmt)
  7676. if(fmt.comma){var sign=res[0]=='-' ? '-' : '',rest=res.substr(sign.length),len=rest.length,nb=Math.ceil(rest.length/3),chunks=[]
  7677. for(var i=0;i<nb;i++){chunks.push(rest.substring(len-3*i-3,len-3*i))}
  7678. chunks.reverse()
  7679. res=sign+chunks.join(',')}
  7680. return $B.format_width(res,fmt)}
  7681. $IntDict.__floordiv__=function(self,other){if(isinstance(other,int)){if(other==0)throw ZeroDivisionError('division by zero')
  7682. return Math.floor(self/other)}
  7683. if(isinstance(other,_b_.float)){if(!other.valueOf())throw ZeroDivisionError('division by zero')
  7684. return Math.floor(self/other)}
  7685. if(hasattr(other,'__rfloordiv__')){return getattr(other,'__rfloordiv__')(self)}
  7686. $err("//",other)}
  7687. $IntDict.__hash__=function(self){if(self===undefined){return $IntDict.__hashvalue__ ||$B.$py_next_hash-- }
  7688. return self.valueOf()}
  7689. $IntDict.__index__=function(self){return self}
  7690. $IntDict.__init__=function(self,value){if(value===undefined){value=0}
  7691. self.toString=function(){return value}
  7692. return $N}
  7693. $IntDict.__int__=function(self){return self}
  7694. $IntDict.__invert__=function(self){return ~self}
  7695. $IntDict.__lshift__=function(self,other){if(isinstance(other,int)){return int($B.LongInt.$dict.__lshift__($B.LongInt(self),$B.LongInt(other)))}
  7696. var rlshift=getattr(other,'__rlshift__',null)
  7697. if(rlshift!==null){return rlshift(self)}
  7698. $err('<<',other)}
  7699. $IntDict.__mod__=function(self,other){
  7700. if(isinstance(other,_b_.tuple)&& other.length==1)other=other[0]
  7701. if(isinstance(other,[int,_b_.float,bool])){if(other===false){other=0}else if(other===true){other=1}
  7702. if(other==0){throw _b_.ZeroDivisionError(
  7703. "integer division or modulo by zero")}
  7704. return(self%other+other)%other}
  7705. if(hasattr(other,'__rmod__'))return getattr(other,'__rmod__')(self)
  7706. $err('%',other)}
  7707. $IntDict.__mro__=[$ObjectDict]
  7708. $IntDict.__mul__=function(self,other){var val=self.valueOf()
  7709. if(typeof other==="string"){return other.repeat(val)}
  7710. if(isinstance(other,int)){var res=self*other
  7711. if(res>$B.min_int && res<$B.max_int){return res}
  7712. else{return int($B.LongInt.$dict.__mul__($B.LongInt(self),$B.LongInt(other)))}}
  7713. if(isinstance(other,_b_.float)){return new Number(self*other)}
  7714. if(isinstance(other,_b_.bool)){if(other.valueOf())return self
  7715. return int(0)}
  7716. if(isinstance(other,_b_.complex)){return _b_.complex($IntDict.__mul__(self,other.real),$IntDict.__mul__(self,other.imag))}
  7717. if(isinstance(other,[_b_.list,_b_.tuple])){var res=[]
  7718. var $temp=other.slice(0,other.length)
  7719. for(var i=0;i<val;i++)res=res.concat($temp)
  7720. if(isinstance(other,_b_.tuple))res=_b_.tuple(res)
  7721. return res}
  7722. if(hasattr(other,'__rmul__'))return getattr(other,'__rmul__')(self)
  7723. $err("*",other)}
  7724. $IntDict.__name__='int'
  7725. $IntDict.__neg__=function(self){return -self}
  7726. $IntDict.__new__=function(cls){if(cls===undefined){throw _b_.TypeError('int.__new__(): not enough arguments')}
  7727. return{__class__:cls.$dict}}
  7728. $IntDict.__pos__=function(self){return self}
  7729. $IntDict.__pow__=function(self,other){if(isinstance(other,int)){switch(other.valueOf()){case 0:
  7730. return int(1)
  7731. case 1:
  7732. return int(self.valueOf())}
  7733. var res=Math.pow(self.valueOf(),other.valueOf())
  7734. if(!isFinite(res)){return res}
  7735. if(res>$B.min_int && res<$B.max_int){return res}
  7736. else{return int($B.LongInt.$dict.__pow__($B.LongInt(self),$B.LongInt(other)))}}
  7737. if(isinstance(other,_b_.float)){if(self>=0){return new Number(Math.pow(self,other.valueOf()))}
  7738. else{
  7739. return _b_.complex.$dict.__pow__(_b_.complex(self,0),other)}}else if(isinstance(other,_b_.complex)){var preal=Math.pow(self,other.real),ln=Math.log(self)
  7740. return _b_.complex(preal*Math.cos(ln),preal*Math.sin(ln))}
  7741. if(hasattr(other,'__rpow__'))return getattr(other,'__rpow__')(self)
  7742. $err("**",other)}
  7743. $IntDict.__repr__=function(self){if(self===int)return "<class 'int'>"
  7744. return self.toString()}
  7745. $IntDict.__rshift__=function(self,other){if(isinstance(other,int)){return int($B.LongInt.$dict.__rshift__($B.LongInt(self),$B.LongInt(other)))}
  7746. var rrshift=getattr(other,'__rrshift__',null)
  7747. if(rrshift!==null){return rrshift(self)}
  7748. $err('>>',other)}
  7749. $IntDict.__setattr__=function(self,attr,value){if(typeof self=="number"){if($IntDict[attr]===undefined){throw _b_.AttributeError("'int' object has no attribute '"+attr+"'")}else{throw _b_.AttributeError("'int' object attribute '"+attr+"' is read-only")}}
  7750. self[attr]=value
  7751. return $N}
  7752. $IntDict.__str__=$IntDict.__repr__
  7753. $IntDict.__truediv__=function(self,other){if(isinstance(other,int)){if(other==0)throw ZeroDivisionError('division by zero')
  7754. if(other.__class__==$B.LongInt.$dict){return new Number(self/parseInt(other.value))}
  7755. return new Number(self/other)}
  7756. if(isinstance(other,_b_.float)){if(!other.valueOf())throw ZeroDivisionError('division by zero')
  7757. return new Number(self/other)}
  7758. if(isinstance(other,_b_.complex)){var cmod=other.real*other.real+other.imag*other.imag
  7759. if(cmod==0)throw ZeroDivisionError('division by zero')
  7760. return _b_.complex(self*other.real/cmod,-self*other.imag/cmod)}
  7761. if(hasattr(other,'__rtruediv__'))return getattr(other,'__rtruediv__')(self)
  7762. $err("/",other)}
  7763. $IntDict.bit_length=function(self){s=bin(self)
  7764. s=getattr(s,'lstrip')('-0b')
  7765. return s.length }
  7766. $IntDict.numerator=function(self){return self}
  7767. $IntDict.denominator=function(self){return int(1)}
  7768. $IntDict.imag=function(self){return int(0)}
  7769. $IntDict.real=function(self){return self}
  7770. $B.max_int32=(1<<30)* 2 - 1
  7771. $B.min_int32=- $B.max_int32
  7772. var $op_func=function(self,other){if(isinstance(other,int)){if(other.__class__===$B.LongInt.$dict){return $B.LongInt.$dict.__sub__($B.LongInt(self),$B.LongInt(other))}
  7773. if(self > $B.max_int32 ||self < $B.min_int32 ||
  7774. other > $B.max_int32 ||other < $B.min_int32){return $B.LongInt.$dict.__sub__($B.LongInt(self),$B.LongInt(other))}
  7775. return self-other}
  7776. if(isinstance(other,_b_.bool))return self-other
  7777. if(hasattr(other,'__rsub__'))return getattr(other,'__rsub__')(self)
  7778. $err("-",other)}
  7779. $op_func +=''
  7780. var $ops={'&':'and','|':'or','^':'xor'}
  7781. for(var $op in $ops){var opf=$op_func.replace(/-/gm,$op)
  7782. opf=opf.replace(new RegExp('sub','gm'),$ops[$op])
  7783. eval('$IntDict.__'+$ops[$op]+'__ = '+opf)}
  7784. var $op_func=function(self,other){if(isinstance(other,int)){if(typeof other=='number'){var res=self.valueOf()-other.valueOf()
  7785. if(res>=$B.min_int && res<=$B.max_int){return res}
  7786. else{return $B.LongInt.$dict.__sub__($B.LongInt(self),$B.LongInt(other))}}else if(typeof other=="boolean"){return other ? self-1 : self}else{return $B.LongInt.$dict.__sub__($B.LongInt(self),$B.LongInt(other))}}
  7787. if(isinstance(other,_b_.float)){return new Number(self-other)}
  7788. if(isinstance(other,_b_.complex)){return _b_.complex(self-other.real,-other.imag)}
  7789. if(isinstance(other,_b_.bool)){var bool_value=0;
  7790. if(other.valueOf())bool_value=1;
  7791. return self-bool_value}
  7792. if(isinstance(other,_b_.complex)){return _b_.complex(self.valueOf()- other.real,other.imag)}
  7793. if(hasattr(other,'__rsub__'))return getattr(other,'__rsub__')(self)
  7794. throw $err('-',other)}
  7795. $op_func +=''
  7796. var $ops={'+':'add','-':'sub'}
  7797. for(var $op in $ops){var opf=$op_func.replace(/-/gm,$op)
  7798. opf=opf.replace(new RegExp('sub','gm'),$ops[$op])
  7799. eval('$IntDict.__'+$ops[$op]+'__ = '+opf)}
  7800. var $comp_func=function(self,other){if(other.__class__===$B.LongInt.$dict){return $B.LongInt.$dict.__lt__(other,$B.LongInt(self))}
  7801. if(isinstance(other,int))return self.valueOf()> other.valueOf()
  7802. if(isinstance(other,_b_.float))return self.valueOf()> other.valueOf()
  7803. if(isinstance(other,_b_.bool)){return self.valueOf()> _b_.bool.$dict.__hash__(other)}
  7804. if(hasattr(other,'__int__')||hasattr(other,'__index__')){return $IntDict.__gt__(self,$B.$GetInt(other))}
  7805. var inv_op=getattr(other,'__lt__',null)
  7806. if(inv_op !==null){return inv_op(self)}
  7807. throw _b_.TypeError(
  7808. "unorderable types: int() > "+$B.get_class(other).__name__+"()")}
  7809. $comp_func +=''
  7810. for(var $op in $B.$comps){eval("$IntDict.__"+$B.$comps[$op]+'__ = '+
  7811. $comp_func.replace(/>/gm,$op).
  7812. replace(/__gt__/gm,'__'+$B.$comps[$op]+'__').
  7813. replace(/__lt__/,'__'+$B.$inv_comps[$op]+'__'))}
  7814. $B.make_rmethods($IntDict)
  7815. var $valid_digits=function(base){var digits=''
  7816. if(base===0)return '0'
  7817. if(base < 10){for(var i=0;i < base;i++)digits+=String.fromCharCode(i+48)
  7818. return digits}
  7819. var digits='0123456789'
  7820. for(var i=10;i < base;i++)digits+=String.fromCharCode(i+55)
  7821. return digits}
  7822. var int=function(value,base){
  7823. if(value===undefined){return 0}
  7824. if(typeof value=='number' &&
  7825. (base===undefined ||base==10)){return parseInt(value)}
  7826. if(base!==undefined){if(!isinstance(value,[_b_.str,_b_.bytes,_b_.bytearray])){throw TypeError("int() can't convert non-string with explicit base")}}
  7827. if(isinstance(value,_b_.complex)){throw TypeError("can't convert complex to int")}
  7828. var $ns=$B.args('int',2,{x:null,base:null},['x','base'],arguments,{'base':10},'null','null')
  7829. var value=$ns['x']
  7830. var base=$ns['base']
  7831. if(isinstance(value,_b_.float)&& base===10){if(value<$B.min_int ||value>$B.max_int){return $B.LongInt.$dict.$from_float(value)}
  7832. else{return value>0 ? Math.floor(value): Math.ceil(value)}}
  7833. if(!(base >=2 && base <=36)){
  7834. if(base !=0)throw _b_.ValueError("invalid base")}
  7835. if(typeof value=='number'){if(base==10){if(value < $B.min_int ||value > $B.max_int)return $B.LongInt(value)
  7836. return value}else if(value.toString().search('e')>-1){
  7837. throw _b_.OverflowError("can't convert to base "+base)}else{var res=parseInt(value,base)
  7838. if(res < $B.min_int ||res > $B.max_int)return $B.LongInt(value,base)
  7839. return res}}
  7840. if(value===true)return Number(1)
  7841. if(value===false)return Number(0)
  7842. if(value.__class__===$B.LongInt.$dict){var z=parseInt(value.value)
  7843. if(z>$B.min_int && z<$B.max_int){return z}
  7844. else{return value}}
  7845. base=$B.$GetInt(base)
  7846. if(isinstance(value,_b_.str))value=value.valueOf()
  7847. if(typeof value=="string"){var _value=value.trim()
  7848. if(_value.length==2 && base==0 &&(_value=='0b' ||_value=='0o' ||_value=='0x')){throw _b_.ValueError('invalid value')}
  7849. if(_value.length >2){var _pre=_value.substr(0,2).toUpperCase()
  7850. if(base==0){if(_pre=='0B')base=2
  7851. if(_pre=='0O')base=8
  7852. if(_pre=='0X')base=16}
  7853. if(_pre=='0B' ||_pre=='0O' ||_pre=='0X'){_value=_value.substr(2)}}
  7854. var _digits=$valid_digits(base)
  7855. var _re=new RegExp('^[+-]?['+_digits+']+$','i')
  7856. if(!_re.test(_value)){throw _b_.ValueError(
  7857. "invalid literal for int() with base "+base +": '"+_b_.str(value)+"'")}
  7858. if(base <=10 && !isFinite(value)){throw _b_.ValueError(
  7859. "invalid literal for int() with base "+base +": '"+_b_.str(value)+"'")}
  7860. var res=parseInt(_value,base)
  7861. if(res < $B.min_int ||res > $B.max_int)return $B.LongInt(_value,base)
  7862. return res}
  7863. if(isinstance(value,[_b_.bytes,_b_.bytearray])){var _digits=$valid_digits(base)
  7864. for(var i=0;i<value.source.length;i++){if(_digits.indexOf(String.fromCharCode(value.source[i]))==-1){throw _b_.ValueError("invalid literal for int() with base "+
  7865. base +": "+_b_.repr(value))}}
  7866. return Number(parseInt(getattr(value,'decode')('latin-1'),base))}
  7867. if(hasattr(value,'__int__'))return getattr(value,'__int__')()
  7868. if(hasattr(value,'__index__'))return getattr(value,'__index__')()
  7869. if(hasattr(value,'__trunc__')){var res=getattr(value,'__trunc__')(),int_func=_b_.getattr(res,'__int__',null)
  7870. if(int_func===null){throw TypeError('__trunc__ returned non-Integral (type '+
  7871. $B.get_class(res).__name__+')')}
  7872. var res=int_func()
  7873. if(isinstance(res,int)){return res}
  7874. throw TypeError('__trunc__ returned non-Integral (type '+
  7875. $B.get_class(res).__name__+')')}
  7876. throw _b_.ValueError(
  7877. "invalid literal for int() with base "+base +": '"+_b_.str(value)+"'")}
  7878. int.$dict=$IntDict
  7879. int.__class__=$B.$factory
  7880. $IntDict.$factory=int
  7881. _b_.int=int
  7882. var $BoolDict=_b_.bool.$dict
  7883. $BoolDict.__add__=function(self,other){return(other ? 1 : 0)+(self ? 1 : 0)}
  7884. $BoolDict.__and__=function(self,other){return bool($IntDict.__and__(self,other))}
  7885. $BoolDict.__eq__=function(self,other){return self ? bool(other): !bool(other)}
  7886. $BoolDict.__ne__=function(self,other){return self ? !bool(other): bool(other)}
  7887. $BoolDict.__ge__=function(self,other){return _b_.int.$dict.__ge__($BoolDict.__hash__(self),other)}
  7888. $BoolDict.__gt__=function(self,other){return _b_.int.$dict.__gt__($BoolDict.__hash__(self),other)}
  7889. $BoolDict.__hash__=$BoolDict.__index__=$BoolDict.__int__=function(self){if(self.valueOf())return 1
  7890. return 0}
  7891. $BoolDict.__le__=function(self,other){return !$BoolDict.__gt__(self,other)}
  7892. $BoolDict.__lshift__=function(self,other){return self.valueOf()<< other}
  7893. $BoolDict.__lt__=function(self,other){return !$BoolDict.__ge__(self,other)}
  7894. $BoolDict.__mul__=function(self,other){return self ? other : 0}
  7895. $BoolDict.__neg__=function(self){return -$B.int_or_bool(self)}
  7896. $BoolDict.__or__=function(self,other){return bool($IntDict.__or__(self,other))}
  7897. $BoolDict.__pos__=$B.int_or_bool
  7898. $BoolDict.__repr__=$BoolDict.__str__=function(self){return self ? "True" : "False"}
  7899. $BoolDict.__setattr__=function(self,attr){return no_set_attr($BoolDict,attr)}
  7900. $BoolDict.__sub__=function(self,other){return(self ? 1 : 0)-(other ? 1 : 0)}
  7901. $BoolDict.__xor__=function(self,other){return self.valueOf()!=other.valueOf()}
  7902. $BoolDict.__mro__=[$IntDict,_b_.object.$dict]})(__BRYTHON__)
  7903. ;(function($B){
  7904. eval($B.InjectBuiltins())
  7905. var $LongIntDict={__class__:$B.$type,__name__:'int'}
  7906. function add_pos(v1,v2){
  7907. var res='',carry=0,iself=v1.length,sv=0,x
  7908. for(var i=v2.length-1;i>=0;i--){iself--
  7909. if(iself<0){sv=0}else{sv=parseInt(v1.charAt(iself))}
  7910. x=(carry+sv+parseInt(v2.charAt(i))).toString()
  7911. if(x.length==2){res=x.charAt(1)+res;carry=parseInt(x.charAt(0))}
  7912. else{res=x+res;carry=0}}
  7913. while(iself>0){iself--
  7914. x=(carry+parseInt(v1.charAt(iself))).toString()
  7915. if(x.length==2){res=x.charAt(1)+res;carry=parseInt(x.charAt(0))}
  7916. else{res=x+res;carry=0}}
  7917. if(carry){res=carry+res}
  7918. return{__class__:$LongIntDict,value:res,pos:true}}
  7919. function check_shift(shift){
  7920. if(!isinstance(shift,LongInt)){throw TypeError("shift must be int, not '"+
  7921. $B.get_class(shift).__name__+"'")}
  7922. if(!shift.pos){throw ValueError("negative shift count")}}
  7923. function clone(obj){
  7924. var obj1={}
  7925. for(var attr in obj){obj1[attr]=obj[attr]}
  7926. return obj1}
  7927. function comp_pos(v1,v2){
  7928. if(v1.length>v2.length){return 1}
  7929. else if(v1.length<v2.length){return -1}
  7930. else{if(v1>v2){return 1}
  7931. else if(v1<v2){return -1}}
  7932. return 0}
  7933. function divmod_pos(v1,v2){
  7934. var quotient,mod
  7935. if(comp_pos(v1,v2)==-1){
  7936. quotient='0'
  7937. mod=LongInt(v1)}else if(v2==v1){
  7938. quotient='1';
  7939. mod=LongInt('0')}else{var quotient=''
  7940. var left=v1.substr(0,v2.length)
  7941. if(v1<v2){left=v1.substr(0,v2.length+1)}
  7942. var right=v1.substr(left.length)
  7943. var mv2={}
  7944. while(true){
  7945. var candidate=Math.floor(parseInt(left)/parseInt(v2))+''
  7946. if(mv2[candidate]===undefined){mv2[candidate]=mul_pos(v2,candidate).value}
  7947. if(comp_pos(left,mv2[candidate])==-1){
  7948. candidate--
  7949. if(mv2[candidate]===undefined){mv2[candidate]=mul_pos(v2,candidate).value}}
  7950. quotient +=candidate
  7951. left=sub_pos(left,mv2[candidate]).value
  7952. if(right.length==0){break}
  7953. left +=right.charAt(0)
  7954. right=right.substr(1)}
  7955. mod=sub_pos(v1,mul_pos(quotient,v2).value)}
  7956. return[LongInt(quotient),mod]}
  7957. function split_chunks(s,size){var nb=Math.ceil(s.length/size),chunks=[],len=s.length
  7958. for(var i=0;i<nb;i++){var pos=len-size*(i+1)
  7959. if(pos<0){size +=pos;pos=0}
  7960. chunks.push(parseInt(s.substr(pos,size)))}
  7961. return chunks}
  7962. function mul_pos(x,y){
  7963. var chunk_size=6
  7964. var cx=split_chunks(x,chunk_size),cy=split_chunks(y,chunk_size)
  7965. var products={},len=cx.length+cy.length
  7966. for(var i=0;i<len-1;i++){products[i]=0}
  7967. for(var i=0;i<cx.length;i++){for(var j=0;j<cy.length;j++){products[i+j]+=cx[i]*cy[j]}}
  7968. var nb=len-1,pos
  7969. for(var i=0;i<len-1;i++){var chunks=split_chunks(products[i].toString(),chunk_size)
  7970. for(var j=1;j<chunks.length;j++){pos=i+j
  7971. if(products[pos]===undefined){products[pos]=parseInt(chunks[j]);nb=pos}
  7972. else{products[pos]+=parseInt(chunks[j])}}
  7973. products[i]=chunks[0]}
  7974. var result='',i=0,s
  7975. while(products[i]!==undefined){s=products[i].toString()
  7976. if(products[i+1]!==undefined){s='0'.repeat(chunk_size-s.length)+s}
  7977. result=s+result;
  7978. i++}
  7979. return LongInt(result)}
  7980. function sub_pos(v1,v2){
  7981. var res='',carry=0,i1=v1.length,sv=0,x
  7982. for(var i=v2.length-1;i>=0;i--){i1--
  7983. sv=parseInt(v1.charAt(i1))
  7984. x=(sv-carry-parseInt(v2.charAt(i)))
  7985. if(x<0){res=(10+x)+res;carry=1}
  7986. else{res=x+res;carry=0}}
  7987. while(i1>0){i1--
  7988. x=(parseInt(v1.charAt(i1))-carry)
  7989. if(x<0){res=(10+x)+res;carry=1}
  7990. else{res=x+res;carry=0}}
  7991. while(res.charAt(0)=='0' && res.length>1){res=res.substr(1)}
  7992. return{__class__:$LongIntDict,value:res,pos:true}}
  7993. $LongIntDict.$from_float=function(value){var s=Math.abs(value).toString(),v=s
  7994. if(s.search('e')>-1){var t=/-?(\d)(\.\d+)?e([+-])(\d*)/.exec(s),n1=t[1],n2=t[2],pos=t[3],exp=t[4]
  7995. if(pos=='+'){if(n2===undefined){v=n1+'0'.repeat(exp-1)}else{v=n1+n2+'0'.repeat(exp-1-n2.length)}}}
  7996. return{__class__:$LongIntDict,value: v,pos: value >=0}}
  7997. $LongIntDict.__abs__=function(self){return{__class__:$LongIntDict,value: self.value,pos:true}}
  7998. $LongIntDict.__add__=function(self,other){if(isinstance(other,_b_.float)){return _b_.float(parseInt(self.value)+other.value)}
  7999. if(typeof other=='number')other=LongInt(_b_.str(other))
  8000. var res
  8001. if(self.pos&&other.pos){
  8002. return add_pos(self.value,other.value)}else if(!self.pos&&!other.pos){
  8003. res=add_pos(self.value,other.value)
  8004. res.pos=false
  8005. return intOrLong(res)}else if(self.pos && !other.pos){
  8006. switch(comp_pos(self.value,other.value)){case 1:
  8007. res=sub_pos(self.value,other.value)
  8008. break
  8009. case 0:
  8010. res={__class__:$LongIntDict,value:0,pos:true}
  8011. break
  8012. case -1:
  8013. res=sub_pos(other.value,self.value)
  8014. res.pos=false
  8015. break}
  8016. return intOrLong(res)}else{
  8017. switch(comp_pos(self.value,other.value)){case 1:
  8018. res=sub_pos(self.value,other.value)
  8019. res.pos=false
  8020. break
  8021. case 0:
  8022. res={__class__:$LongIntDict,value:0,pos:true}
  8023. break
  8024. case -1:
  8025. res=sub_pos(other.value,self.value)
  8026. break}
  8027. return intOrLong(res)}}
  8028. $LongIntDict.__and__=function(self,other){if(typeof other=='number')other=LongInt(_b_.str(other))
  8029. var v1=$LongIntDict.__index__(self)
  8030. var v2=$LongIntDict.__index__(other)
  8031. if(v1.length<v2.length){var temp=v2;v2=v1;v1=temp}
  8032. var start=v1.length-v2.length
  8033. var res=''
  8034. for(var i=0;i<v2.length;i++){if(v1.charAt(start+i)=='1' && v2.charAt(i)=='1'){res +='1'}
  8035. else{res +='0'}}
  8036. return intOrLong(LongInt(res,2))}
  8037. $LongIntDict.__divmod__=function(self,other){if(typeof other=='number')other=LongInt(_b_.str(other))
  8038. var dm=divmod_pos(self.value,other.value)
  8039. if(self.pos!==other.pos){if(dm[0].value!='0'){dm[0].pos=false}
  8040. if(dm[1].value!='0'){
  8041. dm[0]=$LongIntDict.__sub__(dm[0],LongInt('1'))
  8042. dm[1]=$LongIntDict.__add__(dm[1],LongInt('1'))}}
  8043. return[intOrLong(dm[0]),intOrLong(dm[1])]}
  8044. $LongIntDict.__eq__=function(self,other){if(typeof other=='number')other=LongInt(_b_.str(other))
  8045. return self.value==other.value && self.pos==other.pos}
  8046. $LongIntDict.__float__=function(self){return new Number(parseFloat(self.value))}
  8047. $LongIntDict.__floordiv__=function(self,other){if(isinstance(other,_b_.float)){return _b_.float(parseInt(self.value)/other)}
  8048. if(typeof other=='number')other=LongInt(_b_.str(other))
  8049. return intOrLong($LongIntDict.__divmod__(self,other)[0])}
  8050. $LongIntDict.__ge__=function(self,other){if(typeof other=='number')other=LongInt(_b_.str(other))
  8051. if(self.pos !=other.pos){return !other.pos}
  8052. if(self.value.length>other.value.length){return self.pos}
  8053. else if(self.value.length<other.value.length){return !self.pos}
  8054. else{return self.pos ? self.value >=other.value : self.value <=other.value}}
  8055. $LongIntDict.__gt__=function(self,other){return !$LongIntDict.__le__(self,other)}
  8056. $LongIntDict.__index__=function(self){
  8057. var res='',temp=self.value,d
  8058. while(true){d=divmod_pos(temp,'2')
  8059. res=d[1].value + res
  8060. temp=d[0].value
  8061. if(temp=='0'){break}}
  8062. return intOrLong(res)}
  8063. $LongIntDict.__invert__=function(self){return $LongIntDict.__sub__(LongInt('-1'),self)}
  8064. $LongIntDict.__le__=function(self,other){if(typeof other=='number')other=LongInt(_b_.str(other))
  8065. if(self.pos !==other.pos){return !self.pos}
  8066. if(self.value.length>other.value.length){return !self.pos}
  8067. else if(self.value.length<other.value.length){return self.pos}
  8068. else{return self.pos ? self.value <=other.value : self.value >=other.value}}
  8069. $LongIntDict.__lt__=function(self,other){return !$LongIntDict.__ge__(self,other)}
  8070. $LongIntDict.__lshift__=function(self,shift){var is_long=shift.__class__==$LongIntDict
  8071. if(is_long){var shift_value=parseInt(shift.value)
  8072. if(shift_value<0){throw _b_.ValueError('negative shift count')}
  8073. if(shift_value < $B.max_int){shift_safe=true;shift=shift_value}}
  8074. if(shift_safe){if(shift_value==0){return self}}else{shift=LongInt(shift)
  8075. if(shift.value=='0'){return self}}
  8076. var res=self.value
  8077. while(true){var x,carry=0,res1=''
  8078. for(var i=res.length-1;i>=0;i--){x=(carry+parseInt(res.charAt(i))*2).toString()
  8079. if(x.length==2){res1=x.charAt(1)+res1;carry=parseInt(x.charAt(0))}
  8080. else{res1=x+res1;carry=0}}
  8081. if(carry){res1=carry+res1}
  8082. res=res1
  8083. if(shift_safe){shift--
  8084. if(shift==0){break}}else{shift=sub_pos(shift.value,'1')
  8085. if(shift.value=='0'){break}}}
  8086. return intOrLong({__class__:$LongIntDict,value:res,pos:self.pos})}
  8087. $LongIntDict.__mod__=function(self,other){return intOrLong($LongIntDict.__divmod__(self,other)[1])}
  8088. $LongIntDict.__mro__=[_b_.int.$dict,_b_.object.$dict]
  8089. $LongIntDict.__mul__=function(self,other){switch(self){case Number.NEGATIVE_INFINITY:
  8090. case Number.POSITIVE_INFINITY:
  8091. var eq=_b_.getattr(other,'__eq__')
  8092. if(eq(0)){return NaN}
  8093. else if(_b_.getattr(other,'__gt__')(0)){return self}
  8094. else{return -self}}
  8095. if(isinstance(other,_b_.float)){return _b_.float(parseInt(self.value)*other)}
  8096. if(typeof other=='number')other=LongInt(_b_.str(other))
  8097. var res=mul_pos(self.value,other.value)
  8098. if(self.pos==other.pos){return intOrLong(res)}
  8099. res.pos=false
  8100. return intOrLong(res)}
  8101. $LongIntDict.__neg__=function(obj){return{__class__:$LongIntDict,value:obj.value,pos:!obj.pos}}
  8102. $LongIntDict.__or__=function(self,other){other=LongInt(other)
  8103. var v1=$LongIntDict.__index__(self)
  8104. var v2=$LongIntDict.__index__(other)
  8105. if(v1.length<v2.length){var temp=v2;v2=v1;v1=temp}
  8106. var start=v1.length-v2.length
  8107. var res=v1.substr(0,start)
  8108. for(var i=0;i<v2.length;i++){if(v1.charAt(start+i)=='1' ||v2.charAt(i)=='1'){res +='1'}
  8109. else{res +='0'}}
  8110. return intOrLong(LongInt(res,2))}
  8111. $LongIntDict.__pos__=function(self){return self}
  8112. $LongIntDict.__pow__=function(self,power){if(typeof power=="number"){power=LongInt(_b_.str(power))}else if(!isinstance(power,LongInt)){var msg="power must be a LongDict, not '"
  8113. throw TypeError(msg+$B.get_class(power).__name__+"'")}
  8114. if(!power.pos){if(self.value=='1'){return self}
  8115. return LongInt('0')}else if(power.value=='0'){return LongInt('1')}
  8116. var res={__class__:$LongIntDict,value:self.value,pos:self.pos}
  8117. var pow=power.value
  8118. while(true){pow=sub_pos(pow,'1').value
  8119. if(pow=='0'){break}
  8120. res=LongInt($LongIntDict.__mul__(res,self))}
  8121. return intOrLong(res)}
  8122. $LongIntDict.__rshift__=function(self,shift){shift=LongInt(shift)
  8123. if(shift.value=='0'){return self}
  8124. var res=self.value
  8125. while(true){res=divmod_pos(res,'2')[0].value
  8126. if(res.value=='0'){break}
  8127. shift=sub_pos(shift.value,'1')
  8128. if(shift.value=='0'){break}}
  8129. return intOrLong({__class__:$LongIntDict,value:res,pos:self.pos})}
  8130. $LongIntDict.__str__=$LongIntDict.__repr__=function(self){var res=""
  8131. if(!self.pos){res +='-'}
  8132. return res+self.value}
  8133. $LongIntDict.__sub__=function(self,other){if(isinstance(other,_b_.float)){return _b_.float(parseInt(self.value)-other.value)}
  8134. if(typeof other=='number')other=LongInt(_b_.str(other))
  8135. var res
  8136. if(self.pos && other.pos){switch(comp_pos(self.value,other.value)){case 1:
  8137. res=sub_pos(self.value,other.value)
  8138. break
  8139. case 0:
  8140. res={__class__:$LongIntDict,value:'0',pos:true}
  8141. break
  8142. case -1:
  8143. res=sub_pos(other.value,self.value)
  8144. res.pos=false
  8145. break}
  8146. return intOrLong(res)}else if(!self.pos && !other.pos){switch(comp_pos(self.value,other.value)){case 1:
  8147. res=sub_pos(self.value,other.value)
  8148. res.pos=false
  8149. break
  8150. case 0:
  8151. res={__class__:$LongIntDict,value:'0',pos:true}
  8152. break
  8153. case -1:
  8154. res=sub_pos(other.value,self.value)
  8155. break}
  8156. return intOrLong(res)}else if(self.pos && !other.pos){return intOrLong(add_pos(self.value,other.value))}else{res=add_pos(self.value,other.value)
  8157. res.pos=false
  8158. return intOrLong(res)}}
  8159. $LongIntDict.__truediv__=function(self,other){if(isinstance(other,LongInt)){return _b_.float(parseInt(self.value)/parseInt(other.value))}else if(isinstance(other,_b_.int)){return _b_.float(parseInt(self.value)/other)}else if(isinstance(other,_b_.float)){return _b_.float(parseInt(self.value)/other)}else{throw TypeError("unsupported operand type(s) for /: 'int' and '"+
  8160. $B.get_class(other).__name__+"'")}}
  8161. $LongIntDict.__xor__=function(self,other){other=LongInt(other)
  8162. var v1=$LongIntDict.__index__(self)
  8163. var v2=$LongIntDict.__index__(other)
  8164. if(v1.length<v2.length){var temp=v2;v2=v1;v1=temp}
  8165. var start=v1.length-v2.length
  8166. var res=v1.substr(0,start)
  8167. for(var i=0;i<v2.length;i++){if(v1.charAt(start+i)=='1' && v2.charAt(i)=='0'){res +='1'}
  8168. else if(v1.charAt(start+i)=='0' && v2.charAt(i)=='1'){res +='1'}
  8169. else{res +='0'}}
  8170. return intOrLong(LongInt(res,2))}
  8171. $LongIntDict.to_base=function(self,base){
  8172. var res='',v=self.value
  8173. while(v>0){var dm=divmod_pos(v,base.toString())
  8174. res=parseInt(dm[1].value).toString(base)+res
  8175. v=dm[0].value
  8176. if(v==0){break}}
  8177. return res}
  8178. function digits(base){
  8179. var is_digits={}
  8180. for(var i=0;i<base;i++){if(i==10){break}
  8181. is_digits[i]=true}
  8182. if(base>10){
  8183. for(var i=0;i<base-10;i++){is_digits[String.fromCharCode(65+i)]=true
  8184. is_digits[String.fromCharCode(97+i)]=true}}
  8185. return is_digits}
  8186. var MAX_SAFE_INTEGER=Math.pow(2,53)-1;
  8187. var MIN_SAFE_INTEGER=-MAX_SAFE_INTEGER;
  8188. function isSafeInteger(n){return(typeof n==='number' &&
  8189. Math.round(n)===n &&
  8190. MIN_SAFE_INTEGER <=n &&
  8191. n <=MAX_SAFE_INTEGER);}
  8192. function intOrLong(long){
  8193. var v=parseInt(long.value)*(long.pos ? 1 : -1)
  8194. if(v>MIN_SAFE_INTEGER && v<MAX_SAFE_INTEGER){return v}
  8195. return long}
  8196. function LongInt(value,base){if(arguments.length>2){throw _b_.TypeError("LongInt takes at most 2 arguments ("+
  8197. arguments.length+" given)")}
  8198. if(base===undefined){base=10}
  8199. else if(!isinstance(base,int)){throw TypeError("'"+$B.get_class(base).__name__+"' object cannot be interpreted as an integer")}
  8200. if(base<0 ||base==1 ||base>36){throw ValueError("LongInt() base must be >= 2 and <= 36")}
  8201. if(isinstance(value,_b_.float)){if(value===Number.POSITIVE_INFINITY ||value===Number.NEGATIVE_INFINITY){return value}
  8202. if(value>=0){value=new Number(Math.round(value.value))}
  8203. else{value=new Number(Math.ceil(value.value))}}else if(isinstance(value,_b_.bool)){if(value.valueOf())return int(1)
  8204. return int(0)}
  8205. if(typeof value=='number'){if(isSafeInteger(value)){value=value.toString()}
  8206. else if(value.constructor==Number){console.log('big number',value);value=value.toString()}
  8207. else{console.log('wrong value',value);throw ValueError("argument of long_int is not a safe integer")}}else if(value.__class__===$LongIntDict){return value}
  8208. else if(isinstance(value,_b_.bool)){value=_b_.bool.$dict.__int__(value)+''}
  8209. else if(typeof value!='string'){throw ValueError("argument of long_int must be a string, not "+
  8210. $B.get_class(value).__name__)}
  8211. var has_prefix=false,pos=true,start=0
  8212. while(value.charAt(0)==' ' && value.length){value=value.substr(1)}
  8213. while(value.charAt(value.length-1)==' ' && value.length){value=value.substr(0,value.length-1)}
  8214. if(value.charAt(0)=='+'){has_prefix=true}
  8215. else if(value.charAt(0)=='-'){has_prefix=true;pos=false}
  8216. if(has_prefix){
  8217. if(value.length==1){
  8218. throw ValueError('LongInt argument is not a valid number: "'+value+'"')}else{value=value.substr(1)}}
  8219. while(start<value.length-1 && value.charAt(start)=='0'){start++}
  8220. value=value.substr(start)
  8221. var is_digits=digits(base),point=-1
  8222. for(var i=0;i<value.length;i++){if(value.charAt(i)=='.' && point==-1){point=i}
  8223. else if(!is_digits[value.charAt(i)]){throw ValueError('LongInt argument is not a valid number: "'+value+'"')}}
  8224. if(point!=-1){value=value.substr(0,point)}
  8225. if(base!=10){
  8226. var coef='1',v10=LongInt(0),pos=value.length
  8227. while(pos--){var digit_base10=parseInt(value.charAt(pos),base).toString(),digit_by_coef=mul_pos(coef,digit_base10).value
  8228. v10=add_pos(v10.value,digit_by_coef)
  8229. coef=mul_pos(coef,base.toString()).value}
  8230. return v10}
  8231. return{__class__:$LongIntDict,value:value,pos:pos}}
  8232. LongInt.__class__=$B.$factory
  8233. LongInt.$dict=$LongIntDict
  8234. $LongIntDict.$factory=LongInt
  8235. $B.LongInt=LongInt})(__BRYTHON__)
  8236. ;(function($B){eval($B.InjectBuiltins())
  8237. var $ObjectDict=_b_.object.$dict
  8238. function $UnsupportedOpType(op,class1,class2){throw _b_.TypeError("unsupported operand type(s) for "+op+": '"+class1+"' and '"+class2+"'")}
  8239. var $ComplexDict={__class__:$B.$type,__dir__:$ObjectDict.__dir__,__name__:'complex',$native:true,descriptors:{real:true,imag:true}}
  8240. $ComplexDict.__abs__=function(self){return Math.sqrt(Math.pow(self.real,2)+Math.pow(self.imag,2))}
  8241. $ComplexDict.__bool__=function(self){return new Boolean(self.real ||self.imag)}
  8242. $ComplexDict.__class__=$B.$type
  8243. $ComplexDict.__eq__=function(self,other){if(isinstance(other,complex))return self.real==other.real && self.imag==other.imag
  8244. if(isinstance(other,_b_.int)){if(self.imag !=0)return False
  8245. return self.real==other.valueOf()}
  8246. if(isinstance(other,_b_.float)){if(self.imag !=0)return False
  8247. return self.real==other.value}
  8248. $UnsupportedOpType("==","complex",$B.get_class(other))}
  8249. $ComplexDict.__floordiv__=function(self,other){$UnsupportedOpType("//","complex",$B.get_class(other))}
  8250. $ComplexDict.__hash__=function(self){
  8251. if(self===undefined){return $ComplexDict.__hashvalue__ ||$B.$py_next_hash--}
  8252. return self.imag*1000003+self.real}
  8253. $ComplexDict.__init__=function(self,real,imag){self.toString=function(){return '('+real+'+'+imag+'j)'}}
  8254. $ComplexDict.__invert__=function(self){return ~self}
  8255. $ComplexDict.__mod__=function(self,other){throw _b_.TypeError("TypeError: can't mod complex numbers.")}
  8256. $ComplexDict.__mro__=[$ObjectDict]
  8257. $ComplexDict.__mul__=function(self,other){if(isinstance(other,complex))
  8258. return complex(self.real*other.real-self.imag*other.imag,self.imag*other.real + self.real*other.imag)
  8259. if(isinstance(other,_b_.int))
  8260. return complex(self.real*other.valueOf(),self.imag*other.valueOf())
  8261. if(isinstance(other,_b_.float))
  8262. return complex(self.real*other,self.imag*other)
  8263. if(isinstance(other,_b_.bool)){if(other.valueOf())return self
  8264. return complex(0)}
  8265. $UnsupportedOpType("*",complex,other)}
  8266. $ComplexDict.__name__='complex'
  8267. $ComplexDict.__ne__=function(self,other){return !$ComplexDict.__eq__(self,other)}
  8268. $ComplexDict.__neg__=function(self){return complex(-self.real,-self.imag)}
  8269. $ComplexDict.__new__=function(cls){if(cls===undefined)throw _b_.TypeError('complex.__new__(): not enough arguments')
  8270. return{__class__:cls.$dict}}
  8271. $ComplexDict.__pos__=function(self){return self}
  8272. function complex2expo(cx){var norm=Math.sqrt((cx.real*cx.real)+(cx.imag*cx.imag)),sin=cx.imag/norm,cos=cx.real/norm,angle
  8273. if(cos==0){angle=sin==1 ? Math.PI/2 : 3*Math.PI/2}
  8274. else if(sin==0){angle=cos==1 ? 0 : Math.PI}
  8275. else{angle=Math.atan(sin/cos)}
  8276. return{norm: norm,angle: angle}}
  8277. $ComplexDict.__pow__=function(self,other){
  8278. var exp=complex2expo(self),angle=exp.angle,res=Math.pow(exp.norm,other)
  8279. if(_b_.isinstance(other,[_b_.int,_b_.float])){return complex(res*Math.cos(angle*other),res*Math.sin(angle*other))}else if(_b_.isinstance(other,complex)){
  8280. var x=other.real,y=other.imag
  8281. var pw=Math.pow(exp.norm,x)*Math.pow(Math.E,-y*angle),theta=y*Math.log(exp.norm)-x*angle
  8282. return complex(pw*Math.cos(theta),pw*Math.sin(theta))}else{throw _b_.TypeError("unsupported operand type(s) for ** or pow(): "+
  8283. "'complex' and '"+$B.get_class(other).__name__+"'")}}
  8284. $ComplexDict.__str__=$ComplexDict.__repr__=function(self){if(self.real==0)return self.imag+'j'
  8285. if(self.imag>=0)return '('+self.real+'+'+self.imag+'j)'
  8286. return '('+self.real+'-'+(-self.imag)+'j)'}
  8287. $ComplexDict.__sqrt__=function(self){if(self.imag==0)return complex(Math.sqrt(self.real))
  8288. var r=self.real,i=self.imag,_a=Math.sqrt((r + sqrt)/2),_b=Number.sign(i)* Math.sqrt((-r + sqrt)/2)
  8289. return complex(_a,_b)}
  8290. $ComplexDict.__truediv__=function(self,other){if(isinstance(other,complex)){if(other.real==0 && other.imag==0){throw ZeroDivisionError('division by zero')}
  8291. var _num=self.real*other.real + self.imag*other.imag
  8292. var _div=other.real*other.real + other.imag*other.imag
  8293. var _num2=self.imag*other.real - self.real*other.imag
  8294. return complex(_num/_div,_num2/_div)}
  8295. if(isinstance(other,_b_.int)){if(!other.valueOf())throw ZeroDivisionError('division by zero')
  8296. return $ComplexDict.__truediv__(self,complex(other.valueOf()))}
  8297. if(isinstance(other,_b_.float)){if(!other.value)throw ZeroDivisionError('division by zero')
  8298. return $ComplexDict.__truediv__(self,complex(other.value))}
  8299. $UnsupportedOpType("//","complex",other.__class__)}
  8300. var $op_func=function(self,other){throw _b_.TypeError("TypeError: unsupported operand type(s) for -: 'complex' and '" +
  8301. $B.get_class(other).__name__+"'")}
  8302. $op_func +=''
  8303. var $ops={'&':'and','|':'ior','<<':'lshift','>>':'rshift','^':'xor'}
  8304. for(var $op in $ops){eval('$ComplexDict.__'+$ops[$op]+'__ = '+$op_func.replace(/-/gm,$op))}
  8305. $ComplexDict.__ior__=$ComplexDict.__or__
  8306. var $op_func=function(self,other){if(isinstance(other,complex))return complex(self.real-other.real,self.imag-other.imag)
  8307. if(isinstance(other,_b_.int))return complex($B.sub(self.real,other.valueOf()),self.imag)
  8308. if(isinstance(other,_b_.float))return complex(self.real - other.value,self.imag)
  8309. if(isinstance(other,_b_.bool)){var bool_value=0;
  8310. if(other.valueOf())bool_value=1;
  8311. return complex(self.real - bool_value,self.imag)}
  8312. throw _b_.TypeError("unsupported operand type(s) for -: "+self.__repr__()+
  8313. " and '"+$B.get_class(other).__name__+"'")}
  8314. $ComplexDict.__sub__=$op_func
  8315. $op_func +=''
  8316. $op_func=$op_func.replace(/-/gm,'+').replace(/sub/gm,'add')
  8317. eval('$ComplexDict.__add__ = '+$op_func)
  8318. var $comp_func=function(self,other){throw _b_.TypeError("TypeError: unorderable types: complex() > " +
  8319. $B.get_class(other).__name__ + "()")}
  8320. $comp_func +=''
  8321. for(var $op in $B.$comps){eval("$ComplexDict.__"+$B.$comps[$op]+'__ = '+$comp_func.replace(/>/gm,$op))}
  8322. $B.make_rmethods($ComplexDict)
  8323. $ComplexDict.real=function(self){return new Number(self.real)}
  8324. $ComplexDict.imag=function(self){return new Number(self.imag)}
  8325. var complex_re=/^(\d*\.?\d*)([\+\-]?)(\d*\.?\d*)(j?)$/
  8326. var complex=function(real,imag){if(typeof real=='string'){if(imag!==undefined){throw _b_.TypeError("complex() can't take second arg if first is a string")}
  8327. var parts=complex_re.exec(real)
  8328. if(parts===null){throw _b_.ValueError("complex() arg is a malformed string")}else if(parts[1]=='.' ||parts[3]=='.'){throw _b_.ValueError("complex() arg is a malformed string")}else if(parts[4]=='j'){if(parts[2]==''){real=0;imag=parseFloat(parts[1])}else{real=parseFloat(parts[1])
  8329. imag=parts[3]=='' ? 1 : parseFloat(parts[3])
  8330. imag=parts[2]=='-' ? -imag : imag}}else{real=parseFloat(parts[1])
  8331. imag=0}}
  8332. var res={__class__:$ComplexDict,real:real ||0,imag:imag ||0}
  8333. res.__repr__=res.__str__=function(){if(real==0)return imag + 'j'
  8334. return '('+real+'+'+imag+'j)'}
  8335. return res}
  8336. complex.$dict=$ComplexDict
  8337. complex.__class__=$B.$factory
  8338. $ComplexDict.$factory=complex
  8339. $B.set_func_names($ComplexDict)
  8340. _b_.complex=complex})(__BRYTHON__)
  8341. ;(function($B){eval($B.InjectBuiltins())
  8342. var $ObjectDict=_b_.object.$dict,$N=_b_.None
  8343. function $list(){
  8344. var args=[],pos=0
  8345. for(var i=0,_len_i=arguments.length;i < _len_i;i++){args[pos++]=arguments[i]}
  8346. return new $ListDict(args)}
  8347. var $ListDict={__class__:$B.$type,__name__:'list',$native:true,__dir__:$ObjectDict.__dir__}
  8348. $ListDict.__add__=function(self,other){if($B.get_class(self)!==$B.get_class(other)){throw TypeError('can only concatenate list (not "'+
  8349. $B.get_class(other).__name__+'") to list')}
  8350. var res=self.valueOf().concat(other.valueOf())
  8351. if(isinstance(self,tuple))res=tuple(res)
  8352. return res}
  8353. $ListDict.__contains__=function(self,item){var $=$B.args('__contains__',2,{self:null,item:null},['self','item'],arguments,{},null,null),self=$.self,item=$.item
  8354. var _eq=getattr(item,'__eq__')
  8355. var i=self.length
  8356. while(i--){if(_eq(self[i]))return true}
  8357. return false}
  8358. $ListDict.__delitem__=function(self,arg){if(isinstance(arg,_b_.int)){var pos=arg
  8359. if(arg<0)pos=self.length+pos
  8360. if(pos>=0 && pos<self.length){self.splice(pos,1)
  8361. return $N}
  8362. throw _b_.IndexError('list index out of range')}
  8363. if(isinstance(arg,_b_.slice)){var step=arg.step;if(step===None){step=1}
  8364. var start=arg.start
  8365. if(start===None){start=step>0 ? 0 : self.length}
  8366. var stop=arg.stop
  8367. if(stop===None){stop=step >0 ? self.length : 0}
  8368. if(start<0)start=self.length+start
  8369. if(stop<0)stop=self.length+stop
  8370. var res=[],i=null,pos=0
  8371. if(step>0){if(stop>start){for(var i=start;i<stop;i+=step){if(self[i]!==undefined){res[pos++]=i}}}}else{
  8372. if(stop<start){for(var i=start;i>stop;i+=step){if(self[i]!==undefined){res[pos++]=i}}
  8373. res.reverse()}}
  8374. var i=res.length
  8375. while(i--){
  8376. self.splice(res[i],1)}
  8377. return $N}
  8378. if(hasattr(arg,'__int__')||hasattr(arg,'__index__')){$ListDict.__delitem__(self,_b_.int(arg))
  8379. return $N}
  8380. throw _b_.TypeError('list indices must be integer, not '+_b_.str(arg.__class__))}
  8381. $ListDict.__eq__=function(self,other){if(isinstance(other,$B.get_class(self).$factory)){if(other.length==self.length){var i=self.length
  8382. while(i--){if(!getattr(self[i],'__eq__')(other[i]))return false}
  8383. return true}}
  8384. return false}
  8385. $ListDict.__getitem__=function(self,arg){var $=$B.args('__getitem__',2,{self:null,key:null},['self','key'],arguments,{},null,null),self=$.self,key=$.key
  8386. var klass=$B.get_class(self).$factory
  8387. if(isinstance(key,_b_.int)){var items=self.valueOf()
  8388. var pos=key
  8389. if(key<0)pos=items.length+pos
  8390. if(pos>=0 && pos<items.length)return items[pos]
  8391. throw _b_.IndexError('list index out of range')}
  8392. if(isinstance(key,_b_.slice)){
  8393. var s=_b_.slice.$dict.$conv_for_seq(key,self.length)
  8394. var res=[],i=null,items=self.valueOf(),pos=0,start=s.start,stop=s.stop,step=s.step
  8395. if(step > 0){if(stop <=start)return res;
  8396. for(var i=start;i<stop;i+=step){res[pos++]=items[i]}
  8397. return klass(res);}else{
  8398. if(stop > start)return res;
  8399. for(var i=start;i>stop;i+=step){res[pos++]=items[i]}
  8400. return klass(res);}}
  8401. if(hasattr(key,'__int__')||hasattr(key,'__index__')){return $ListDict.__getitem__(self,_b_.int(key))}
  8402. throw _b_.TypeError('list indices must be integer, not '+
  8403. $B.get_class(key).__name__)}
  8404. $ListDict.__ge__=function(self,other){if(!isinstance(other,[list,_b_.tuple])){throw _b_.TypeError("unorderable types: list() >= "+
  8405. $B.get_class(other).__name__+'()')}
  8406. var i=0
  8407. while(i<self.length){if(i>=other.length)return true
  8408. if(getattr(self[i],'__eq__')(other[i])){i++}
  8409. else return(getattr(self[i],"__ge__")(other[i]))}
  8410. return other.length==self.length}
  8411. $ListDict.__gt__=function(self,other){if(!isinstance(other,[list,_b_.tuple])){throw _b_.TypeError("unorderable types: list() > "+
  8412. $B.get_class(other).__name__+'()')}
  8413. var i=0
  8414. while(i<self.length){if(i>=other.length)return true
  8415. if(getattr(self[i],'__eq__')(other[i])){i++}
  8416. else return(getattr(self[i],'__gt__')(other[i]))}
  8417. return false}
  8418. $ListDict.__hash__=None
  8419. $ListDict.__iadd__=function(){var $=$B.args('__iadd__',2,{self:null,x:null},['self','x'],arguments,{},null,null)
  8420. var x=list(iter($.x))
  8421. for(var i=0;i < x.length;i++){$.self.push(x[i])}
  8422. return $.self}
  8423. $ListDict.__imul__=function(){var $=$B.args('__imul__',2,{self:null,x:null},['self','x'],arguments,{},null,null)
  8424. var x=$B.$GetInt($.x),len=$.self.length,pos=len
  8425. if(x==0){$ListDict.clear($.self);return $.self}
  8426. for(var i=1;i < x;i++){for(j=0;j<len;j++){$.self[pos++]=$.self[j]}}
  8427. return $.self}
  8428. $ListDict.__init__=function(self,arg){var len_func=getattr(self,'__len__'),pop_func=getattr(self,'pop')
  8429. while(len_func())pop_func()
  8430. if(arg===undefined)return $N
  8431. var arg=iter(arg)
  8432. var next_func=getattr(arg,'__next__')
  8433. var pos=len_func()
  8434. while(1){try{self[pos++]=next_func()}
  8435. catch(err){if(err.__name__=='StopIteration'){break}
  8436. else{throw err}}}
  8437. return $N}
  8438. var $list_iterator=$B.$iterator_class('list_iterator')
  8439. $ListDict.__iter__=function(self){return $B.$iterator(self,$list_iterator)}
  8440. $ListDict.__le__=function(self,other){return !$ListDict.__gt__(self,other)}
  8441. $ListDict.__len__=function(self){return self.length}
  8442. $ListDict.__lt__=function(self,other){return !$ListDict.__ge__(self,other)}
  8443. $ListDict.__mro__=[$ObjectDict]
  8444. $ListDict.__mul__=function(self,other){if(isinstance(other,_b_.int)){
  8445. var res=[],$temp=self.slice(),len=$temp.length
  8446. for(var i=0;i<other;i++){for(var j=0;j<len;j++){res.push($temp[j])}}
  8447. res.__class__=self.__class__
  8448. return res}
  8449. if(hasattr(other,'__int__')||hasattr(other,'__index__')){return $ListDict.__mul__(self,_b_.int(other))}
  8450. throw _b_.TypeError("can't multiply sequence by non-int of type '"+
  8451. $B.get_class(other).__name__+"'")}
  8452. $ListDict.__ne__=function(self,other){return !$ListDict.__eq__(self,other)}
  8453. $ListDict.__repr__=function(self){if(self===undefined)return "<class 'list'>"
  8454. var _r=[]
  8455. for(var i=0;i<self.length;i++){if(self[i]===self){_r.push('[...]')}
  8456. else{_r.push(_b_.repr(self[i]))}}
  8457. if(self.__class__===$TupleDict){if(self.length==1){return '('+_r[0]+',)'}
  8458. return '('+_r.join(', ')+')'}
  8459. return '['+_r.join(', ')+']'}
  8460. $ListDict.__setitem__=function(){var $=$B.args('__setitem__',3,{self:null,key:null,value:null},['self','key','value'],arguments,{},null,null),self=$.self,arg=$.key,value=$.value
  8461. if(isinstance(arg,_b_.int)){var pos=arg
  8462. if(arg<0)pos=self.length+pos
  8463. if(pos>=0 && pos<self.length){self[pos]=value}
  8464. else{throw _b_.IndexError('list index out of range')}
  8465. return $N}
  8466. if(isinstance(arg,_b_.slice)){var s=_b_.slice.$dict.$conv_for_seq(arg,self.length)
  8467. if(arg.step===null){$B.set_list_slice(self,s.start,s.stop,value)}
  8468. else{$B.set_list_slice_step(self,s.start,s.stop,s.step,value)}
  8469. return $N}
  8470. if(hasattr(arg,'__int__')||hasattr(arg,'__index__')){$ListDict.__setitem__(self,_b_.int(arg),value)
  8471. return $N}
  8472. throw _b_.TypeError('list indices must be integer, not '+arg.__class__.__name__)}
  8473. $ListDict.__str__=$ListDict.__repr__
  8474. $B.make_rmethods($ListDict)
  8475. var _ops=['add','sub']
  8476. $ListDict.append=function(){var $=$B.args('append',2,{self:null,x:null},['self','x'],arguments,{},null,null)
  8477. $.self[$.self.length]=$.x
  8478. return $N}
  8479. $ListDict.clear=function(){var $=$B.args('clear',1,{self:null},['self'],arguments,{},null,null)
  8480. while($.self.length){$.self.pop()}
  8481. return $N}
  8482. $ListDict.copy=function(){var $=$B.args('copy',1,{self:null},['self'],arguments,{},null,null)
  8483. return $.self.slice()}
  8484. $ListDict.count=function(){var $=$B.args('count',2,{self:null,x:null},['self','x'],arguments,{},null,null)
  8485. var res=0
  8486. _eq=getattr($.x,'__eq__')
  8487. var i=$.self.length
  8488. while(i--)if(_eq($.self[i]))res++
  8489. return res}
  8490. $ListDict.extend=function(){var $=$B.args('extend',2,{self:null,t:null},['self','t'],arguments,{},null,null)
  8491. other=list(iter($.t))
  8492. for(var i=0;i<other.length;i++){$.self.push(other[i])}
  8493. return $N}
  8494. $ListDict.index=function(){var $=$B.args('index',4,{self:null,x:null,start:null,stop:null},['self','x','start','stop'],arguments,{start:null,stop:null},null,null),self=$.self,start=$.start,stop=$.stop
  8495. var _eq=getattr($.x,'__eq__')
  8496. if(start===null){start=0}
  8497. else{if(start.__class__===$B.LongInt.$dict){start=parseInt(start.value)*(start.pos ? 1 : -1)}
  8498. if(start<0){start=Math.max(0,start+self.length)}}
  8499. if(stop===null){stop=self.length}
  8500. else{if(stop.__class__===$B.LongInt.$dict){stop=parseInt(stop.value)*(stop.pos ? 1 : -1)}
  8501. if(stop<0){stop=Math.min(self.length,stop+self.length)}}
  8502. for(var i=start;i < stop;i++){if(_eq(self[i]))return i}
  8503. throw _b_.ValueError(_b_.str($.x)+" is not in list")}
  8504. $ListDict.insert=function(){var $=$B.args('insert',3,{self:null,i:null,item:null},['self','i','item'],arguments,{},null,null)
  8505. $.self.splice($.i,0,$.item)
  8506. return $N}
  8507. $ListDict.pop=function(){var $=$B.args('pop',2,{self:null,pos:null},['self','pos'],arguments,{pos:null},null,null),self=$.self,pos=$.pos
  8508. if(pos===null){pos=self.length-1}
  8509. pos=$B.$GetInt(pos)
  8510. if(pos<0){pos+=self.length}
  8511. var res=self[pos]
  8512. if(res===undefined){throw _b_.IndexError('pop index out of range')}
  8513. self.splice(pos,1)
  8514. return res}
  8515. $ListDict.remove=function(){var $=$B.args('remove',2,{self:null,x:null},['self','x'],arguments,{},null,null)
  8516. for(var i=0,_len_i=$.self.length;i < _len_i;i++){if(getattr($.self[i],'__eq__')($.x)){$.self.splice(i,1)
  8517. return $N}}
  8518. throw _b_.ValueError(_b_.str($.x)+" is not in list")}
  8519. $ListDict.reverse=function(self){var $=$B.args('reverse',1,{self:null},['self'],arguments,{},null,null),_len=$.self.length-1,i=parseInt($.self.length/2)
  8520. while(i--){var buf=$.self[i]
  8521. $.self[i]=$.self[_len-i]
  8522. $.self[_len-i]=buf}
  8523. return $N}
  8524. function $partition(arg,array,begin,end,pivot)
  8525. {var piv=array[pivot];
  8526. array=swap(array,pivot,end-1);
  8527. var store=begin;
  8528. if(arg===null){if(array.$cl!==false){
  8529. var le_func=_b_.getattr(array.$cl,'__le__')
  8530. for(var ix=begin;ix<end-1;++ix){if(le_func(array[ix],piv)){array=swap(array,store,ix);
  8531. ++store;}}}else{for(var ix=begin;ix<end-1;++ix){if(getattr(array[ix],'__le__')(piv)){array=swap(array,store,ix);
  8532. ++store;}}}}else{var len=array.length
  8533. for(var ix=begin;ix<end-1;++ix){var x=arg(array[ix])
  8534. if(array.length!==len){throw ValueError('list modified during sort')}
  8535. if(getattr(x,'__le__')(arg(piv))){array=swap(array,store,ix);
  8536. ++store;}}}
  8537. array=swap(array,end-1,store);
  8538. return store;}
  8539. function swap(_array,a,b){var tmp=_array[a];
  8540. _array[a]=_array[b];
  8541. _array[b]=tmp;
  8542. return _array}
  8543. function $qsort(arg,array,begin,end)
  8544. {if(end-1>begin){var pivot=begin+Math.floor(Math.random()*(end-begin))
  8545. pivot=$partition(arg,array,begin,end,pivot);
  8546. $qsort(arg,array,begin,pivot);
  8547. $qsort(arg,array,pivot+1,end);}}
  8548. function $elts_class(self){
  8549. if(self.length==0){return null}
  8550. var cl=$B.get_class(self[0]),i=self.length
  8551. while(i--){
  8552. if($B.get_class(self[i])!==cl)return false}
  8553. return cl}
  8554. $ListDict.sort=function(self){var $=$B.args('sort',1,{self:null},['self'],arguments,{},null,'kw')
  8555. var func=null
  8556. var reverse=false
  8557. var kw_args=$.kw,keys=_b_.list(_b_.dict.$dict.keys(kw_args))
  8558. for(var i=0;i<keys.length;i++){if(keys[i]=="key"){func=getattr(kw_args.$string_dict[keys[i]],'__call__')}
  8559. else if(keys[i]=='reverse'){reverse=kw_args.$string_dict[keys[i]]}
  8560. else{throw _b_.TypeError("'"+keys[i]+
  8561. "' is an invalid keyword argument for this function")}}
  8562. if(self.length==0)return
  8563. self.$cl=$elts_class(self)
  8564. var cmp=null;
  8565. if(func===null && self.$cl===_b_.str.$dict){if(reverse)
  8566. cmp=function(b,a){return $B.$AlphabeticalCompare(a,b)};
  8567. else
  8568. cmp=function(a,b){return $B.$AlphabeticalCompare(a,b)};}
  8569. else if(func===null && self.$cl===_b_.int.$dict){if(reverse)
  8570. cmp=function(b,a){return a-b};
  8571. else
  8572. cmp=function(a,b){return a-b};}else{
  8573. if(func===null){if(reverse){cmp=function(b,a){if(getattr(a,'__le__')(b)){if(a==b){return 0};
  8574. return -1;}
  8575. return 1;}}else{
  8576. cmp=function(a,b){if(getattr(a,'__le__')(b)){if(a==b){return 0};
  8577. return -1;}
  8578. return 1;}}}else{
  8579. if(reverse){cmp=function(b,a){var _a=func(a),_b=func(b);
  8580. if(getattr(_a,'__le__')(_b)){if(_a==_b){return 0};
  8581. return -1;}
  8582. return 1;}}else{
  8583. cmp=function(a,b){var _a=func(a),_b=func(b);
  8584. if(getattr(_a,'__le__')(_b)){if(_a==_b){return 0};
  8585. return -1;}
  8586. return 1;}}}}
  8587. $B.$TimSort(self,cmp,0,self.length)
  8588. return(self.__brython__ ? $N : self)}
  8589. $B.set_func_names($ListDict)
  8590. $B.$list=function(t){t.__brython__=true;
  8591. return t}
  8592. function list(){if(arguments.length==0){return[]}
  8593. var $=$B.args('list',1,{obj:null},['obj'],arguments,{},null,null),obj=$.obj
  8594. if(Array.isArray(obj)){
  8595. obj=obj.slice()
  8596. obj.__brython__=true;
  8597. if(obj.__class__==$TupleDict){var res=obj.slice()
  8598. res.__class__=$ListDict
  8599. return res}
  8600. return obj}
  8601. var res=[],pos=0,arg=iter(obj),next_func=getattr(arg,'__next__')
  8602. while(1){try{res[pos++]=next_func()}
  8603. catch(err){if(!isinstance(err,_b_.StopIteration)){throw err}
  8604. break}}
  8605. res.__brython__=true
  8606. return res}
  8607. list.__class__=$B.$factory
  8608. list.$dict=$ListDict
  8609. $ListDict.$factory=list
  8610. list.$is_func=true
  8611. list.__module__='builtins'
  8612. list.__bases__=[]
  8613. var $ListSubclassDict={__class__:$B.$type,__name__:'list',__new__: function(cls){return{__class__:cls.$dict,$t:[]}}}
  8614. for(var $attr in $ListDict){if(typeof $ListDict[$attr]=='function' &&
  8615. $ListDict[$attr].__class__!==$B.$factory){
  8616. $ListDict[$attr]=(function(attr){var method=$ListDict[attr],func=function(){var self=arguments[0]
  8617. if(self.$t!==undefined){var args=[self.$t]
  8618. for(var i=1,len=arguments.length;i<len;i++){args.push(arguments[i])}
  8619. return method.apply(null,args)}else{return method.apply(null,arguments)}}
  8620. return func})($attr)
  8621. $ListSubclassDict[$attr]=(function(attr){return function(){var args=[]
  8622. if(arguments.length>0){var args=[arguments[0].$t]
  8623. var pos=1
  8624. for(var i=1,_len_i=arguments.length;i < _len_i;i++){args[pos++]=arguments[i]}}
  8625. return $ListDict[attr].apply(null,args)}})($attr)}}
  8626. $ListSubclassDict.__mro__=[$ObjectDict]
  8627. $B.$ListSubclassFactory={__class__:$B.$factory,$dict:$ListSubclassDict}
  8628. function $tuple(arg){return arg}
  8629. var $TupleDict={__class__:$B.$type,__name__:'tuple',$native:true}
  8630. $TupleDict.__iter__=function(self){return $B.$iterator(self,$tuple_iterator)}
  8631. var $tuple_iterator=$B.$iterator_class('tuple_iterator')
  8632. function tuple(){var obj=list.apply(null,arguments)
  8633. obj.__class__=$TupleDict
  8634. return obj}
  8635. tuple.__class__=$B.$factory
  8636. tuple.$dict=$TupleDict
  8637. tuple.$is_func=true
  8638. $TupleDict.$factory=tuple
  8639. $TupleDict.__new__=$B.$__new__(tuple)
  8640. tuple.__module__='builtins'
  8641. for(var attr in $ListDict){switch(attr){case '__delitem__':
  8642. case '__iadd__':
  8643. case '__imul__':
  8644. case '__setitem__':
  8645. case 'append':
  8646. case 'extend':
  8647. case 'insert':
  8648. case 'remove':
  8649. case 'pop':
  8650. case 'reverse':
  8651. case 'sort':
  8652. break
  8653. default:
  8654. if($TupleDict[attr]===undefined){if(typeof $ListDict[attr]=='function'){$TupleDict[attr]=(function(x){return function(){return $ListDict[x].apply(null,arguments)}})(attr)}else{$TupleDict[attr]=$ListDict[attr]}}}}
  8655. $TupleDict.__delitem__=function(){throw _b_.TypeError("'tuple' object doesn't support item deletion")}
  8656. $TupleDict.__setitem__=function(){throw _b_.TypeError("'tuple' object does not support item assignment")}
  8657. $TupleDict.__eq__=function(self,other){
  8658. if(other===undefined)return self===tuple
  8659. return $ListDict.__eq__(self,other)}
  8660. function c_mul(a,b){s=((parseInt(a)* b)& 0xFFFFFFFF).toString(16)
  8661. return parseInt(s.substr(0,s.length-1),16)}
  8662. $TupleDict.__hash__=function(self){
  8663. var x=0x3456789
  8664. for(var i=0,_len_i=self.length;i < _len_i;i++){var y=_b_.hash(self[i]);
  8665. x=c_mul(1000003,x)^ y & 0xFFFFFFFF;}
  8666. return x}
  8667. $TupleDict.__mro__=[$ObjectDict]
  8668. $TupleDict.__name__='tuple'
  8669. $B.set_func_names($TupleDict)
  8670. _b_.list=list
  8671. _b_.tuple=tuple
  8672. _b_.object.$dict.__bases__=tuple()})(__BRYTHON__)
  8673. ;(function($B){
  8674. eval($B.InjectBuiltins())
  8675. DEFAULT_MIN_MERGE=32;
  8676. DEFAULT_MIN_GALLOPING=7;
  8677. DEFAULT_TMP_STORAGE_LENGTH=256;
  8678. POWERS_OF_TEN=[1e0,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9]
  8679. function log10(x){if(x < 1e5){if(x < 1e2){return x < 1e1 ? 0 : 1;}
  8680. if(x < 1e4){return x < 1e3 ? 2 : 3;}
  8681. return 4;}
  8682. if(x < 1e7){return x < 1e6 ? 5 : 6;}
  8683. if(x < 1e9){return x < 1e8 ? 7 : 8;}
  8684. return 9;}
  8685. function alphabeticalCompare(a,b){if(a===b){return 0;}
  8686. if(~~a===a && ~~b===b){if(a===0 ||b===0){return a < b ? -1 : 1;}
  8687. if(a < 0 ||b < 0){if(b >=0){return -1;}
  8688. if(a >=0){return 1;}
  8689. a=-a;
  8690. b=-b;}
  8691. al=log10(a);
  8692. bl=log10(b);
  8693. var t=0;
  8694. if(al < bl){a *=POWERS_OF_TEN[bl - al - 1];
  8695. b /=10;
  8696. t=-1;}else if(al > bl){b *=POWERS_OF_TEN[al - bl - 1];
  8697. a /=10;
  8698. t=1;}
  8699. if(a===b){return t;}
  8700. return a < b ? -1 : 1;}
  8701. var aStr=String(a);
  8702. var bStr=String(b);
  8703. if(aStr===bStr){return 0;}
  8704. return aStr < bStr ? -1 : 1;}
  8705. function minRunLength(n){var r=0;
  8706. while(n >=DEFAULT_MIN_MERGE){r |=(n & 1);
  8707. n >>=1;}
  8708. return n + r;}
  8709. function makeAscendingRun(array,lo,hi,compare){var runHi=lo + 1;
  8710. if(runHi===hi){return 1;}
  8711. if(compare(array[runHi++],array[lo])< 0){while(runHi < hi && compare(array[runHi],array[runHi - 1])< 0){runHi++;}
  8712. reverseRun(array,lo,runHi);}else{
  8713. while(runHi < hi && compare(array[runHi],array[runHi - 1])>=0){runHi++;}}
  8714. return runHi - lo;}
  8715. function reverseRun(array,lo,hi){hi--;
  8716. while(lo < hi){var t=array[lo];
  8717. array[lo++]=array[hi];
  8718. array[hi--]=t;}}
  8719. function binaryInsertionSort(array,lo,hi,start,compare){if(start===lo){start++;}
  8720. for(;start < hi;start++){var pivot=array[start];
  8721. var left=lo;
  8722. var right=start;
  8723. while(left < right){var mid=(left + right)>>> 1;
  8724. if(compare(pivot,array[mid])< 0){right=mid;}else{
  8725. left=mid + 1;}}
  8726. var n=start - left;
  8727. switch(n){case 3:
  8728. array[left + 3]=array[left + 2];
  8729. case 2:
  8730. array[left + 2]=array[left + 1];
  8731. case 1:
  8732. array[left + 1]=array[left];
  8733. break;
  8734. default:
  8735. while(n > 0){array[left + n]=array[left + n - 1];
  8736. n--;}}
  8737. array[left]=pivot;}}
  8738. function gallopLeft(value,array,start,length,hint,compare){var lastOffset=0;
  8739. var maxOffset=0;
  8740. var offset=1;
  8741. if(compare(value,array[start + hint])> 0){maxOffset=length - hint;
  8742. while(offset < maxOffset && compare(value,array[start + hint + offset])> 0){lastOffset=offset;
  8743. offset=(offset << 1)+ 1;
  8744. if(offset <=0){offset=maxOffset;}}
  8745. if(offset > maxOffset){offset=maxOffset;}
  8746. lastOffset +=hint;
  8747. offset +=hint;}else{
  8748. maxOffset=hint + 1;
  8749. while(offset < maxOffset && compare(value,array[start + hint - offset])<=0){lastOffset=offset;
  8750. offset=(offset << 1)+ 1;
  8751. if(offset <=0){offset=maxOffset;}}
  8752. if(offset > maxOffset){offset=maxOffset;}
  8753. var tmp=lastOffset;
  8754. lastOffset=hint - offset;
  8755. offset=hint - tmp;}
  8756. lastOffset++;
  8757. while(lastOffset < offset){var m=lastOffset +((offset - lastOffset)>>> 1);
  8758. if(compare(value,array[start + m])> 0){lastOffset=m + 1;}else{
  8759. offset=m;}}
  8760. return offset;}
  8761. function gallopRight(value,array,start,length,hint,compare){var lastOffset=0;
  8762. var maxOffset=0;
  8763. var offset=1;
  8764. if(compare(value,array[start + hint])< 0){maxOffset=hint + 1;
  8765. while(offset < maxOffset && compare(value,array[start + hint - offset])< 0){lastOffset=offset;
  8766. offset=(offset << 1)+ 1;
  8767. if(offset <=0){offset=maxOffset;}}
  8768. if(offset > maxOffset){offset=maxOffset;}
  8769. var tmp=lastOffset;
  8770. lastOffset=hint - offset;
  8771. offset=hint - tmp;}else{
  8772. maxOffset=length - hint;
  8773. while(offset < maxOffset && compare(value,array[start + hint + offset])>=0){lastOffset=offset;
  8774. offset=(offset << 1)+ 1;
  8775. if(offset <=0){offset=maxOffset;}}
  8776. if(offset > maxOffset){offset=maxOffset;}
  8777. lastOffset +=hint;
  8778. offset +=hint;}
  8779. lastOffset++;
  8780. while(lastOffset < offset){var m=lastOffset +((offset - lastOffset)>>> 1);
  8781. if(compare(value,array[start + m])< 0){offset=m;}else{
  8782. lastOffset=m + 1;}}
  8783. return offset;}
  8784. TimSort=function(array,compare){self={array:array,compare:compare,minGallop:DEFAULT_MIN_GALLOPING,length : array.length,tmpStorageLength:DEFAULT_TMP_STORAGE_LENGTH,stackLength:0,runStart:null,runLength:null,stackSize:0,
  8785. pushRun: function(runStart,runLength){this.runStart[this.stackSize]=runStart;
  8786. this.runLength[this.stackSize]=runLength;
  8787. this.stackSize +=1;},
  8788. mergeRuns: function(){while(this.stackSize > 1){var n=this.stackSize - 2;
  8789. if((n >=1 &&
  8790. this.runLength[n - 1]<=this.runLength[n]+ this.runLength[n + 1])||
  8791. (n >=2 &&
  8792. this.runLength[n - 2]<=this.runLength[n]+ this.runLength[n - 1])){if(this.runLength[n - 1]< this.runLength[n + 1]){n--;}}else if(this.runLength[n]> this.runLength[n + 1]){break;}
  8793. this.mergeAt(n);}},
  8794. forceMergeRuns: function(){while(this.stackSize > 1){var n=this.stackSize - 2;
  8795. if(n > 0 && this.runLength[n - 1]< this.runLength[n + 1]){n--;}
  8796. this.mergeAt(n);}},
  8797. mergeAt: function(i){var compare=this.compare;
  8798. var array=this.array;
  8799. var start1=this.runStart[i];
  8800. var length1=this.runLength[i];
  8801. var start2=this.runStart[i + 1];
  8802. var length2=this.runLength[i + 1];
  8803. this.runLength[i]=length1 + length2;
  8804. if(i===this.stackSize - 3){this.runStart[i + 1]=this.runStart[i + 2];
  8805. this.runLength[i + 1]=this.runLength[i + 2];}
  8806. this.stackSize--;
  8807. var k=gallopRight(array[start2],array,start1,length1,0,compare);
  8808. start1 +=k;
  8809. length1 -=k;
  8810. if(length1===0){return;}
  8811. length2=gallopLeft(array[start1 + length1 - 1],array,start2,length2,length2 - 1,compare);
  8812. if(length2===0){return;}
  8813. if(length1 <=length2){this.mergeLow(start1,length1,start2,length2);}else{
  8814. this.mergeHigh(start1,length1,start2,length2);}},
  8815. mergeLow: function(start1,length1,start2,length2){var compare=this.compare;
  8816. var array=this.array;
  8817. var tmp=this.tmp;
  8818. var i=0;
  8819. for(i=0;i < length1;i++){tmp[i]=array[start1 + i];}
  8820. var cursor1=0;
  8821. var cursor2=start2;
  8822. var dest=start1;
  8823. array[dest++]=array[cursor2++];
  8824. if(--length2===0){for(i=0;i < length1;i++){array[dest + i]=tmp[cursor1 + i];}
  8825. return;}
  8826. if(length1===1){for(i=0;i < length2;i++){array[dest + i]=array[cursor2 + i];}
  8827. array[dest + length2]=tmp[cursor1];
  8828. return;}
  8829. var minGallop=this.minGallop;
  8830. while(true){var count1=0;
  8831. var count2=0;
  8832. var exit=false;
  8833. do{
  8834. if(compare(array[cursor2],tmp[cursor1])< 0){array[dest++]=array[cursor2++];
  8835. count2++;
  8836. count1=0;
  8837. if(--length2===0){exit=true;
  8838. break;}}else{
  8839. array[dest++]=tmp[cursor1++];
  8840. count1++;
  8841. count2=0;
  8842. if(--length1===1){exit=true;
  8843. break;}}}while((count1 |count2)< minGallop);
  8844. if(exit){break;}
  8845. do{
  8846. count1=gallopRight(array[cursor2],tmp,cursor1,length1,0,compare);
  8847. if(count1 !==0){for(i=0;i < count1;i++){array[dest + i]=tmp[cursor1 + i];}
  8848. dest +=count1;
  8849. cursor1 +=count1;
  8850. length1 -=count1;
  8851. if(length1 <=1){exit=true;
  8852. break;}}
  8853. array[dest++]=array[cursor2++];
  8854. if(--length2===0){exit=true;
  8855. break;}
  8856. count2=gallopLeft(tmp[cursor1],array,cursor2,length2,0,compare);
  8857. if(count2 !==0){for(i=0;i < count2;i++){array[dest + i]=array[cursor2 + i];}
  8858. dest +=count2;
  8859. cursor2 +=count2;
  8860. length2 -=count2;
  8861. if(length2===0){exit=true;
  8862. break;}}
  8863. array[dest++]=tmp[cursor1++];
  8864. if(--length1===1){exit=true;
  8865. break;}
  8866. minGallop--;}while(count1 >=DEFAULT_MIN_GALLOPING ||count2 >=DEFAULT_MIN_GALLOPING);
  8867. if(exit){break;}
  8868. if(minGallop < 0){minGallop=0;}
  8869. minGallop +=2;}
  8870. this.minGallop=minGallop;
  8871. if(minGallop < 1){this.minGallop=1;}
  8872. if(length1===1){for(i=0;i < length2;i++){array[dest + i]=array[cursor2 + i];}
  8873. array[dest + length2]=tmp[cursor1];}else if(length1===0){throw new Error('mergeLow preconditions were not respected');}else{
  8874. for(i=0;i < length1;i++){array[dest + i]=tmp[cursor1 + i];}}},
  8875. mergeHigh: function(start1,length1,start2,length2){var compare=this.compare;
  8876. var array=this.array;
  8877. var tmp=this.tmp;
  8878. var i=0;
  8879. for(i=0;i < length2;i++){tmp[i]=array[start2 + i];}
  8880. var cursor1=start1 + length1 - 1;
  8881. var cursor2=length2 - 1;
  8882. var dest=start2 + length2 - 1;
  8883. var customCursor=0;
  8884. var customDest=0;
  8885. array[dest--]=array[cursor1--];
  8886. if(--length1===0){customCursor=dest -(length2 - 1);
  8887. for(i=0;i < length2;i++){array[customCursor + i]=tmp[i];}
  8888. return;}
  8889. if(length2===1){dest -=length1;
  8890. cursor1 -=length1;
  8891. customDest=dest + 1;
  8892. customCursor=cursor1 + 1;
  8893. for(i=length1 - 1;i >=0;i--){array[customDest + i]=array[customCursor + i];}
  8894. array[dest]=tmp[cursor2];
  8895. return;}
  8896. var minGallop=this.minGallop;
  8897. while(true){var count1=0;
  8898. var count2=0;
  8899. var exit=false;
  8900. do{
  8901. if(compare(tmp[cursor2],array[cursor1])< 0){array[dest--]=array[cursor1--];
  8902. count1++;
  8903. count2=0;
  8904. if(--length1===0){exit=true;
  8905. break;}}else{
  8906. array[dest--]=tmp[cursor2--];
  8907. count2++;
  8908. count1=0;
  8909. if(--length2===1){exit=true;
  8910. break;}}}while((count1 |count2)< minGallop);
  8911. if(exit){break;}
  8912. do{
  8913. count1=length1 - gallopRight(tmp[cursor2],array,start1,length1,length1 - 1,compare);
  8914. if(count1 !==0){dest -=count1;
  8915. cursor1 -=count1;
  8916. length1 -=count1;
  8917. customDest=dest + 1;
  8918. customCursor=cursor1 + 1;
  8919. for(i=count1 - 1;i >=0;i--){array[customDest + i]=array[customCursor + i];}
  8920. if(length1===0){exit=true;
  8921. break;}}
  8922. array[dest--]=tmp[cursor2--];
  8923. if(--length2===1){exit=true;
  8924. break;}
  8925. count2=length2 - gallopLeft(array[cursor1],tmp,0,length2,length2 - 1,compare);
  8926. if(count2 !==0){dest -=count2;
  8927. cursor2 -=count2;
  8928. length2 -=count2;
  8929. customDest=dest + 1;
  8930. customCursor=cursor2 + 1;
  8931. for(i=0;i < count2;i++){array[customDest + i]=tmp[customCursor + i];}
  8932. if(length2 <=1){exit=true;
  8933. break;}}
  8934. array[dest--]=array[cursor1--];
  8935. if(--length1===0){exit=true;
  8936. break;}
  8937. minGallop--;}while(count1 >=DEFAULT_MIN_GALLOPING ||count2 >=DEFAULT_MIN_GALLOPING);
  8938. if(exit){break;}
  8939. if(minGallop < 0){minGallop=0;}
  8940. minGallop +=2;}
  8941. this.minGallop=minGallop;
  8942. if(minGallop < 1){this.minGallop=1;}
  8943. if(length2===1){dest -=length1;
  8944. cursor1 -=length1;
  8945. customDest=dest + 1;
  8946. customCursor=cursor1 + 1;
  8947. for(i=length1 - 1;i >=0;i--){array[customDest + i]=array[customCursor + i];}
  8948. array[dest]=tmp[cursor2];}else if(length2===0){throw new Error('mergeHigh preconditions were not respected');}else{
  8949. customCursor=dest -(length2 - 1);
  8950. for(i=0;i < length2;i++){array[customCursor + i]=tmp[i];}}}}
  8951. if(self.length < 2 * DEFAULT_TMP_STORAGE_LENGTH){self.tmpStorageLength=self.length >>> 1;}
  8952. self.tmp=new Array(self.tmpStorageLength);
  8953. self.stackLength=
  8954. (self.length < 120 ? 5 :
  8955. self.length < 1542 ? 10 :
  8956. self.length < 119151 ? 19 : 40);
  8957. self.runStart=new Array(self.stackLength);
  8958. self.runLength=new Array(self.stackLength);
  8959. return self;}
  8960. function tim_sort(array,compare,lo,hi){if(!Array.isArray(array)){throw new TypeError('Can only sort arrays');}
  8961. if(!compare){compare=alphabeticalCompare;}else if(typeof compare !=='function'){hi=lo;
  8962. lo=compare;
  8963. compare=alphabeticalCompare;}
  8964. if(!lo){lo=0;}
  8965. if(!hi){hi=array.length;}
  8966. var remaining=hi - lo;
  8967. if(remaining < 2){return;}
  8968. var runLength=0;
  8969. if(remaining < DEFAULT_MIN_MERGE){runLength=makeAscendingRun(array,lo,hi,compare);
  8970. binaryInsertionSort(array,lo,hi,lo + runLength,compare);
  8971. return;}
  8972. var ts=new TimSort(array,compare);
  8973. var minRun=minRunLength(remaining);
  8974. do{
  8975. runLength=makeAscendingRun(array,lo,hi,compare);
  8976. if(runLength < minRun){var force=remaining;
  8977. if(force > minRun){force=minRun;}
  8978. binaryInsertionSort(array,lo,lo + force,lo + runLength,compare);
  8979. runLength=force;}
  8980. ts.pushRun(lo,runLength);
  8981. ts.mergeRuns();
  8982. remaining -=runLength;
  8983. lo +=runLength;}while(remaining !==0);
  8984. ts.forceMergeRuns();}
  8985. $B.$TimSort=tim_sort;
  8986. $B.$AlphabeticalCompare=alphabeticalCompare;})(__BRYTHON__)
  8987. ;(function($B){eval($B.InjectBuiltins())
  8988. if(!String.prototype.trim){
  8989. String.prototype.trim=function(){var c;
  8990. for(var i=0;i < this.length;i++){c=this.charCodeAt(i);
  8991. if(c==32 ||c==10 ||c==13 ||c==9 ||c==12 ||c==11 ||c==160 ||c==5760 ||c==6158 ||c==8192 ||c==8193 ||c==8194 ||c==8195 ||c==8196 ||c==8197 ||c==8198 ||c==8199 ||c==8200 ||c==8201 ||c==8202 ||c==8232 ||c==8233 ||c==8239 ||c==8287 ||c==12288 ||c==65279)
  8992. continue;else break;}
  8993. for(var j=this.length - 1;j >=i;j--){c=this.charCodeAt(j);
  8994. if(c==32 ||c==10 ||c==13 ||c==9 ||c==12 ||c==11 ||c==160 ||c==5760 ||c==6158 ||c==8192 ||c==8193 ||c==8194 ||c==8195 ||c==8196 ||c==8197 ||c==8198 ||c==8199 ||c==8200 ||c==8201 ||c==8202 ||c==8232 ||c==8233 ||c==8239 ||c==8287 ||c==12288 ||c==65279)
  8995. continue;else break;}
  8996. return this.substring(i,j + 1);}}
  8997. if(!String.prototype.trimLeft){
  8998. String.prototype.trimLeft=function(){var c;
  8999. for(var i=0;i < this.length;i++){c=this.charCodeAt(i);
  9000. if(c==32 ||c==10 ||c==13 ||c==9 ||c==12 ||c==11 ||c==160 ||c==5760 ||c==6158 ||c==8192 ||c==8193 ||c==8194 ||c==8195 ||c==8196 ||c==8197 ||c==8198 ||c==8199 ||c==8200 ||c==8201 ||c==8202 ||c==8232 ||c==8233 ||c==8239 ||c==8287 ||c==12288 ||c==65279)
  9001. continue;else break;}
  9002. return this.substring(i);};}
  9003. if(!String.prototype.trimRight){String.prototype.trimRight=function(){
  9004. var c;
  9005. for(var j=this.length - 1;j >=0;j--){c=this.charCodeAt(j);
  9006. if(c==32 ||c==10 ||c==13 ||c==9 ||c==12 ||c==11 ||c==160 ||c==5760 ||c==6158 ||c==8192 ||c==8193 ||c==8194 ||c==8195 ||c==8196 ||c==8197 ||c==8198 ||c==8199 ||c==8200 ||c==8201 ||c==8202 ||c==8232 ||c==8233 ||c==8239 ||c==8287 ||c==12288 ||c==65279)
  9007. continue;else break;}
  9008. return this.substring(0,j + 1);};}
  9009. var $ObjectDict=object.$dict
  9010. var $StringDict={__class__:$B.$type,__dir__:$ObjectDict.__dir__,__name__:'str',$native:true}
  9011. function normalize_start_end($){if($.start===null||$.start===_b_.None){$.start=0}
  9012. else if($.start<0){$.start +=$.self.length;$.start=Math.max(0,$.start)}
  9013. if($.end===null||$.end===_b_.None){$.end=$.self.length}
  9014. else if($.end<0){$.end +=$.self.length;$.end=Math.max(0,$.end)}
  9015. if(!isinstance($.start,_b_.int)||!isinstance($.end,_b_.int)){throw _b_.TypeError(
  9016. "slice indices must be integers or None or have an __index__ method")}}
  9017. function reverse(s){
  9018. return s.split('').reverse().join('')}
  9019. function check_str(obj){if(!_b_.isinstance(obj,str)){throw _b_.TypeError("can't convert '"+
  9020. $B.get_class(obj).__name__+"' object to str implicitely")}}
  9021. $StringDict.__add__=function(self,other){if(!(typeof other==="string")){try{return getattr(other,'__radd__')(self)}
  9022. catch(err){throw _b_.TypeError(
  9023. "Can't convert "+$B.get_class(other).__name__+" to str implicitely")}}
  9024. return self+other}
  9025. $StringDict.__contains__=function(self,item){if(!(typeof item==="string")){throw _b_.TypeError(
  9026. "'in <string>' requires string as left operand, not "+item.__class__)}
  9027. var nbcar=item.length
  9028. if(nbcar==0)return true
  9029. if(self.length==0)return nbcar==0
  9030. for(var i=0,_len_i=self.length;i < _len_i;i++){if(self.substr(i,nbcar)==item)return true}
  9031. return false}
  9032. $StringDict.__delitem__=function(){throw _b_.TypeError("'str' object doesn't support item deletion")}
  9033. $StringDict.__dir__=$ObjectDict.__dir__
  9034. $StringDict.__eq__=function(self,other){if(other===undefined){
  9035. return self===str}
  9036. if(_b_.isinstance(other,_b_.str)){return other.valueOf()==self.valueOf()}
  9037. return other===self.valueOf()}
  9038. function preformat(self,fmt){if(fmt.empty){return _b_.str(self)}
  9039. if(fmt.type && fmt.type!='s'){throw _b_.ValueError("Unknown format code '"+fmt.type+
  9040. "' for object of type 'str'")}
  9041. return self}
  9042. $StringDict.__format__=function(self,format_spec){var fmt=new $B.parse_format_spec(format_spec)
  9043. fmt.align=fmt.align ||'<'
  9044. return $B.format_width(preformat(self,fmt),fmt)}
  9045. $StringDict.__getitem__=function(self,arg){if(isinstance(arg,_b_.int)){var pos=arg
  9046. if(arg<0)pos+=self.length
  9047. if(pos>=0 && pos<self.length)return self.charAt(pos)
  9048. throw _b_.IndexError('string index out of range')}
  9049. if(isinstance(arg,slice)){var s=_b_.slice.$dict.$conv_for_seq(arg,self.length),start=s.start,stop=s.stop,step=s.step
  9050. var res='',i=null
  9051. if(step>0){if(stop<=start)return ''
  9052. for(var i=start;i<stop;i+=step)res +=self.charAt(i)}else{
  9053. if(stop>=start)return ''
  9054. for(var i=start;i>stop;i+=step)res +=self.charAt(i)}
  9055. return res}
  9056. if(isinstance(arg,bool))return self.__getitem__(_b_.int(arg))
  9057. throw _b_.TypeError('string indices must be integers')}
  9058. $StringDict.__hash__=function(self){if(self===undefined){return $StringDict.__hashvalue__ ||$B.$py_next_hash-- }
  9059. var hash=1;
  9060. for(var i=0,_len_i=self.length;i < _len_i;i++){hash=(101*hash + self.charCodeAt(i))& 0xFFFFFFFF}
  9061. return hash}
  9062. $StringDict.__init__=function(self,arg){self.valueOf=function(){return arg}
  9063. self.toString=function(){return arg}
  9064. return _b_.None}
  9065. var $str_iterator=$B.$iterator_class('str_iterator')
  9066. $StringDict.__iter__=function(self){var items=self.split('')
  9067. return $B.$iterator(items,$str_iterator)}
  9068. $StringDict.__len__=function(self){return self.length}
  9069. var kwarg_key=new RegExp('([^\\)]*)\\)')
  9070. var NotANumber=function(){this.name='NotANumber'}
  9071. var number_check=function(s){if(!isinstance(s,[_b_.int,_b_.float])){throw new NotANumber()}}
  9072. var get_char_array=function(size,char){if(size <=0)
  9073. return ''
  9074. return new Array(size + 1).join(char)}
  9075. var format_padding=function(s,flags,minus_one){var padding=flags.padding
  9076. if(!padding){
  9077. return s}
  9078. s=s.toString()
  9079. padding=parseInt(padding,10)
  9080. if(minus_one){
  9081. padding -=1}
  9082. if(!flags.left){return get_char_array(padding - s.length,flags.pad_char)+ s}else{
  9083. return s + get_char_array(padding - s.length,flags.pad_char)}}
  9084. var format_int_precision=function(val,flags){var precision=flags.precision
  9085. if(!precision){return val.toString()}
  9086. precision=parseInt(precision,10)
  9087. var s
  9088. if(val.__class__===$B.LongInt.$dict){s=$B.LongInt.$dict.to_base(val,10)}else{
  9089. s=val.toString()}
  9090. if(s[0]==='-'){return '-' + get_char_array(precision - s.length + 1,'0')+ s.slice(1)}
  9091. return get_char_array(precision - s.length,'0')+ s}
  9092. var format_float_precision=function(val,upper,flags,modifier){var precision=flags.precision
  9093. if(isFinite(val)){return modifier(val,precision,flags,upper)}
  9094. if(val===Infinity){val='inf'}else if(val===-Infinity){val='-inf'}else{
  9095. val='nan'}
  9096. if(upper){return val.toUpperCase()}
  9097. return val}
  9098. var format_sign=function(val,flags){if(flags.sign){if(val >=0){return "+"}}else if(flags.space){if(val >=0){return " "}}
  9099. return ""}
  9100. var str_format=function(val,flags){
  9101. flags.pad_char=" "
  9102. return format_padding(str(val),flags)}
  9103. var num_format=function(val,flags){number_check(val)
  9104. if(val.__class__===$B.LongInt.$dict){val=$B.LongInt.$dict.to_base(val,10)}else{
  9105. val=parseInt(val)}
  9106. var s=format_int_precision(val,flags)
  9107. if(flags.pad_char==='0'){if(val < 0){s=s.substring(1)
  9108. return '-' + format_padding(s,flags,true)}
  9109. var sign=format_sign(val,flags)
  9110. if(sign !==''){return sign + format_padding(s,flags,true)}}
  9111. return format_padding(format_sign(val,flags)+ s,flags)}
  9112. var repr_format=function(val,flags){flags.pad_char=" "
  9113. return format_padding(repr(val),flags)}
  9114. var ascii_format=function(val,flags){flags.pad_char=" "
  9115. return format_padding(ascii(val),flags)}
  9116. var _float_helper=function(val,flags){number_check(val)
  9117. if(!flags.precision){if(!flags.decimal_point){flags.precision=6}else{
  9118. flags.precision=0}}else{
  9119. flags.precision=parseInt(flags.precision,10)
  9120. validate_precision(flags.precision)}
  9121. return parseFloat(val)}
  9122. var trailing_zeros=/(.*?)(0+)([eE].*)/
  9123. var leading_zeros=/\.(0*)/
  9124. var trailing_dot=/\.$/
  9125. var validate_precision=function(precision){
  9126. if(precision > 20){precision=20 }}
  9127. var floating_point_format=function(val,upper,flags){val=_float_helper(val,flags)
  9128. var v=val.toString()
  9129. var v_len=v.length
  9130. var dot_idx=v.indexOf('.')
  9131. if(dot_idx < 0){dot_idx=v_len}
  9132. if(val < 1 && val > -1){var zeros=leading_zeros.exec(v)
  9133. var numzeros
  9134. if(zeros){numzeros=zeros[1].length}else{
  9135. numzeros=0}
  9136. if(numzeros >=4){val=format_sign(val,flags)+ format_float_precision(val,upper,flags,_floating_g_exp_helper)
  9137. if(!flags.alternate){var trl=trailing_zeros.exec(val)
  9138. if(trl){val=trl[1].replace(trailing_dot,'')+ trl[3]}}else{
  9139. if(flags.precision <=1){val=val[0]+ '.' + val.substring(1)}}
  9140. return format_padding(val,flags)}
  9141. flags.precision=(flags.precision ||0)+ numzeros
  9142. return format_padding(format_sign(val,flags)+ format_float_precision(val,upper,flags,function(val,precision){return val.toFixed(min(precision,v_len - dot_idx)+ numzeros)}),flags)}
  9143. if(dot_idx > flags.precision){val=format_sign(val,flags)+ format_float_precision(val,upper,flags,_floating_g_exp_helper)
  9144. if(!flags.alternate){var trl=trailing_zeros.exec(val)
  9145. if(trl){val=trl[1].replace(trailing_dot,'')+ trl[3]}}else{
  9146. if(flags.precision <=1){val=val[0]+ '.' + val.substring(1)}}
  9147. return format_padding(val,flags)}
  9148. return format_padding(format_sign(val,flags)+ format_float_precision(val,upper,flags,function(val,precision){if(!flags.decimal_point){precision=min(v_len - 1,6)}else if(precision > v_len){if(!flags.alternate){precision=v_len}}
  9149. if(precision < dot_idx){precision=dot_idx}
  9150. return val.toFixed(precision - dot_idx)}),flags)}
  9151. var _floating_g_exp_helper=function(val,precision,flags,upper){if(precision){--precision}
  9152. val=val.toExponential(precision)
  9153. var e_idx=val.lastIndexOf('e')
  9154. if(e_idx > val.length - 4){val=val.substring(0,e_idx + 2)+ '0' + val.substring(e_idx + 2)}
  9155. if(upper){return val.toUpperCase()}
  9156. return val}
  9157. var floating_point_decimal_format=function(val,upper,flags){val=_float_helper(val,flags)
  9158. return format_padding(format_sign(val,flags)+ format_float_precision(val,upper,flags,function(val,precision,flags){val=val.toFixed(precision)
  9159. if(precision===0 && flags.alternate){val +='.'}
  9160. return val}),flags)}
  9161. var _floating_exp_helper=function(val,precision,flags,upper){val=val.toExponential(precision)
  9162. var e_idx=val.lastIndexOf('e')
  9163. if(e_idx > val.length - 4){val=val.substring(0,e_idx + 2)+ '0' + val.substring(e_idx + 2)}
  9164. if(upper){return val.toUpperCase()}
  9165. return val}
  9166. var floating_point_exponential_format=function(val,upper,flags){val=_float_helper(val,flags)
  9167. return format_padding(format_sign(val,flags)+ format_float_precision(val,upper,flags,_floating_exp_helper),flags)}
  9168. var signed_hex_format=function(val,upper,flags){var ret
  9169. number_check(val)
  9170. if(val.__class__===$B.LongInt.$dict){ret=$B.LongInt.$dict.to_base(val,16)}else{
  9171. ret=parseInt(val)
  9172. ret=ret.toString(16)}
  9173. ret=format_int_precision(ret,flags)
  9174. if(upper){ret=ret.toUpperCase()}
  9175. if(flags.pad_char==='0'){if(val < 0){ret=ret.substring(1)
  9176. ret='-' + format_padding(ret,flags,true)}
  9177. var sign=format_sign(val,flags)
  9178. if(sign !==''){ret=sign + format_padding(ret,flags,true)}}
  9179. if(flags.alternate){if(ret.charAt(0)==='-'){if(upper){ret="-0X" + ret.slice(1)}else{
  9180. ret="-0x" + ret.slice(1)}}else{
  9181. if(upper){ret="0X" + ret}else{
  9182. ret="0x" + ret}}}
  9183. return format_padding(format_sign(val,flags)+ ret,flags)}
  9184. var octal_format=function(val,flags){number_check(val)
  9185. var ret
  9186. if(val.__class__===$B.LongInt.$dict){ret=$B.LongInt.$dict.to_base(8)}else{
  9187. ret=parseInt(val)
  9188. ret=ret.toString(8)}
  9189. ret=format_int_precision(ret,flags)
  9190. if(flags.pad_char==='0'){if(val < 0){ret=ret.substring(1)
  9191. ret='-' + format_padding(ret,flags,true)}
  9192. var sign=format_sign(val,flags)
  9193. if(sign !==''){ret=sign + format_padding(ret,flags,true)}}
  9194. if(flags.alternate){if(ret.charAt(0)==='-'){ret="-0o" + ret.slice(1)}else{
  9195. ret="0o" + ret}}
  9196. return format_padding(ret,flags)}
  9197. var single_char_format=function(val,flags){if(isinstance(val,str)&& val.length==1)return val
  9198. try{
  9199. val=_b_.int(val)}catch(err){throw _b_.TypeError('%c requires int or char')}
  9200. return format_padding(chr(val),flags)}
  9201. var num_flag=function(c,flags){if(c==='0' && !flags.padding && !flags.decimal_point && !flags.left){flags.pad_char='0'
  9202. return}
  9203. if(!flags.decimal_point){flags.padding=(flags.padding ||"")+ c}else{
  9204. flags.precision=(flags.precision ||"")+ c}}
  9205. var decimal_point_flag=function(val,flags){if(flags.decimal_point){
  9206. throw new UnsupportedChar()}
  9207. flags.decimal_point=true}
  9208. var neg_flag=function(val,flags){flags.pad_char=' '
  9209. flags.left=true}
  9210. var space_flag=function(val,flags){flags.space=true}
  9211. var sign_flag=function(val,flags){flags.sign=true}
  9212. var alternate_flag=function(val,flags){flags.alternate=true}
  9213. var char_mapping={'s': str_format,'d': num_format,'i': num_format,'u': num_format,'o': octal_format,'r': repr_format,'a': ascii_format,'g': function(val,flags){return floating_point_format(val,false,flags)},'G': function(val,flags){return floating_point_format(val,true,flags)},'f': function(val,flags){return floating_point_decimal_format(val,false,flags)},'F': function(val,flags){return floating_point_decimal_format(val,true,flags)},'e': function(val,flags){return floating_point_exponential_format(val,false,flags)},'E': function(val,flags){return floating_point_exponential_format(val,true,flags)},'x': function(val,flags){return signed_hex_format(val,false,flags)},'X': function(val,flags){return signed_hex_format(val,true,flags)},'c': single_char_format,'0': function(val,flags){return num_flag('0',flags)},'1': function(val,flags){return num_flag('1',flags)},'2': function(val,flags){return num_flag('2',flags)},'3': function(val,flags){return num_flag('3',flags)},'4': function(val,flags){return num_flag('4',flags)},'5': function(val,flags){return num_flag('5',flags)},'6': function(val,flags){return num_flag('6',flags)},'7': function(val,flags){return num_flag('7',flags)},'8': function(val,flags){return num_flag('8',flags)},'9': function(val,flags){return num_flag('9',flags)},'-': neg_flag,' ': space_flag,'+': sign_flag,'.': decimal_point_flag,'#': alternate_flag}
  9214. var UnsupportedChar=function(){this.name="UnsupportedChar"}
  9215. $StringDict.__mod__=function(self,args){var length=self.length,pos=0 |0,argpos=null,getitem
  9216. if(_b_.isinstance(args,_b_.tuple)){argpos=0 |0}else{getitem=_b_.getattr(args,'__getitem__',null)}
  9217. var ret=''
  9218. var $get_kwarg_string=function(s){
  9219. ++pos
  9220. var rslt=kwarg_key.exec(s.substring(newpos))
  9221. if(!rslt){throw _b_.ValueError("incomplete format key")}
  9222. var key=rslt[1]
  9223. newpos +=rslt[0].length
  9224. try{
  9225. var self=getitem(key)}catch(err){if(err.name==="KeyError"){throw err}
  9226. throw _b_.TypeError("format requires a mapping")}
  9227. return get_string_value(s,self)}
  9228. var $get_arg_string=function(s){
  9229. var self
  9230. if(argpos===null){
  9231. self=args}else{
  9232. self=args[argpos++]
  9233. if(self===undefined){throw _b_.TypeError("not enough arguments for format string")}}
  9234. return get_string_value(s,self)}
  9235. var get_string_value=function(s,self){
  9236. var flags={'pad_char': ' '}
  9237. do{
  9238. var func=char_mapping[s[newpos]]
  9239. try{
  9240. if(func===undefined){throw new UnsupportedChar()}else{
  9241. var ret=func(self,flags)
  9242. if(ret !==undefined){return ret}
  9243. ++newpos}}catch(err){if(err.name==="UnsupportedChar"){invalid_char=s[newpos]
  9244. if(invalid_char===undefined){throw _b_.ValueError("incomplete format")}
  9245. throw _b_.ValueError("unsupported format character '" + invalid_char +
  9246. "' (0x" + invalid_char.charCodeAt(0).toString(16)+ ") at index " + newpos)}else if(err.name==="NotANumber"){var try_char=s[newpos]
  9247. var cls=self.__class__
  9248. if(!cls){if(typeof(self)==='string'){cls='str'}else{
  9249. cls=typeof(self)}}else{
  9250. cls=cls.__name__}
  9251. throw _b_.TypeError("%" + try_char + " format: a number is required, not " + cls)}else{
  9252. throw err}}}while(true)}
  9253. var nbph=0
  9254. do{
  9255. var newpos=self.indexOf('%',pos)
  9256. if(newpos < 0){ret +=self.substring(pos)
  9257. break}
  9258. ret +=self.substring(pos,newpos)
  9259. ++newpos
  9260. if(newpos < length){if(self[newpos]==='%'){ret +='%'}else{
  9261. nbph++
  9262. if(self[newpos]==='('){++newpos
  9263. ret +=$get_kwarg_string(self)}else{
  9264. ret +=$get_arg_string(self)}}}else{
  9265. throw _b_.ValueError("incomplete format")}
  9266. pos=newpos + 1}while(pos < length)
  9267. if(argpos!==null){if(args.length>argpos){throw _b_.TypeError('not enough arguments for format string')}else if(args.length<argpos){throw _b_.TypeError('not all arguments converted during string formatting')}}else if(nbph==0){throw _b_.TypeError('not all arguments converted during string formatting')}
  9268. return ret}
  9269. $StringDict.__mro__=[$ObjectDict]
  9270. $StringDict.__mul__=function(){var $=$B.args('__mul__',2,{self:null,other:null},['self','other'],arguments,{},null,null)
  9271. if(!isinstance($.other,_b_.int)){throw _b_.TypeError(
  9272. "Can't multiply sequence by non-int of type '"+
  9273. $B.get_class($.other).__name__+"'")}
  9274. var $res=''
  9275. for(var i=0;i<$.other;i++){$res+=$.self.valueOf()}
  9276. return $res}
  9277. $StringDict.__ne__=function(self,other){return other!==self.valueOf()}
  9278. $StringDict.__repr__=function(self){var res=self.replace(/\n/g,'\\\\n')
  9279. res=res.replace(/\\/g,'\\\\')
  9280. if(res.search('"')==-1 && res.search("'")==-1){return "'"+res+"'"}else if(self.search('"')==-1){return '"'+res+'"'}
  9281. var qesc=new RegExp("'","g")
  9282. res="'"+res.replace(qesc,"\\'")+"'"
  9283. return res}
  9284. $StringDict.__setitem__=function(self,attr,value){throw _b_.TypeError("'str' object does not support item assignment")}
  9285. $StringDict.__str__=function(self){if(self===undefined)return "<class 'str'>"
  9286. return self.toString()}
  9287. $StringDict.toString=function(){return 'string!'}
  9288. var $comp_func=function(self,other){if(typeof other !=="string"){throw _b_.TypeError(
  9289. "unorderable types: 'str' > "+$B.get_class(other).__name__+"()")}
  9290. return self > other}
  9291. $comp_func +=''
  9292. var $comps={'>':'gt','>=':'ge','<':'lt','<=':'le'}
  9293. for(var $op in $comps){eval("$StringDict.__"+$comps[$op]+'__ = '+$comp_func.replace(/>/gm,$op))}
  9294. $B.make_rmethods($StringDict)
  9295. var $notimplemented=function(self,other){throw NotImplementedError("OPERATOR not implemented for class str")}
  9296. $StringDict.title=unicode.title;
  9297. $StringDict.capitalize=unicode.capitalize;
  9298. $StringDict.casefold=unicode.casefold;
  9299. $StringDict.islower=unicode.islower;
  9300. $StringDict.isupper=unicode.isupper;
  9301. $StringDict.istitle=unicode.istitle;
  9302. $StringDict.isspace=unicode.isspace;
  9303. $StringDict.isalpha=unicode.isalpha;
  9304. $StringDict.isalnum=unicode.isalnum;
  9305. $StringDict.isdecimal=unicode.isdecimal;
  9306. $StringDict.isdigit=unicode.isdigit;
  9307. $StringDict.isnumeric=unicode.isnumeric;
  9308. $StringDict.isidentifier=unicode.isidentifier;
  9309. $StringDict.isprintable=unicode.isprintable;
  9310. $StringDict.lower=unicode.lower;
  9311. $StringDict.swapcase=unicode.swapcase;
  9312. $StringDict.upper=unicode.upper;
  9313. $StringDict.center=function(self,width,fillchar){var $=$B.args("center",3,{self:null,width:null,fillchar:null},['self','width','fillchar'],arguments,{fillchar:' '},null,null)
  9314. if($.width<=self.length)return self
  9315. var pad=parseInt(($.width-self.length)/2)
  9316. var res=$.fillchar.repeat(pad)
  9317. res +=self + res
  9318. if(res.length<$.width){res +=$.fillchar}
  9319. return res}
  9320. $StringDict.count=function(){var $=$B.args('count',4,{self:null,sub:null,start:null,stop:null},['self','sub','start','stop'],arguments,{start:null,stop:null},null,null)
  9321. if(!(typeof $.sub==="string")){throw _b_.TypeError(
  9322. "Can't convert '"+$B.get_class($.sub).__name__+"' object to str implicitly")}
  9323. var substr=$.self
  9324. if($.start!==null){var _slice
  9325. if($.stop!==null){_slice=_b_.slice($.start,$.stop)}
  9326. else{_slice=_b_.slice($.start,$.self.length)}
  9327. substr=$StringDict.__getitem__.apply(null,[$.self].concat(_slice))}else{if($.self.length+$.sub.length==0){return 1}}
  9328. if($.sub.length==0){if($.start==$.self.length){return 1}
  9329. else if(substr.length==0){return 0}
  9330. return substr.length+1}
  9331. var n=0,pos=0
  9332. while(pos<substr.length){pos=substr.indexOf($.sub,pos)
  9333. if(pos>=0){n++;pos+=$.sub.length}else break;}
  9334. return n}
  9335. $StringDict.encode=function(self,encoding){if(encoding===undefined)encoding='utf-8'
  9336. if(encoding=='rot13' ||encoding=='rot_13'){
  9337. var res=''
  9338. for(var i=0,_len=self.length;i<_len ;i++){var char=self.charAt(i)
  9339. if(('a'<=char && char<='m')||('A'<=char && char<='M')){res +=String.fromCharCode(String.charCodeAt(char)+13)}else if(('m'<char && char<='z')||('M'<char && char<='Z')){res +=String.fromCharCode(String.charCodeAt(char)-13)}else{res +=char}}
  9340. return res}
  9341. return _b_.bytes(self,encoding)}
  9342. $StringDict.endswith=function(){
  9343. var $=$B.args("endswith",4,{self:null,suffix:null,start:null,end:null},['self','suffix','start','end'],arguments,{start:0,end:null},null,null)
  9344. normalize_start_end($)
  9345. var suffixes=$.suffix
  9346. if(!isinstance(suffixes,_b_.tuple)){suffixes=[suffixes]}
  9347. var s=$.self.substring($.start,$.end)
  9348. for(var i=0,_len_i=suffixes.length;i < _len_i;i++){var suffix=suffixes[i]
  9349. if(!_b_.isinstance(suffix,str)){throw _b_.TypeError(
  9350. "endswith first arg must be str or a tuple of str, not int")}
  9351. if(suffix.length<=s.length &&
  9352. s.substr(s.length-suffix.length)==suffix)return true}
  9353. return false}
  9354. $StringDict.expandtabs=function(self,tabsize){var $=$B.args('expandtabs',2,{self:null,tabsize:null},['self','tabsize'],arguments,{tabsize:8},null,null)
  9355. var s=$B.$GetInt($.tabsize),col=0,pos=0,res=''
  9356. if(s==1){return self.replace(/\t/g,' ')}
  9357. while(pos<self.length){var car=self.charAt(pos)
  9358. switch(car){case '\t':
  9359. while(col%s > 0){res +=' ';col++}
  9360. break
  9361. case '\r':
  9362. case '\n':
  9363. res +=car
  9364. col=0
  9365. break
  9366. default:
  9367. res +=car
  9368. col++
  9369. break}
  9370. pos++}
  9371. return res}
  9372. $StringDict.find=function(){
  9373. var $=$B.args("$StringDict.find",4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:null},null,null)
  9374. check_str($.sub)
  9375. normalize_start_end($)
  9376. if(!isinstance($.start,_b_.int)||!isinstance($.end,_b_.int)){throw _b_.TypeError(
  9377. "slice indices must be integers or None or have an __index__ method")}
  9378. var s=$.self.substring($.start,$.end)
  9379. if($.sub.length==0 && $.start==$.self.length){return $.self.length}
  9380. if(s.length+$.sub.length==0){return -1}
  9381. var last_search=s.length-$.sub.length
  9382. for(var i=0;i<=last_search;i++){if(s.substr(i,$.sub.length)==$.sub){return $.start+i}}
  9383. return -1}
  9384. function parse_format(fmt_string){
  9385. var elts=fmt_string.split(':'),name,conv,spec,name_ext=[]
  9386. if(elts.length==1){
  9387. name=fmt_string}else{
  9388. name=elts[0]
  9389. spec=elts.splice(1).join(':')}
  9390. var elts=name.split('!')
  9391. if(elts.length>1){name=elts[0]
  9392. conv=elts[1]
  9393. if(conv.length!==1 ||'ras'.search(conv)==-1){throw _b_.ValueError('wrong conversion flag '+conv)}}
  9394. if(name!==undefined){
  9395. function name_repl(match){name_ext.push(match)
  9396. return ''}
  9397. var name_ext_re=/\.[_a-zA-Z][_a-zA-Z0-9]*|\[[_a-zA-Z][_a-zA-Z0-9]*\]|\[[0-9]+\]/g
  9398. name=name.replace(name_ext_re,name_repl)}
  9399. return{name: name,name_ext: name_ext,conv: conv,spec: spec||''}}
  9400. $StringDict.format=function(self){var $=$B.args('format',1,{self:null},['self'],arguments,{},'args','kw')
  9401. var pos=0,_len=self.length,car,text='',parts=[],rank=0
  9402. while(pos<_len){car=self.charAt(pos)
  9403. if(car=='{' && self.charAt(pos+1)=='{'){
  9404. text +='{'
  9405. pos+=2}else if(car=='}' && self.charAt(pos+1)=='}'){
  9406. text +='}'
  9407. pos+=2}else if(car=='{'){
  9408. parts.push(text)
  9409. var end=pos+1,nb=1
  9410. while(end<_len){if(self.charAt(end)=='{'){nb++;end++}
  9411. else if(self.charAt(end)=='}'){nb--;end++
  9412. if(nb==0){
  9413. var fmt_string=self.substring(pos+1,end-1)
  9414. var fmt_obj=parse_format(fmt_string)
  9415. if(!fmt_obj.name){fmt_obj.name=rank+''
  9416. rank++}
  9417. if(fmt_obj.spec!==undefined){
  9418. function replace_nested(name,key){if(/\d+/.exec(key)){
  9419. return _b_.tuple.$dict.__getitem__($.args,parseInt(key))}else{
  9420. return _b_.dict.$dict.__getitem__($.kw,key)}}
  9421. fmt_obj.spec=fmt_obj.spec.replace(/\{(.+?)\}/g,replace_nested)}
  9422. parts.push(fmt_obj)
  9423. text=''
  9424. break}}else{end++}}
  9425. if(nb>0){throw ValueError("wrong format "+self)}
  9426. pos=end}else{text +=car;pos++}}
  9427. if(text){parts.push(text)}
  9428. var res='',fmt
  9429. for(var i=0;i<parts.length;i++){
  9430. if(typeof parts[i]=='string'){res +=parts[i];continue}
  9431. fmt=parts[i]
  9432. if(fmt.name.charAt(0).search(/\d/)>-1){
  9433. var pos=parseInt(fmt.name),value=_b_.tuple.$dict.__getitem__($.args,pos)}else{
  9434. var value=_b_.dict.$dict.__getitem__($.kw,fmt.name)}
  9435. for(var j=0;j<fmt.name_ext.length;j++){var ext=fmt.name_ext[j]
  9436. if(ext.charAt(0)=='.'){
  9437. value=_b_.getattr(value,ext.substr(1))}else{
  9438. var key=ext.substr(1,ext.length-2)
  9439. if(key.charAt(0).search(/\d/)>-1){key=parseInt(key)}
  9440. value=_b_.getattr(value,'__getitem__')(key)}}
  9441. if(fmt.conv=='a'){value=_b_.ascii(value)}
  9442. else if(fmt.conv=='r'){value=_b_.repr(value)}
  9443. else if(fmt.conv=='s'){value=_b_.str(value)}
  9444. res +=_b_.getattr(value,'__format__')(fmt.spec)}
  9445. return res}
  9446. $StringDict.format_map=function(self){throw NotImplementedError("function format_map not implemented yet");}
  9447. $StringDict.index=function(self){
  9448. var res=$StringDict.find.apply(null,arguments)
  9449. if(res===-1)throw _b_.ValueError("substring not found")
  9450. return res}
  9451. $StringDict.join=function(){var $=$B.args('join',2,{self:null,iterable:null},['self','iterable'],arguments,{},null,null)
  9452. var iterable=_b_.iter($.iterable)
  9453. var res=[],count=0
  9454. while(1){try{var obj2=_b_.next(iterable)
  9455. if(!isinstance(obj2,str)){throw _b_.TypeError(
  9456. "sequence item "+count+": expected str instance, "+$B.get_class(obj2).__name__+" found")}
  9457. res.push(obj2)}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
  9458. else{throw err}}}
  9459. return res.join($.self)}
  9460. $StringDict.ljust=function(self){var $=$B.args('ljust',3,{self:null,width:null,fillchar:null},['self','width','fillchar'],arguments,{fillchar:' '},null,null)
  9461. if($.width <=self.length)return self
  9462. return self + $.fillchar.repeat($.width - self.length)}
  9463. $StringDict.lstrip=function(self,x){var $=$B.args('lstrip',2,{self:null,chars:null},['self','chars'],arguments,{chars:_b_.None},null,null)
  9464. if($.chars===_b_.None){return $.self.trimLeft()}
  9465. for(var i=0;i < $.self.length;i++){if($.chars.indexOf($.self.charAt(i))===-1){return $.self.substring(i);}}
  9466. return '';}
  9467. $StringDict.maketrans=function(){var $=$B.args('maketrans',3,{x:null,y:null,z:null},['x','y','z'],arguments,{y:null,z:null},null,null)
  9468. var _t=_b_.dict()
  9469. for(var i=0;i < 256;i++)_t.$numeric_dict[i]=i
  9470. if($.y===null && $.z===null){
  9471. if(!_b_.isinstance($.x,_b_.dict)){throw _b_.TypeError('maketrans only argument must be a dict')}
  9472. var items=_b_.list(_b_.dict.$dict.items($.x))
  9473. for(var i=0,len=items.length;i<len;i++){var k=items[i][0],v=items[i][1]
  9474. if(!_b_.isinstance(k,_b_.int)){if(_b_.isinstance(k,_b_.str)&& k.length==1){k=_b_.ord(k)}
  9475. else{throw _b_.TypeError("dictionary key "+k+
  9476. " is not int or 1-char string")}}
  9477. if(v!==_b_.None && !_b_.isinstance(v,[_b_.int,_b_.str])){throw _b_.TypeError("dictionary value "+v+
  9478. " is not None, integer or string")}
  9479. _t.$numeric_dict[k]=v}
  9480. return _t}else{
  9481. if(!(_b_.isinstance($.x,_b_.str)&& _b_.isinstance($.y,_b_.str))){throw _b_.TypeError("maketrans arguments must be strings")}else if($.x.length!==$.y.length){throw _b_.TypeError("maketrans arguments must be strings or same length")}else{var toNone={}
  9482. if($.z!==null){
  9483. if(!_b_.isinstance($.z,_b_.str)){throw _b_.TypeError('maketrans third argument must be a string')}
  9484. for(var i=0,len=$.z.length;i<len;i++){toNone[_b_.ord($.z.charAt(i))]=true}}
  9485. for(var i=0,len=$.x.length;i<len;i++){_t.$numeric_dict[_b_.ord($.x.charAt(i))]=_b_.ord($.y.charAt(i))}
  9486. for(var k in toNone){_t.$numeric_dict[k]=_b_.None}
  9487. return _t}}}
  9488. $StringDict.partition=function(){var $=$B.args('partition',2,{self:null,sep:null},['self','sep'],arguments,{},null,null)
  9489. if($.sep==''){throw _b_.ValueError('empty separator')}
  9490. check_str($.sep)
  9491. var i=$.self.indexOf($.sep)
  9492. if(i==-1)return _b_.tuple([$.self,'',''])
  9493. return _b_.tuple([$.self.substring(0,i),$.sep,$.self.substring(i+$.sep.length)])}
  9494. function $re_escape(str)
  9495. {var specials="[.*+?|()$^"
  9496. for(var i=0,_len_i=specials.length;i < _len_i;i++){var re=new RegExp('\\'+specials.charAt(i),'g')
  9497. str=str.replace(re,"\\"+specials.charAt(i))}
  9498. return str}
  9499. $StringDict.replace=function(self,old,_new,count){
  9500. var $=$B.args('replace',4,{self:null,old:null,$$new:null,count:null},['self','old','$$new','count'],arguments,{count:-1},null,null),count=$.count,self=$.self,old=$.old,_new=$.$$new
  9501. check_str(old)
  9502. check_str(_new)
  9503. if(!isinstance(count,[_b_.int,_b_.float])){throw _b_.TypeError("'" + $B.get_class(count).__name__ +
  9504. "' object cannot be interpreted as an integer");}else if(isinstance(count,_b_.float)){throw _b_.TypeError("integer argument expected, got float");}
  9505. if(count==0){return self}
  9506. if(count.__class__==$B.LongInt.$dict){count=parseInt(count.value)}
  9507. if(old==''){if(_new==''){return self}
  9508. if(self==''){return _new}
  9509. var elts=self.split('')
  9510. if(count>-1 && elts.length>=count){var rest=elts.slice(count).join('')
  9511. return _new+elts.slice(0,count).join(_new)+rest}else{return _new+elts.join(_new)+_new}}else{var elts=$StringDict.split(self,old,count)}
  9512. var res=self,pos=-1
  9513. if(old.length==0){var res=_new
  9514. for(var i=0;i<elts.length;i++){res +=elts[i]+_new}
  9515. return res+rest}
  9516. if(count < 0)count=res.length;
  9517. while(count > 0){pos=res.indexOf(old,pos);
  9518. if(pos < 0)
  9519. break;
  9520. res=res.substr(0,pos)+ _new + res.substr(pos + old.length);
  9521. pos=pos + _new.length;
  9522. count--;}
  9523. return res;}
  9524. $StringDict.rfind=function(self){
  9525. var $=$B.args("rfind",4,{self:null,sub:null,start:null,end:null},['self','sub','start','end'],arguments,{start:0,end:null},null,null)
  9526. normalize_start_end($)
  9527. check_str($.sub)
  9528. if($.sub.length==0){if($.start>$.self.length){return -1}
  9529. else{return $.self.length}}
  9530. var sublen=$.sub.length
  9531. for(var i=$.end-sublen;i>=$.start;i--){if($.self.substr(i,sublen)==$.sub){return i}}
  9532. return -1}
  9533. $StringDict.rindex=function(){
  9534. var res=$StringDict.rfind.apply(null,arguments)
  9535. if(res==-1){throw _b_.ValueError("substring not found")}
  9536. return res}
  9537. $StringDict.rjust=function(self){var $=$B.args("rjust",3,{self:null,width:null,fillchar:null},['self','width','fillchar'],arguments,{fillchar:' '},null,null)
  9538. if($.width <=self.length)return self
  9539. return $.fillchar.repeat($.width - self.length)+ self}
  9540. $StringDict.rpartition=function(self,sep){var $=$B.args('rpartition',2,{self:null,sep:null},['self','sep'],arguments,{},null,null)
  9541. check_str($.sep)
  9542. var self=reverse($.self),sep=reverse($.sep)
  9543. var items=$StringDict.partition(self,sep).reverse()
  9544. for(var i=0;i<items.length;i++){items[i]=items[i].split('').reverse().join('')}
  9545. return items}
  9546. $StringDict.rsplit=function(self){var $=$B.args("rsplit",3,{self:null,sep:null,maxsplit:null},['self','sep','maxsplit'],arguments,{sep:_b_.None,maxsplit:-1},null,null),sep=$.sep
  9547. var rev_str=reverse($.self),rev_sep=sep===_b_.None ? sep : reverse($.sep),rev_res=$StringDict.split(rev_str,rev_sep,$.maxsplit)
  9548. rev_res.reverse()
  9549. for(var i=0;i<rev_res.length;i++){rev_res[i]=reverse(rev_res[i])}
  9550. return rev_res}
  9551. $StringDict.rstrip=function(self,x){var $=$B.args('rstrip',2,{self:null,chars:null},['self','chars'],arguments,{chars:_b_.None},null,null)
  9552. if($.chars===_b_.None){return $.self.trimRight()}
  9553. for(var j=$.self.length-1;j >=0;j--){if($.chars.indexOf($.self.charAt(j))===-1){return $.self.substring(0,j+1);}}
  9554. return '';}
  9555. $StringDict.split=function(){var pos=0
  9556. var $=$B.args("split",3,{self:null,sep:null,maxsplit:null},['self','sep','maxsplit'],arguments,{sep:_b_.None,maxsplit:-1},null,null)
  9557. var sep=$.sep,maxsplit=$.maxsplit,self=$.self
  9558. if(maxsplit.__class__===$B.LongInt.$dict){maxsplit=parseInt(maxsplit.value)}
  9559. if(sep=='')throw _b_.ValueError('empty separator')
  9560. if(sep===_b_.None){var res=[]
  9561. while(pos<self.length&&self.charAt(pos).search(/\s/)>-1){pos++}
  9562. if(pos===self.length-1){return[self]}
  9563. var name=''
  9564. while(1){if(self.charAt(pos).search(/\s/)===-1){if(name===''){name=self.charAt(pos)}
  9565. else{name+=self.charAt(pos)}}else{if(name!==''){res.push(name)
  9566. if(maxsplit!==-1&&res.length===maxsplit+1){res.pop()
  9567. res.push(name+self.substr(pos))
  9568. return res}
  9569. name=''}}
  9570. pos++
  9571. if(pos>self.length-1){if(name){res.push(name)}
  9572. break}}
  9573. return res}else{var res=[],s='',seplen=sep.length
  9574. if(maxsplit==0){return[self]}
  9575. while(pos<self.length){if(self.substr(pos,seplen)==sep){res.push(s)
  9576. pos +=seplen
  9577. if(maxsplit>-1 && res.length>=maxsplit){res.push(self.substr(pos))
  9578. return res}
  9579. s=''}else{s +=self.charAt(pos)
  9580. pos++}}
  9581. res.push(s)
  9582. return res}}
  9583. $StringDict.splitlines=function(self){var $=$B.args('splitlines',2,{self:null,keepends:null},['self','keepends'],arguments,{keepends:false},null,null)
  9584. if(!_b_.isinstance($.keepends,[_b_.bool,_b_.int])){throw _b_.TypeError('integer argument expected, got '+
  9585. $B.get_class($.keepends).__name)}
  9586. var keepends=_b_.int($.keepends)
  9587. if(keepends){var res=[],start=pos,pos=0,self=$.self
  9588. while(pos<self.length){if(self.substr(pos,2)=='\r\n'){res.push(self.substring(start,pos+2))
  9589. start=pos+2
  9590. pos=start}else if(self.charAt(pos)=='\r' ||self.charAt(pos)=='\n'){res.push(self.substring(start,pos+1))
  9591. start=pos+1
  9592. pos=start}else{pos++}}
  9593. var rest=self.substr(start)
  9594. if(rest){res.push(rest)}
  9595. return res}else{var self=$.self.replace(/[\r\n]$/,'')
  9596. return self.split(/\n|\r\n|\r/)}}
  9597. $StringDict.startswith=function(){
  9598. var $=$B.args("startswith",4,{self:null,prefix:null,start:null,end:null},['self','prefix','start','end'],arguments,{start:0,end:null},null,null)
  9599. normalize_start_end($)
  9600. var prefixes=$.prefix
  9601. if(!isinstance(prefixes,_b_.tuple)){prefixes=[prefixes]}
  9602. var s=$.self.substring($.start,$.end)
  9603. for(var i=0,_len_i=prefixes.length;i < _len_i;i++){prefix=prefixes[i]
  9604. if(!_b_.isinstance(prefix,str)){throw _b_.TypeError(
  9605. "endswith first arg must be str or a tuple of str, not int")}
  9606. if(s.substr(0,prefix.length)==prefix)return true}
  9607. return false}
  9608. $StringDict.strip=function(){var $=$B.args('strip',2,{self:null,chars:null},['self','chars'],arguments,{chars:_b_.None},null,null)
  9609. if($.chars===_b_.None){return $.self.trim()}
  9610. for(var i=0;i < $.self.length;i++){if($.chars.indexOf($.self.charAt(i))===-1){break;}}
  9611. for(var j=$.self.length-1;j >=i;j--){if($.chars.indexOf($.self.charAt(j))===-1){break;}}
  9612. return $.self.substring(i,j+1);}
  9613. $StringDict.translate=function(self,table){var res=[],pos=0
  9614. if(isinstance(table,_b_.dict)){for(var i=0,_len_i=self.length;i < _len_i;i++){var repl=_b_.dict.$dict.get(table,self.charCodeAt(i),-1)
  9615. if(repl==-1){res[pos++]=self.charAt(i)}
  9616. else if(repl!==None){res[pos++]=_b_.chr(repl)}}}
  9617. return res.join('')}
  9618. $StringDict.zfill=function(self,width){var $=$B.args('zfill',2,{self:null,width:null},['self','width'],arguments,{},null,null)
  9619. if($.width <=self.length){return self}
  9620. switch(self.charAt(0)){case '+':
  9621. case '-':
  9622. return self.charAt(0)+'0'.repeat($.width-self.length)+self.substr(1)
  9623. default:
  9624. return '0'.repeat(width - self.length)+self}}
  9625. function str(arg){if(arg===undefined)return ''
  9626. switch(typeof arg){case 'string':
  9627. return arg
  9628. case 'number':
  9629. if(isFinite(arg)){return arg.toString()}}
  9630. try{if(arg.__class__===$B.$factory){
  9631. var func=$B.$type.__getattribute__(arg.$dict.__class__,'__str__')
  9632. if(func.__func__===_b_.object.$dict.__str__){return func(arg)}
  9633. return func()}else if(arg.__class__===$B.$type){
  9634. var func=$B.$type.__getattribute__(arg.__class__,'__str__')
  9635. if(func.__func__===_b_.object.$dict.__str__){return func(arg)}
  9636. return func()}
  9637. var f=getattr(arg,'__str__')
  9638. return f()}
  9639. catch(err){
  9640. try{
  9641. var f=getattr(arg,'__repr__')
  9642. return getattr(f,'__call__')()}catch(err){if($B.debug>1){console.log(err)}
  9643. console.log('Warning - no method __str__ or __repr__, default to toString',arg)
  9644. return arg.toString()}}}
  9645. str.__class__=$B.$factory
  9646. str.$dict=$StringDict
  9647. $StringDict.$factory=str
  9648. $StringDict.__new__=function(cls){if(cls===undefined){throw _b_.TypeError('str.__new__(): not enough arguments')}
  9649. return{__class__:cls.$dict}}
  9650. $B.set_func_names($StringDict)
  9651. var $StringSubclassDict={__class__:$B.$type,__name__:'str'}
  9652. for(var $attr in $StringDict){if(typeof $StringDict[$attr]=='function'){$StringSubclassDict[$attr]=(function(attr){return function(){var args=[],pos=0
  9653. if(arguments.length>0){var args=[arguments[0].valueOf()],pos=1
  9654. for(var i=1,_len_i=arguments.length;i < _len_i;i++){args[pos++]=arguments[i]}}
  9655. return $StringDict[attr].apply(null,args)}})($attr)}}
  9656. $StringSubclassDict.__mro__=[$ObjectDict]
  9657. $B.$StringSubclassFactory={__class__:$B.$factory,$dict:$StringSubclassDict}
  9658. _b_.str=str
  9659. $B.parse_format_spec=function(spec){if(spec==''){this.empty=true}
  9660. else{var pos=0,aligns='<>=^',digits='0123456789',types='bcdeEfFgGnosxX%',align_pos=aligns.indexOf(spec.charAt(0))
  9661. if(align_pos!=-1){if(spec.charAt(1)&& aligns.indexOf(spec.charAt(1))!=-1){
  9662. this.fill=spec.charAt(0)
  9663. this.align=spec.charAt(1)
  9664. pos=2}else{
  9665. this.align=aligns[align_pos];
  9666. this.fill=' ';
  9667. pos++}}else{align_pos=aligns.indexOf(spec.charAt(1))
  9668. if(spec.charAt(1)&& align_pos!=-1){
  9669. this.align=aligns[align_pos]
  9670. this.fill=spec.charAt(0)
  9671. pos=2}}
  9672. var car=spec.charAt(pos)
  9673. if(car=='+'||car=='-'||car==' '){this.sign=car;
  9674. pos++;
  9675. car=spec.charAt(pos);}
  9676. if(car=='#'){this.alternate=true;pos++;car=spec.charAt(pos)}
  9677. if(car=='0'){
  9678. this.fill='0'
  9679. this.align='='
  9680. pos++;car=spec.charAt(pos)}
  9681. while(car && digits.indexOf(car)>-1){if(this.width===undefined){this.width=car}
  9682. else{this.width+=car}
  9683. pos++;car=spec.charAt(pos)}
  9684. if(this.width!==undefined){this.width=parseInt(this.width)}
  9685. if(car==','){this.comma=true;pos++;car=spec.charAt(pos)}
  9686. if(car=='.'){if(digits.indexOf(spec.charAt(pos+1))==-1){throw _b_.ValueError("Missing precision in format spec")}
  9687. this.precision=spec.charAt(pos+1)
  9688. pos+=2;car=spec.charAt(pos)
  9689. while(car && digits.indexOf(car)>-1){this.precision+=car;pos++;car=spec.charAt(pos)}
  9690. this.precision=parseInt(this.precision)}
  9691. if(car && types.indexOf(car)>-1){this.type=car;pos++;car=spec.charAt(pos)}
  9692. if(pos!==spec.length){
  9693. throw _b_.ValueError("Invalid format specifier")}}
  9694. this.toString=function(){return(this.fill===undefined ? '' : _b_.str(this.fill))+
  9695. (this.align||'')+
  9696. (this.sign||'')+
  9697. (this.alternate ? '#' : '')+
  9698. (this.sign_aware ? '0' : '')+
  9699. (this.width ||'')+
  9700. (this.comma ? ',' : '')+
  9701. (this.precision ? '.'+this.precision : '')+
  9702. (this.type ||'')}}
  9703. $B.format_width=function(s,fmt){if(fmt.width && s.length<fmt.width){var fill=fmt.fill ||' ',align=fmt.align ||'<',missing=fmt.width-s.length
  9704. switch(align){case '<':
  9705. return s+fill.repeat(missing)
  9706. case '>':
  9707. return fill.repeat(missing)+s
  9708. case '=':
  9709. if('+-'.indexOf(s.charAt(0))>-1){return s.charAt(0)+fill.repeat(missing)+s.substr(1)}else{return fill.repeat(missing)+s }
  9710. case '^':
  9711. var left=parseInt(missing/2)
  9712. return fill.repeat(left)+s+fill.repeat(missing-left)}}
  9713. return s}})(__BRYTHON__)
  9714. ;(function($B){eval($B.InjectBuiltins())
  9715. var $ObjectDict=_b_.object.$dict,str_hash=_b_.str.$dict.__hash__,$N=_b_.None
  9716. function $DictClass($keys,$values){this.iter=null
  9717. this.__class__=$DictDict
  9718. $DictDict.clear(this)
  9719. var setitem=$DictDict.__setitem__
  9720. var i=$keys.length
  9721. while(i--)setitem($keys[i],$values[i])}
  9722. var $DictDict={__class__:$B.$type,__name__ : 'dict',$native:true,__dir__:$ObjectDict.__dir__}
  9723. var $key_iterator=function(d){this.d=d
  9724. this.current=0
  9725. this.iter=new $item_generator(d)}
  9726. $key_iterator.prototype.length=function(){return this.iter.length }
  9727. $key_iterator.prototype.next=function(){return this.iter.next()[0]}
  9728. var $value_iterator=function(d){this.d=d
  9729. this.current=0
  9730. this.iter=new $item_generator(d)}
  9731. $value_iterator.prototype.length=function(){return this.iter.length }
  9732. $value_iterator.prototype.next=function(){return this.iter.next()[1]}
  9733. var $item_generator=function(d){this.i=0
  9734. if(d.$jsobj){this.items=[]
  9735. for(var attr in d.$jsobj){if(attr.charAt(0)!='$'){this.items.push([attr,d.$jsobj[attr]])}}
  9736. this.length=this.items.length;
  9737. return}
  9738. var items=[]
  9739. var pos=0
  9740. for(var k in d.$numeric_dict){items[pos++]=[parseFloat(k),d.$numeric_dict[k]]}
  9741. for(var k in d.$string_dict){items[pos++]=[k,d.$string_dict[k]]}
  9742. for(var k in d.$object_dict){items[pos++]=d.$object_dict[k]}
  9743. this.items=items
  9744. this.length=items.length}
  9745. $item_generator.prototype.next=function(){if(this.i < this.items.length){return this.items[this.i++]}
  9746. throw _b_.StopIteration("StopIteration")}
  9747. $item_generator.prototype.as_list=function(){return this.items}
  9748. var $item_iterator=function(d){this.d=d
  9749. this.current=0
  9750. this.iter=new $item_generator(d)}
  9751. $item_iterator.prototype.length=function(){return this.iter.items.length }
  9752. $item_iterator.prototype.next=function(){return _b_.tuple(this.iter.next())}
  9753. var $copy_dict=function(left,right){var _l=new $item_generator(right).as_list()
  9754. var si=$DictDict.__setitem__
  9755. var i=_l.length
  9756. while(i--)si(left,_l[i][0],_l[i][1])}
  9757. var $iterator_wrapper=function(items,klass){var res={__class__:klass,__iter__:function(){items.iter.i=0;return res},__len__:function(){return items.length()},__next__:function(){return items.next()},__repr__:function(){var s=[]
  9758. for(var i=0,len=items.length();i<len;i++){s.push(_b_.repr(items.next()))}
  9759. return klass.__name__+'(['+ s.join(',')+ '])'},}
  9760. res.__str__=res.toString=res.__repr__
  9761. return res}
  9762. $DictDict.__bool__=function(){var $=$B.args('__bool__',1,{self:null},['self'],arguments,{},null,null)
  9763. return $DictDict.__len__($.self)> 0}
  9764. $DictDict.__contains__=function(){var $=$B.args('__contains__',2,{self:null,item:null},['self','item'],arguments,{},null,null),self=$.self,item=$.item
  9765. if(self.$jsobj)return self.$jsobj[item]!==undefined
  9766. switch(typeof item){case 'string':
  9767. return self.$string_dict[item]!==undefined
  9768. case 'number':
  9769. return self.$numeric_dict[item]!==undefined}
  9770. var _key=hash(item)
  9771. if(self.$str_hash[_key]!==undefined &&
  9772. _b_.getattr(item,'__eq__')(self.$str_hash[_key])){return true}
  9773. if(self.$numeric_dict[_key]!==undefined &&
  9774. _b_.getattr(item,'__eq__')(_key)){return true}
  9775. if(self.$object_dict[_key]!==undefined){
  9776. var _eq=getattr(item,'__eq__')
  9777. if(_eq(self.$object_dict[_key][0])){return true}}
  9778. return false}
  9779. $DictDict.__delitem__=function(){var $=$B.args('__eq__',2,{self:null,arg:null},['self','arg'],arguments,{},null,null),self=$.self,arg=$.arg
  9780. if(self.$jsobj){if(self.$jsobj[arg]===undefined){throw KeyError(arg)}
  9781. delete self.$jsobj[arg]
  9782. return $N}
  9783. switch(typeof arg){case 'string':
  9784. if(self.$string_dict[arg]===undefined)throw KeyError(_b_.str(arg))
  9785. delete self.$string_dict[arg]
  9786. delete self.$str_hash[str_hash(arg)]
  9787. return $N
  9788. case 'number':
  9789. if(self.$numeric_dict[arg]===undefined)throw KeyError(_b_.str(arg))
  9790. delete self.$numeric_dict[arg]
  9791. return $N}
  9792. var _key=hash(arg)
  9793. if(self.$object_dict[_key]!==undefined){delete self.$object_dict[_key]}
  9794. if(self.$jsobj)delete self.$jsobj[arg]
  9795. return $N}
  9796. $DictDict.__eq__=function(){var $=$B.args('__eq__',2,{self:null,other:null},['self','other'],arguments,{},null,null),self=$.self,other=$.other
  9797. if(!isinstance(other,dict))return false
  9798. if($DictDict.__len__(self)!=$DictDict.__len__(other)){return false}
  9799. if((self.$numeric_dict.length!=other.$numeric_dict.length)||
  9800. (self.$string_dict.length!=other.$string_dict.length)||
  9801. (self.$object_dict.length!=other.$object_dict.length)){return false}
  9802. for(var k in self.$numeric_dict){if(!_b_.getattr(other.$numeric_dict[k],'__eq__')(self.$numeric_dict[k])){return false}}
  9803. for(var k in self.$string_dict){if(!_b_.getattr(other.$string_dict[k],'__eq__')(self.$string_dict[k])){return false}}
  9804. for(var k in self.$object_dict){console.log('key in object dict',k)
  9805. if(!_b_.getattr(other.$object_dict[k][1],'__eq__')(self.$object_dict[k][1])){return false}}
  9806. return true}
  9807. $DictDict.__getitem__=function(){var $=$B.args('__getitem__',2,{self:null,arg:null},['self','arg'],arguments,{},null,null),self=$.self,arg=$.arg
  9808. if(self.$jsobj){if(self.$jsobj[arg]===undefined){return None}
  9809. return self.$jsobj[arg]}
  9810. switch(typeof arg){case 'string':
  9811. if(self.$string_dict[arg]!==undefined)return self.$string_dict[arg]
  9812. break
  9813. case 'number':
  9814. if(self.$numeric_dict[arg]!==undefined)return self.$numeric_dict[arg]}
  9815. var _key=_b_.hash(arg),_eq=_b_.getattr(arg,'__eq__')
  9816. var sk=self.$str_hash[_key]
  9817. if(sk!==undefined && _eq(sk)){return self.$string_dict[sk]}
  9818. if(self.$numeric_dict[_key]!==undefined && _eq(_key)){return self.$numeric_dict[_key]}
  9819. var obj_ref=self.$object_dict[_key]
  9820. if(obj_ref!==undefined){
  9821. _eq(self.$object_dict[_key][0])
  9822. return self.$object_dict[_key][1]}
  9823. if(self.__class__!==$DictDict){try{var missing_method=getattr(self.__class__.$factory,'__missing__')
  9824. return missing_method(self,arg)}catch(err){}}
  9825. throw KeyError(_b_.str(arg))}
  9826. $DictDict.__hash__=None
  9827. $DictDict.__init__=function(self){var args=[],pos=0
  9828. for(var i=1;i<arguments.length;i++){args[pos++]=arguments[i]}
  9829. switch(args.length){case 0:
  9830. return
  9831. case 1:
  9832. var obj=args[0]
  9833. if(Array.isArray(obj)){var i=obj.length
  9834. var si=$DictDict.__setitem__
  9835. while(i-->0)si(self,obj[i-1][0],obj[i-1][1])
  9836. return $N}else if(isinstance(obj,dict)){$copy_dict(self,obj)
  9837. return $N}
  9838. if(obj.__class__===$B.JSObject.$dict){
  9839. var si=$DictDict.__setitem__
  9840. for(var attr in obj.js)si(self,attr,obj.js[attr])
  9841. self.$jsobj=obj.js
  9842. return $N}}
  9843. var $ns=$B.args('dict',0,{},[],args,{},'args','kw')
  9844. var args=$ns['args']
  9845. var kw=$ns['kw']
  9846. if(args.length>0){if(isinstance(args[0],dict)){$B.$copy_dict(self,args[0])
  9847. return $N}
  9848. if(Array.isArray(args[0])){var src=args[0]
  9849. var i=src.length -1
  9850. var si=$DictDict.__setitem__
  9851. while(i-->0)si(self,src[i-1][0],src[i-1][1])}else{var iterable=iter(args[0])
  9852. while(1){try{var elt=next(iterable)
  9853. var key=getattr(elt,'__getitem__')(0)
  9854. var value=getattr(elt,'__getitem__')(1)
  9855. $DictDict.__setitem__(self,key,value)}catch(err){if(err.__name__==='StopIteration'){break}
  9856. throw err}}}}
  9857. if($DictDict.__len__(kw)> 0)$copy_dict(self,kw)
  9858. return $N}
  9859. var $dict_iterator=$B.$iterator_class('dict iterator')
  9860. $DictDict.__iter__=function(self){return $DictDict.keys(self)}
  9861. $DictDict.__len__=function(self){var _count=0
  9862. if(self.$jsobj){for(var attr in self.$jsobj){if(attr.charAt(0)!='$'){_count++}}
  9863. return _count}
  9864. for(var k in self.$numeric_dict)_count++
  9865. for(var k in self.$string_dict)_count++
  9866. for(var k in self.$object_dict)_count+=self.$object_dict[k].length
  9867. return _count}
  9868. $DictDict.__mro__=[$ObjectDict]
  9869. $DictDict.__ne__=function(self,other){return !$DictDict.__eq__(self,other)}
  9870. $DictDict.__next__=function(self){if(self.$iter==null){self.$iter=new $item_generator(self)}
  9871. try{
  9872. return self.$iter.next()}catch(err){if(err.__name__ !=="StopIteration"){throw err }}}
  9873. $DictDict.__repr__=function(self){if(self===undefined)return "<class 'dict'>"
  9874. if(self.$jsobj){
  9875. var res=[]
  9876. for(var attr in self.$jsobj){if(attr.charAt(0)=='$' ||attr=='__class__'){continue}
  9877. else{try{res.push("'"+attr+"': "+_b_.repr(self.$jsobj[attr]))}catch(err){}}}
  9878. return '{'+res.join(', ')+'}'}
  9879. var res=[],pos=0,items=new $item_generator(self).as_list()
  9880. for(var i=0;i < items.length;i++){var itm=items[i]
  9881. if(itm[1]===self){res[pos++]=repr(itm[0])+': {...}'}
  9882. else{res[pos++]=repr(itm[0])+': '+repr(itm[1])}}
  9883. return '{'+ res.join(', ')+'}'}
  9884. $DictDict.__setitem__=function(self,key,value){var $=$B.args('__setitem__',3,{self:null,key:null,value:null},['self','key','value'],arguments,{},null,null),self=$.self,key=$.key,value=$.value
  9885. if(self.$jsobj){self.$jsobj[key]=value;return}
  9886. switch(typeof key){case 'string':
  9887. self.$string_dict[key]=value
  9888. self.$str_hash[str_hash(key)]=key
  9889. return $N
  9890. case 'number':
  9891. self.$numeric_dict[key]=value
  9892. return $N}
  9893. var _key=hash(key)
  9894. var _eq=getattr(key,'__eq__')
  9895. if(self.$numeric_dict[_key]!==undefined && _eq(_key)){self.$numeric_dict[_key]=value
  9896. return $N}
  9897. var sk=self.$str_hash[_key]
  9898. if(sk!==undefined && _eq(sk)){self.$string_dict[sk]=value
  9899. return $N}
  9900. var obj_ref=self.$object_dict[_key]
  9901. if(obj_ref!==undefined){
  9902. _eq(self.$object_dict[_key][0])}
  9903. self.$object_dict[_key]=[key,value]
  9904. return $N}
  9905. $DictDict.__str__=$DictDict.__repr__
  9906. $B.make_rmethods($DictDict)
  9907. $DictDict.clear=function(){
  9908. var $=$B.args('clear',1,{self:null},['self'],arguments,{},null,null),self=$.self
  9909. self.$numeric_dict={}
  9910. self.$string_dict={}
  9911. self.$str_hash={}
  9912. self.$object_dict={}
  9913. if(self.$jsobj)self.$jsobj={}
  9914. return $N}
  9915. $DictDict.copy=function(self){
  9916. var $=$B.args('copy',1,{self:null},['self'],arguments,{},null,null),self=$.self,res=_b_.dict()
  9917. $copy_dict(res,self)
  9918. return res}
  9919. $DictDict.fromkeys=function(){var $=$B.args('fromkeys',3,{cls:null,keys:null,value:null},['cls','keys','value'],arguments,{value:_b_.None},null,null),keys=$.keys,value=$.value
  9920. var klass=$.cls,res=klass(),keys_iter=_b_.iter(keys)
  9921. while(1){try{var key=_b_.next(keys_iter)
  9922. if(klass===dict){$DictDict.__setitem__(res,key,value)}
  9923. else{_b_.getattr(res,"__setitem__")(key,value)}}catch(err){if($B.is_exc(err,[_b_.StopIteration])){return res}
  9924. throw err}}}
  9925. $DictDict.fromkeys.$type='classmethod'
  9926. $DictDict.get=function(){var $=$B.args('get',3,{self:null,key:null,_default:null},['self','key','_default'],arguments,{_default:$N},null,null)
  9927. try{return $DictDict.__getitem__($.self,$.key)}
  9928. catch(err){if(_b_.isinstance(err,_b_.KeyError)){return $._default}
  9929. else{throw err}}}
  9930. var $dict_itemsDict=$B.$iterator_class('dict_items')
  9931. $DictDict.items=function(self){if(arguments.length > 1){var _len=arguments.length - 1
  9932. var _msg="items() takes no arguments ("+_len+" given)"
  9933. throw _b_.TypeError(_msg)}
  9934. return $iterator_wrapper(new $item_iterator(self),$dict_itemsDict)}
  9935. var $dict_keysDict=$B.$iterator_class('dict_keys')
  9936. $DictDict.keys=function(self){if(arguments.length > 1){var _len=arguments.length - 1
  9937. var _msg="keys() takes no arguments ("+_len+" given)"
  9938. throw _b_.TypeError(_msg)}
  9939. return $iterator_wrapper(new $key_iterator(self),$dict_keysDict)}
  9940. $DictDict.pop=function(){var $=$B.args('pop',3,{self:null,key: null,_default:null},['self','key','_default'],arguments,{_default:$N},null,null),self=$.self,key=$.key,_default=$._default
  9941. try{var res=$DictDict.__getitem__(self,key)
  9942. $DictDict.__delitem__(self,key)
  9943. return res}catch(err){if(err.__name__==='KeyError'){if(_default!==undefined)return _default
  9944. throw err}
  9945. throw err}}
  9946. $DictDict.popitem=function(self){try{var itm=new $item_iterator(self).next()
  9947. $DictDict.__delitem__(self,itm[0])
  9948. return _b_.tuple(itm)}catch(err){if(err.__name__=="StopIteration"){throw KeyError("'popitem(): dictionary is empty'")}}}
  9949. $DictDict.setdefault=function(){var $=$B.args('setdefault',3,{self:null,key: null,_default:null},['self','key','_default'],arguments,{_default:$N},null,null),self=$.self,key=$.key,_default=$._default
  9950. try{return $DictDict.__getitem__(self,key)}
  9951. catch(err){if(_default===undefined)_default=None
  9952. $DictDict.__setitem__(self,key,_default)
  9953. return _default}}
  9954. $DictDict.update=function(self){var $=$B.args('update',1,{'self':null},['self'],arguments,{},'args','kw'),self=$.self,args=$.args,kw=$.kw
  9955. if(args.length>0){var o=args[0]
  9956. if(isinstance(o,dict)){$copy_dict(self,o)}else if(hasattr(o,'__getitem__')&& hasattr(o,'keys')){var _keys=_b_.list(getattr(o,'keys')())
  9957. var si=$DictDict.__setitem__
  9958. var i=_keys.length
  9959. while(i--){
  9960. var _value=getattr(o,'__getitem__')(_keys[i])
  9961. si(self,_keys[i],_value)}}}
  9962. $copy_dict(self,kw)
  9963. return $N}
  9964. var $dict_valuesDict=$B.$iterator_class('dict_values')
  9965. $DictDict.values=function(self){if(arguments.length > 1){var _len=arguments.length - 1
  9966. var _msg="values() takes no arguments ("+_len+" given)"
  9967. throw _b_.TypeError(_msg)}
  9968. return $iterator_wrapper(new $value_iterator(self),$dict_valuesDict)}
  9969. function dict(args,second){var res={__class__:$DictDict,$numeric_dict :{},$object_dict :{},$string_dict :{},$str_hash:{},length: 0}
  9970. if(args===undefined){return res}
  9971. if(second===undefined){if(Array.isArray(args)){
  9972. var i=-1,stop=args.length-1
  9973. var si=$DictDict.__setitem__
  9974. while(i++<stop){var item=args[i]
  9975. switch(typeof item[0]){case 'string':
  9976. res.$string_dict[item[0]]=item[1]
  9977. res.$str_hash[str_hash(item[0])]=item[0]
  9978. break;
  9979. case 'number':
  9980. res.$numeric_dict[item[0]]=item[1]
  9981. break
  9982. default:
  9983. si(res,item[0],item[1])
  9984. break}}
  9985. return res}else if(args.$nat=='kw'){
  9986. var kw=args['kw']
  9987. for(var attr in kw){switch(typeof attr){case 'string':
  9988. res.$string_dict[attr]=kw[attr]
  9989. res.$str_hash[str_hash(attr)]=attr
  9990. break;
  9991. case 'number':
  9992. res.$numeric_dict[attr]=kw[attr]
  9993. break
  9994. default:
  9995. si(res,attr,kw[attr])
  9996. break}}
  9997. return res}}
  9998. var _args=[res],pos=1
  9999. for(var i=0,_len_i=arguments.length;i < _len_i;i++){_args[pos++]=arguments[i]}
  10000. $DictDict.__init__.apply(null,_args)
  10001. return res}
  10002. dict.__class__=$B.$factory
  10003. dict.$dict=$DictDict
  10004. $DictDict.$factory=dict
  10005. $DictDict.__new__=$B.$__new__(dict)
  10006. _b_.dict=dict
  10007. $B.set_func_names($DictDict)
  10008. $B.$dict_iterator=function(d){return new $item_generator(d)}
  10009. $B.$dict_length=$DictDict.__len__
  10010. $B.$dict_getitem=$DictDict.__getitem__
  10011. $B.$dict_get=$DictDict.get
  10012. $B.$dict_set=$DictDict.__setitem__
  10013. $B.$dict_contains=$DictDict.__contains__
  10014. $B.$dict_items=function(d){return new $item_generator(d).as_list()}
  10015. $B.$copy_dict=$copy_dict
  10016. $B.$dict_get_copy=$DictDict.copy
  10017. var mappingproxyDict={__class__ : $B.$type,__name__ : "mappingproxy"}
  10018. mappingproxyDict.__mro__=[_b_.object.$dict]
  10019. mappingproxyDict.__setitem__=function(){throw _b_.TypeError("'mappingproxy' object does not support item assignment")}
  10020. function mappingproxy(obj){var res=obj_dict(obj)
  10021. res.__class__=mappingproxyDict
  10022. return res}
  10023. mappingproxy.__class__=$B.$factory
  10024. mappingproxy.$dict=mappingproxyDict
  10025. mappingproxyDict.$factory=mappingproxy
  10026. $B.mappingproxy=mappingproxy
  10027. $B.obj_dict=function(obj){var res=dict()
  10028. res.$jsobj=obj
  10029. return res}})(__BRYTHON__)
  10030. ;(function($B){var _b_=$B.builtins
  10031. var $N=_b_.None
  10032. function create_type(obj){return $B.get_class(obj).$factory()}
  10033. function clone(obj){var res=create_type(obj)
  10034. res.$items=obj.$items.slice()
  10035. return res}
  10036. var $SetDict={__class__:$B.$type,__dir__:_b_.object.$dict.__dir__,__name__:'set',$native:true}
  10037. $SetDict.__add__=function(self,other){throw _b_.TypeError("unsupported operand type(s) for +: 'set' and " +
  10038. typeof other )}
  10039. $SetDict.__and__=function(self,other,accept_iter){$test(accept_iter,other)
  10040. var res=create_type(self)
  10041. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(_b_.getattr(other,'__contains__')(self.$items[i])){$SetDict.add(res,self.$items[i])}}
  10042. return res}
  10043. $SetDict.__contains__=function(self,item){if(self.$num &&(typeof item=='number')){if(isNaN(item)){
  10044. for(var i=self.$items.length-1;i>=0;i--){if(isNaN(self.$items[i])){return true}}
  10045. return false}else{return self.$items.indexOf(item)>-1}}
  10046. if(self.$str &&(typeof item=='string')){return self.$items.indexOf(item)>-1}
  10047. if(! _b_.isinstance(item,set)){_b_.hash(item)}
  10048. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(_b_.getattr(self.$items[i],'__eq__')(item))return true}
  10049. return false}
  10050. $SetDict.__eq__=function(self,other){
  10051. if(other===undefined)return self===set
  10052. if(_b_.isinstance(other,_b_.set)){if(other.$items.length==self.$items.length){for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if($SetDict.__contains__(self,other.$items[i])===false)return false}
  10053. return true}
  10054. return false}
  10055. if(_b_.isinstance(other,[_b_.list])){if(_b_.len(other)!=self.$items.length)return false
  10056. for(var i=0,_len_i=_b_.len(other);i < _len_i;i++){var _value=_b_.getattr(other,'__getitem__')(i)
  10057. if($SetDict.__contains__(self,_value)===false)return false}
  10058. return true}
  10059. if(_b_.hasattr(other,'__iter__')){
  10060. if(_b_.len(other)!=self.$items.length)return false
  10061. var _it=_b_.iter(other)
  10062. while(1){try{
  10063. var e=_b_.next(_it)
  10064. if(!$SetDict.__contains__(self,e))return false}catch(err){if(err.__name__=="StopIteration"){break}
  10065. throw err}}
  10066. return true}
  10067. return false}
  10068. $SetDict.__format__=function(self,format_string){return $SetDict.__str__(self)}
  10069. $SetDict.__ge__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return !$SetDict.__lt__(self,other)}else{return _b_.object.$dict.__ge__(self,other)}}
  10070. $SetDict.__gt__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return !$SetDict.__le__(self,other)}else{return _b_.object.$dict.__gt__(self,other)}}
  10071. $SetDict.__init__=function(self){var $=$B.args('__init__',2,{self:null,iterable:null},['self','iterable'],arguments,{iterable:[]},null,null),self=$.self,iterable=$.iterable
  10072. if(_b_.isinstance(iterable,[set,frozenset])){self.$items=iterable.$items.slice()
  10073. return $N}
  10074. var it=_b_.iter(iterable),obj={$items:[],$str:true,$num:true}
  10075. while(1){try{var item=_b_.next(it)
  10076. $SetDict.add(obj,item)}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
  10077. throw err}}
  10078. self.$items=obj.$items
  10079. return $N}
  10080. var $set_iterator=$B.$iterator_class('set iterator')
  10081. $SetDict.__iter__=function(self){var it=$B.$iterator(self.$items,$set_iterator),len=self.$items.length,nxt=it.__next__
  10082. it.__next__=function(){if(it.__len__()!=len){throw _b_.RuntimeError("size changed during iteration")}
  10083. return nxt()}
  10084. return it}
  10085. $SetDict.__le__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){var cfunc=_b_.getattr(other,'__contains__')
  10086. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(!cfunc(self.$items[i]))return false}
  10087. return true}else{return _b_.object.$dict.__le__(self,other)}}
  10088. $SetDict.__len__=function(self){return self.$items.length}
  10089. $SetDict.__lt__=function(self,other){if(_b_.isinstance(other,[set,frozenset])){return($SetDict.__le__(self,other)&&
  10090. $SetDict.__len__(self)<_b_.getattr(other,'__len__')())}else{return _b_.object.$dict['__lt__'](self,other)}}
  10091. $SetDict.__mro__=[_b_.object.$dict]
  10092. $SetDict.__ne__=function(self,other){return !$SetDict.__eq__(self,other)}
  10093. $SetDict.__or__=function(self,other,accept_iter){
  10094. var res=clone(self)
  10095. var func=_b_.getattr(_b_.iter(other),'__next__')
  10096. while(1){try{$SetDict.add(res,func())}
  10097. catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
  10098. throw err}}
  10099. res.__class__=self.__class__
  10100. return res}
  10101. $SetDict.__str__=$SetDict.__repr__=function(self){var frozen=self.$real==='frozen'
  10102. self.$cycle=self.$cycle===undefined ? 0 : self.$cycle+1
  10103. if(self.$items.length===0){if(frozen)return 'frozenset()'
  10104. return 'set()'}
  10105. var klass_name=$B.get_class(self).__name__,head=klass_name+'({',tail='})'
  10106. if(head=='set('){head='{';tail='}'}
  10107. var res=[]
  10108. if(self.$cycle){self.$cycle--
  10109. return klass_name+'(...)'}
  10110. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){var r=_b_.repr(self.$items[i])
  10111. if(r===self||r===self.$items[i]){res.push('{...}')}
  10112. else{res.push(r)}}
  10113. res=res.join(', ')
  10114. self.$cycle--
  10115. return head+res+tail}
  10116. $SetDict.__sub__=function(self,other,accept_iter){
  10117. $test(accept_iter,other,'-')
  10118. var res=create_type(self)
  10119. var cfunc=_b_.getattr(other,'__contains__')
  10120. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(!cfunc(self.$items[i])){res.$items.push(self.$items[i])}}
  10121. return res}
  10122. $SetDict.__xor__=function(self,other,accept_iter){
  10123. $test(accept_iter,other,'^')
  10124. var res=create_type(self)
  10125. var cfunc=_b_.getattr(other,'__contains__')
  10126. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(!cfunc(self.$items[i])){$SetDict.add(res,self.$items[i])}}
  10127. for(var i=0,_len_i=other.$items.length;i < _len_i;i++){if(!$SetDict.__contains__(self,other.$items[i])){$SetDict.add(res,other.$items[i])}}
  10128. return res}
  10129. function $test(accept_iter,other,op){if(accept_iter===undefined && !_b_.isinstance(other,[set,frozenset])){throw _b_.TypeError("unsupported operand type(s) for "+op+
  10130. ": 'set' and '"+$B.get_class(other).__name__+"'")}}
  10131. $B.make_rmethods($SetDict)
  10132. $SetDict.add=function(){var $=$B.args('add',2,{self:null,item:null},['self','item'],arguments,{},null,null),self=$.self,item=$.item
  10133. _b_.hash(item)
  10134. if(self.$str && !(typeof item=='string')){self.$str=false}
  10135. if(self.$num && !(typeof item=='number')){self.$num=false}
  10136. if(self.$num||self.$str){var ix=self.$items.indexOf(item)
  10137. if(ix==-1){self.$items.push(item)}
  10138. else{
  10139. if(item!==self.$items[ix]){self.$items.push(item)}}
  10140. return $N}
  10141. var cfunc=_b_.getattr(item,'__eq__')
  10142. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(cfunc(self.$items[i]))return}
  10143. self.$items.push(item)
  10144. return $N}
  10145. $SetDict.clear=function(){var $=$B.args('clear',1,{self:null},['self'],arguments,{},null,null)
  10146. $.self.$items=[];
  10147. return $N}
  10148. $SetDict.copy=function(){var $=$B.args('copy',1,{self:null},['self'],arguments,{},null,null)
  10149. if(_b_.isinstance($.self,frozenset)){return $.self}
  10150. var res=set()
  10151. for(var i=0,_len_i=$.self.$items.length;i < _len_i;i++){res.$items[i]=$.self.$items[i]}
  10152. return res}
  10153. $SetDict.difference_update=function(self){var $=$B.args('difference_update',1,{self:null},['self'],arguments,{},'args',null)
  10154. for(var i=0;i<$.args.length;i++){var s=set($.args[i]),_next=_b_.getattr(_b_.iter(s),'__next__'),item
  10155. while(true){try{item=_next()
  10156. var _type=typeof item
  10157. if(_type=='string' ||_type=="number"){var _index=self.$items.indexOf(item)
  10158. if(_index > -1){self.$items.splice(_index,1)}}else{
  10159. for(var j=0;j < self.$items.length;j++){if(_b_.getattr(self.$items[j],'__eq__')(item)){self.$items.splice(j,1)}}}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
  10160. throw err}}}
  10161. return $N}
  10162. $SetDict.discard=function(){var $=$B.args('discard',2,{self:null,item:null},['self','item'],arguments,{},null,null)
  10163. try{$SetDict.remove($.self,$.item)}
  10164. catch(err){if(!_b_.isinstance(err,[_b_.KeyError,_b_.LookupError])){throw err}}
  10165. return $N}
  10166. $SetDict.intersection_update=function(){
  10167. var $=$B.args('intersection_update',1,{self:null},['self'],arguments,{},'args',null),self=$.self
  10168. for(var i=0;i<$.args.length;i++){var remove=[],s=set($.args[i])
  10169. for(var j=0;j<self.$items.length;j++){var _item=self.$items[j],_type=typeof _item
  10170. if(_type=='string' ||_type=="number"){if(s.$items.indexOf(_item)==-1){remove.push(j)}}else{var found=false
  10171. for(var k=0;!found && k < s.$items.length;k++){if(_b_.getattr(s.$items[k],'__eq__')(_item)){found=true}}
  10172. if(!found){remove.push(j)}}}
  10173. remove.sort(function(x,y){return x-y}).reverse()
  10174. for(var j=0;j<remove.length;j++){self.$items.splice(remove[j],1)}}
  10175. return $N}
  10176. $SetDict.isdisjoint=function(){var $=$B.args('is_disjoint',2,{self:null,other:null},['self','other'],arguments,{},null,null)
  10177. for(var i=0,_len_i=$.self.$items.length;i < _len_i;i++){if(_b_.getattr($.other,'__contains__')($.self.$items[i]))return false}
  10178. return true}
  10179. $SetDict.pop=function(self){if(self.$items.length===0)throw _b_.KeyError('pop from an empty set')
  10180. return self.$items.pop()}
  10181. $SetDict.remove=function(self,item){
  10182. var $=$B.args('remove',2,{self:null,item:null},['self','item'],arguments,{},null,null),self=$.self,item=$.item
  10183. if(!_b_.isinstance(item,set)){_b_.hash(item)}
  10184. if(typeof item=='string' ||typeof item=='number'){var _i=self.$items.indexOf(item)
  10185. if(_i==-1)throw _b_.KeyError(item)
  10186. self.$items.splice(_i,1)
  10187. return $N}
  10188. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){if(_b_.getattr(self.$items[i],'__eq__')(item)){self.$items.splice(i,1)
  10189. return $N}}
  10190. throw _b_.KeyError(item)}
  10191. $SetDict.symmetric_difference_update=function(self,s){
  10192. var $=$B.args('symmetric_difference_update',2,{self:null,s:null},['self','s'],arguments,{},null,null),self=$.self,s=$.s
  10193. var _next=_b_.getattr(_b_.iter(s),'__next__'),item,remove=[],add=[]
  10194. while(true){try{item=_next()
  10195. var _type=typeof item
  10196. if(_type=='string' ||_type=="number"){var _index=self.$items.indexOf(item)
  10197. if(_index > -1){remove.push(_index)}else{add.push(item)}}else{
  10198. var found=false
  10199. for(var j=0;!found && j < self.$items.length;j++){if(_b_.getattr(self.$items[j],'__eq__')(item)){remove.push(j)
  10200. found=true}}
  10201. if(!found){add.push(item)}}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){break}
  10202. throw err}}
  10203. remove.sort(function(x,y){return x-y}).reverse()
  10204. for(var i=0;i<remove.length;i++){if(remove[i]!=remove[i-1]){self.$items.splice(remove[i],1)}}
  10205. for(var i=0;i<add.length;i++){$SetDict.add(self,add[i])}
  10206. return $N}
  10207. $SetDict.update=function(self){
  10208. var $=$B.args('update',1,{self:null},['self'],arguments,{},'args',null)
  10209. for(var i=0;i<$.args.length;i++){var other=set($.args[i])
  10210. for(var j=0,_len=other.$items.length;j < _len;j++){$SetDict.add(self,other.$items[j])}}
  10211. return $N}
  10212. $SetDict.difference=function(){var $=$B.args('difference',1,{self:null},['self'],arguments,{},'args',null)
  10213. if($.args.length==0){return $SetDict.copy($.self)}
  10214. var res=clone($.self)
  10215. for(var i=0;i<$.args.length;i++){res=$SetDict.__sub__(res,set($.args[i]))}
  10216. return res}
  10217. var fc=$SetDict.difference+''
  10218. eval('$SetDict.intersection = '+
  10219. fc.replace(/difference/g,'intersection').replace('__sub__','__and__'))
  10220. eval('$SetDict.symmetric_difference = '+
  10221. fc.replace(/difference/g,'symmetric_difference').replace('__sub__','__xor__'))
  10222. eval('$SetDict.union = '+
  10223. fc.replace(/difference/g,'union').replace('__sub__','__or__'))
  10224. $SetDict.issubset=function(){var $=$B.args('issubset',2,{self:null,other:null},['self','other'],arguments,{},'args',null),func=_b_.getattr($.other,'__contains__')
  10225. for(var i=0,len=$.self.$items.length;i<len;i++){if(!func($.self.$items[i])){return false}}
  10226. return true}
  10227. $SetDict.issuperset=function(){var $=$B.args('issuperset',2,{self:null,other:null},['self','other'],arguments,{},'args',null)
  10228. var func=_b_.getattr($.self,'__contains__'),it=_b_.iter($.other)
  10229. while(true){try{var item=_b_.next(it)
  10230. if(!func(item)){return false}}catch(err){if(_b_.isinstance(err,_b_.StopIteration)){return true}
  10231. throw err}}
  10232. return true}
  10233. function set(){
  10234. var res={__class__:$SetDict,$str:true,$num:true,$items:[]}
  10235. var args=[res].concat(Array.prototype.slice.call(arguments))
  10236. $SetDict.__init__.apply(null,args)
  10237. return res}
  10238. set.__class__=$B.$factory
  10239. set.$dict=$SetDict
  10240. $SetDict.$factory=set
  10241. $SetDict.__new__=$B.$__new__(set)
  10242. $B.set_func_names($SetDict)
  10243. var $FrozensetDict={__class__:$B.$type,__name__:'frozenset'}
  10244. $FrozensetDict.__mro__=[_b_.object.$dict]
  10245. for(var attr in $SetDict){switch(attr){case 'add':
  10246. case 'clear':
  10247. case 'discard':
  10248. case 'pop':
  10249. case 'remove':
  10250. case 'update':
  10251. break
  10252. default:
  10253. if($FrozensetDict[attr]==undefined){if(typeof $SetDict[attr]=='function'){$FrozensetDict[attr]=(function(x){return function(){return $SetDict[x].apply(null,arguments)}})(attr)}else{$FrozensetDict[attr]=$SetDict[attr]}}}}
  10254. $FrozensetDict.__hash__=function(self){if(self===undefined){return $FrozensetDict.__hashvalue__ ||$B.$py_next_hash-- }
  10255. if(self.__hashvalue__ !==undefined)return self.__hashvalue__
  10256. var _hash=1927868237
  10257. _hash *=self.$items.length
  10258. for(var i=0,_len_i=self.$items.length;i < _len_i;i++){var _h=_b_.hash(self.$items[i])
  10259. _hash ^=((_h ^ 89869747)^(_h << 16))* 3644798167}
  10260. _hash=_hash * 69069 + 907133923
  10261. if(_hash==-1)_hash=590923713
  10262. return self.__hashvalue__=_hash}
  10263. $FrozensetDict.__init__=function(){
  10264. return $N}
  10265. var singleton_id=Math.floor(Math.random()*Math.pow(2,40))
  10266. function empty_frozenset(){return{__class__:$FrozensetDict,$items:[],$id:singleton_id}}
  10267. function frozenset(){var $=$B.args('frozenset',1,{iterable:null},['iterable'],arguments,{iterable:null},null,null)
  10268. if($.iterable===null){return empty_frozenset()}
  10269. else if($.iterable.__class__==$FrozensetDict){return $.iterable}
  10270. var res=set($.iterable)
  10271. if(res.$items.length==0){return empty_frozenset()}
  10272. res.__class__=$FrozensetDict
  10273. return res}
  10274. frozenset.__class__=$B.$factory
  10275. frozenset.$dict=$FrozensetDict
  10276. $FrozensetDict.__new__=$B.$__new__(frozenset)
  10277. $FrozensetDict.$factory=frozenset
  10278. $B.set_func_names($FrozensetDict)
  10279. _b_.set=set
  10280. _b_.frozenset=frozenset})(__BRYTHON__)
  10281. ;(function($B){eval($B.InjectBuiltins())
  10282. var $ObjectDict=_b_.object.$dict
  10283. var JSObject=$B.JSObject
  10284. $B.events=_b_.dict()
  10285. function $getMouseOffset(target,ev){ev=ev ||window.event;
  10286. var docPos=$getPosition(target);
  10287. var mousePos=$mouseCoords(ev);
  10288. return{x:mousePos.x - docPos.x,y:mousePos.y - docPos.y};}
  10289. function $getPosition(e){var left=0;
  10290. var top=0;
  10291. var width=e.width ||e.offsetWidth;
  10292. var height=e.height ||e.offsetHeight;
  10293. while(e.offsetParent){left +=e.offsetLeft;
  10294. top +=e.offsetTop;
  10295. e=e.offsetParent;}
  10296. left +=e.offsetLeft;
  10297. top +=e.offsetTop;
  10298. return{left:left,top:top,width:width,height:height};}
  10299. function $mouseCoords(ev){var posx=0;
  10300. var posy=0;
  10301. if(!ev)var ev=window.event;
  10302. if(ev.pageX ||ev.pageY){posx=ev.pageX;
  10303. posy=ev.pageY;}else if(ev.clientX ||ev.clientY){posx=ev.clientX + document.body.scrollLeft
  10304. + document.documentElement.scrollLeft;
  10305. posy=ev.clientY + document.body.scrollTop
  10306. + document.documentElement.scrollTop;}
  10307. var res={}
  10308. res.x=_b_.int(posx)
  10309. res.y=_b_.int(posy)
  10310. res.__getattr__=function(attr){return this[attr]}
  10311. res.__class__="MouseCoords"
  10312. return res}
  10313. var $DOMNodeAttrs=['nodeName','nodeValue','nodeType','parentNode','childNodes','firstChild','lastChild','previousSibling','nextSibling','attributes','ownerDocument']
  10314. $B.$isNode=function(o){
  10315. return(
  10316. typeof Node==="object" ? o instanceof Node :
  10317. o && typeof o==="object" && typeof o.nodeType==="number" &&
  10318. typeof o.nodeName==="string"
  10319. );}
  10320. $B.$isNodeList=function(nodes){
  10321. try{var result=Object.prototype.toString.call(nodes);
  10322. var re=new RegExp("^\\[object (HTMLCollection|NodeList)\\]$")
  10323. return(typeof nodes==='object'
  10324. && re.exec(result)!==null
  10325. && nodes.length!==undefined
  10326. &&(nodes.length==0 ||
  10327. (typeof nodes[0]==="object" && nodes[0].nodeType > 0))
  10328. )}catch(err){return false}}
  10329. var $DOMEventAttrs_W3C=['NONE','CAPTURING_PHASE','AT_TARGET','BUBBLING_PHASE','type','target','currentTarget','eventPhase','bubbles','cancelable','timeStamp','stopPropagation','preventDefault','initEvent']
  10330. var $DOMEventAttrs_IE=['altKey','altLeft','button','cancelBubble','clientX','clientY','contentOverflow','ctrlKey','ctrlLeft','data','dataFld','dataTransfer','fromElement','keyCode','nextPage','offsetX','offsetY','origin','propertyName','reason','recordset','repeat','screenX','screenY','shiftKey','shiftLeft','source','srcElement','srcFilter','srcUrn','toElement','type','url','wheelDelta','x','y']
  10331. $B.$isEvent=function(obj){var flag=true
  10332. for(var i=0;i<$DOMEventAttrs_W3C.length;i++){if(obj[$DOMEventAttrs_W3C[i]]===undefined){flag=false;break}}
  10333. if(flag)return true
  10334. for(var i=0;i<$DOMEventAttrs_IE.length;i++){if(obj[$DOMEventAttrs_IE[i]]===undefined)return false}
  10335. return true}
  10336. var $NodeTypes={1:"ELEMENT",2:"ATTRIBUTE",3:"TEXT",4:"CDATA_SECTION",5:"ENTITY_REFERENCE",6:"ENTITY",7:"PROCESSING_INSTRUCTION",8:"COMMENT",9:"DOCUMENT",10:"DOCUMENT_TYPE",11:"DOCUMENT_FRAGMENT",12:"NOTATION"}
  10337. var $DOMEventDict={__class__:$B.$type,__name__:'DOMEvent'}
  10338. $DOMEventDict.__mro__=[$ObjectDict]
  10339. $DOMEventDict.__getattribute__=function(self,attr){switch(attr){case 'x':
  10340. return $mouseCoords(self).x
  10341. case 'y':
  10342. return $mouseCoords(self).y
  10343. case 'data':
  10344. if(self.dataTransfer!==undefined)return $Clipboard(self.dataTransfer)
  10345. return self['data']
  10346. case 'target':
  10347. if(self.target===undefined)return DOMNode(self.target)
  10348. return DOMNode(self.target)
  10349. case 'char':
  10350. return String.fromCharCode(self.which)}
  10351. var res=self[attr]
  10352. if(res!==undefined){if(typeof res=='function'){var func=function(){return res.apply(self,arguments)}
  10353. func.$infos={__name__:res.toString().substr(9,res.toString().search('{'))}
  10354. return func}
  10355. return $B.$JS2Py(res)}
  10356. throw _b_.AttributeError("object DOMEvent has no attribute '"+attr+"'")}
  10357. function $DOMEvent(ev){ev.__class__=$DOMEventDict
  10358. if(ev.preventDefault===undefined){ev.preventDefault=function(){ev.returnValue=false}}
  10359. if(ev.stopPropagation===undefined){ev.stopPropagation=function(){ev.cancelBubble=true}}
  10360. ev.__repr__=function(){return '<DOMEvent object>'}
  10361. ev.toString=ev.__str__=ev.__repr__
  10362. return ev}
  10363. $B.$DOMEvent=$DOMEvent
  10364. $B.DOMEvent=function(evt_name){
  10365. return $DOMEvent(new Event(evt_name))}
  10366. $B.DOMEvent.__class__=$B.$factory
  10367. $B.DOMEvent.$dict=$DOMEventDict
  10368. $DOMEventDict.$factory=$B.DOMEvent
  10369. var $ClipboardDict={__class__:$B.$type,__name__:'Clipboard'}
  10370. $ClipboardDict.__getitem__=function(self,name){return self.data.getData(name)}
  10371. $ClipboardDict.__mro__=[$ObjectDict]
  10372. $ClipboardDict.__setitem__=function(self,name,value){self.data.setData(name,value)}
  10373. function $Clipboard(data){
  10374. return{
  10375. data : data,__class__ : $ClipboardDict,}}
  10376. function $EventsList(elt,evt,arg){
  10377. this.elt=elt
  10378. this.evt=evt
  10379. if(isintance(arg,list)){this.callbacks=arg}
  10380. else{this.callbacks=[arg]}
  10381. this.remove=function(callback){var found=false
  10382. for(var i=0;i<this.callbacks.length;i++){if(this.callbacks[i]===callback){found=true
  10383. this.callback.splice(i,1)
  10384. this.elt.removeEventListener(this.evt,callback,false)
  10385. break}}
  10386. if(!found){throw KeyError("not found")}}}
  10387. function $OpenFile(file,mode,encoding){this.reader=new FileReader()
  10388. if(mode==='r'){this.reader.readAsText(file,encoding)}
  10389. else if(mode==='rb'){this.reader.readAsBinaryString(file)}
  10390. this.file=file
  10391. this.__class__=dom.FileReader
  10392. this.__getattr__=function(attr){if(this['get_'+attr]!==undefined)return this['get_'+attr]
  10393. return this.reader[attr]}
  10394. this.__setattr__=(function(obj){return function(attr,value){if(attr.substr(0,2)=='on'){
  10395. if(window.addEventListener){var callback=function(ev){return value($DOMEvent(ev))}
  10396. obj.addEventListener(attr.substr(2),callback)}else if(window.attachEvent){var callback=function(ev){return value($DOMEvent(window.event))}
  10397. obj.attachEvent(attr,callback)}}else if('set_'+attr in obj){return obj['set_'+attr](value)}
  10398. else if(attr in obj){obj[attr]=value}
  10399. else{setattr(obj,attr,value)}}})(this.reader)}
  10400. var dom={File : function(){},FileReader : function(){}}
  10401. dom.File.__class__=$B.$type
  10402. dom.File.__str__=function(){return "<class 'File'>"}
  10403. dom.FileReader.__class__=$B.$type
  10404. dom.FileReader.__str__=function(){return "<class 'FileReader'>"}
  10405. function $Options(parent){return{
  10406. __class__:$OptionsDict,parent:parent}}
  10407. var $OptionsDict={__class__:$B.$type,__name__:'Options'}
  10408. $OptionsDict.__delitem__=function(self,arg){self.parent.options.remove(arg.elt)}
  10409. $OptionsDict.__getitem__=function(self,key){return DOMNode(self.parent.options[key])}
  10410. $OptionsDict.__len__=function(self){return self.parent.options.length}
  10411. $OptionsDict.__mro__=[$ObjectDict]
  10412. $OptionsDict.__setattr__=function(self,attr,value){self.parent.options[attr]=value}
  10413. $OptionsDict.__setitem__=function(self,attr,value){self.parent.options[attr]=$B.$JS2Py(value)}
  10414. $OptionsDict.__str__=function(self){return "<object Options wraps "+self.parent.options+">"}
  10415. $OptionsDict.append=function(self,element){self.parent.options.add(element.elt)}
  10416. $OptionsDict.insert=function(self,index,element){if(index===undefined){self.parent.options.add(element.elt)}
  10417. else{self.parent.options.add(element.elt,index)}}
  10418. $OptionsDict.item=function(self,index){return self.parent.options.item(index)}
  10419. $OptionsDict.namedItem=function(self,name){return self.parent.options.namedItem(name)}
  10420. $OptionsDict.remove=function(self,arg){self.parent.options.remove(arg.elt)}
  10421. var $StyleDict={__class__:$B.$type,__name__:'CSSProperty'}
  10422. $StyleDict.__mro__=[$ObjectDict]
  10423. $StyleDict.__getattr__=function(self,attr){return $ObjectDict.__getattribute__(self.js,attr)}
  10424. $StyleDict.__setattr__=function(self,attr,value){if(attr.toLowerCase()==='float'){self.js.cssFloat=value
  10425. self.js.styleFloat=value}else{switch(attr){case 'top':
  10426. case 'left':
  10427. case 'height':
  10428. case 'width':
  10429. case 'borderWidth':
  10430. if(isinstance(value,_b_.int))value=value+'px'}
  10431. self.js[attr]=value}}
  10432. function $Style(style){
  10433. return{__class__:$StyleDict,js:style}}
  10434. $Style.__class__=$B.$factory
  10435. $Style.$dict=$StyleDict
  10436. $StyleDict.$factory=$Style
  10437. var DOMNode=$B.DOMNode=function(elt){if(elt.__class__===DOMNodeDict){return elt}
  10438. if(typeof elt=="number" ||typeof elt=="boolean" ||
  10439. typeof elt=="string"){return elt}
  10440. var res={}
  10441. res.$dict={}
  10442. res.elt=elt
  10443. if(elt['$brython_id']===undefined||elt.nodeType===9){
  10444. elt.$brython_id='DOM-'+$B.UUID()}
  10445. res.__class__=DOMNodeDict
  10446. return res}
  10447. DOMNodeDict={__class__ : $B.$type,__name__ : 'DOMNode'}
  10448. DOMNode.__class__=$B.$factory
  10449. DOMNode.$dict=DOMNodeDict
  10450. DOMNodeDict.$factory=DOMNode
  10451. DOMNodeDict.__mro__=[_b_.object.$dict]
  10452. DOMNodeDict.__add__=function(self,other){
  10453. var res=$TagSum()
  10454. res.children=[self],pos=1
  10455. if(isinstance(other,$TagSum)){res.children=res.children.concat(other.children)}else if(isinstance(other,[_b_.str,_b_.int,_b_.float,_b_.list,_b_.dict,_b_.set,_b_.tuple])){res.children[pos++]=DOMNode(document.createTextNode(_b_.str(other)))}else if(isinstance(other,DOMNode)){res.children[pos++]=other}else{
  10456. try{res.children=res.children.concat(_b_.list(other))}
  10457. catch(err){throw _b_.TypeError("can't add '"+
  10458. $B.get_class(other).__name__+"' object to DOMNode instance")}}
  10459. return res}
  10460. DOMNodeDict.__bool__=function(self){return true}
  10461. DOMNodeDict.__class__=$B.$type
  10462. DOMNodeDict.__contains__=function(self,key){
  10463. if(self.elt.nodeType==9 && typeof key=="string"){return document.getElementById(key)!==null}
  10464. key=key.elt !==undefined ? key.elt : key
  10465. if(self.elt.length!==undefined && typeof self.elt.item=="function"){for(var i=0,len=self.elt.length;i<len;i++){if(self.elt.item(i)===key){return true}}}
  10466. return false}
  10467. DOMNodeDict.__del__=function(self){
  10468. if(!self.elt.parentNode){throw _b_.ValueError("can't delete "+str(elt))}
  10469. self.elt.parentNode.removeChild(self.elt)}
  10470. DOMNodeDict.__delitem__=function(self,key){if(self.elt.nodeType===9){
  10471. var res=self.elt.getElementById(key)
  10472. if(res){res.parentNode.removeChild(res)}
  10473. else{throw KeyError(key)}}else{
  10474. console.log('delitem')
  10475. self.elt.parentNode.removeChild(self.elt)}}
  10476. DOMNodeDict.__dir__=function(self){var res=[]
  10477. for(var attr in self.elt){res.push(attr)}
  10478. for(var attr in DOMNodeDict){if(res.indexOf(attr)==-1){res.push(attr)}}
  10479. return res}
  10480. DOMNodeDict.__eq__=function(self,other){return self.elt==other.elt}
  10481. DOMNodeDict.__getattribute__=function(self,attr){switch(attr){case 'class_name':
  10482. case 'html':
  10483. case 'id':
  10484. case 'parent':
  10485. case 'query':
  10486. case 'text':
  10487. return DOMNodeDict[attr](self)
  10488. case 'height':
  10489. case 'left':
  10490. case 'top':
  10491. case 'width':
  10492. if(self.elt instanceof SVGElement){return self.elt.getAttributeNS(null,attr)}
  10493. return DOMNodeDict[attr].__get__(self)
  10494. case 'clear':
  10495. case 'closest':
  10496. case 'remove':
  10497. return function(){return DOMNodeDict[attr](self,arguments[0])}
  10498. case 'headers':
  10499. if(self.elt.nodeType==9){
  10500. var req=new XMLHttpRequest();
  10501. req.open('GET',document.location,false);
  10502. req.send(null);
  10503. var headers=req.getAllResponseHeaders();
  10504. headers=headers.split('\r\n')
  10505. var res=_b_.dict()
  10506. for(var i=0;i<headers.length;i++){var header=headers[i]
  10507. if(header.strip().length==0){continue}
  10508. var pos=header.search(':')
  10509. res.__setitem__(header.substr(0,pos),header.substr(pos+1).lstrip())}
  10510. return res;}
  10511. break
  10512. case '$$location':
  10513. attr='location'
  10514. break}
  10515. if(self.elt.getAttribute!==undefined){res=self.elt.getAttribute(attr)
  10516. if(res!==undefined&&res!==null&&self.elt[attr]===undefined){
  10517. return res}}
  10518. if(self.elt.getAttributeNS!==undefined){res=self.elt.getAttributeNS(null,attr)
  10519. if(res!==undefined && res!==null && res!="" &&
  10520. self.elt[attr]===undefined){
  10521. return res}}
  10522. var res=self.elt[attr]
  10523. if(res!==undefined){if(res===null){return _b_.None}
  10524. if(typeof res==="function"){var func=(function(f,elt){return function(){var args=[],pos=0
  10525. for(var i=0;i<arguments.length;i++){var arg=arguments[i]
  10526. if(typeof arg=="function"){var f1=function(){try{return arg.apply(null,arguments)}
  10527. catch(err){if(err.__class__!==undefined){var msg=_b_.getattr(err,'info')+
  10528. '\n'+err.__class__.__name__
  10529. if(err.args){msg +=': '+err.args[0]}
  10530. try{getattr($B.stderr,"write")(msg)}
  10531. catch(err){console.log(msg)}}else{try{getattr($B.stderr,"write")(err)}
  10532. catch(err1){console.log(err)}}
  10533. throw err}}
  10534. args[pos++]=f1}
  10535. else if(isinstance(arg,JSObject)){args[pos++]=arg.js}else if(isinstance(arg,DOMNode)){args[pos++]=arg.elt}else if(arg===_b_.None){args[pos++]=null}else{args[pos++]=arg}}
  10536. var result=f.apply(elt,args)
  10537. return $B.$JS2Py(result)}})(res,self.elt)
  10538. func.$infos={__name__ : attr}
  10539. func.$is_func=true
  10540. return func}
  10541. if(attr=='options')return $Options(self.elt)
  10542. if(attr=='style')return $Style(self.elt[attr])
  10543. return $B.$JS2Py(res)}
  10544. return $ObjectDict.__getattribute__(self,attr)}
  10545. DOMNodeDict.__getitem__=function(self,key){if(self.elt.nodeType===9){
  10546. if(typeof key==="string"){var res=self.elt.getElementById(key)
  10547. if(res)return DOMNode(res)
  10548. throw KeyError(key)}else{try{var elts=self.elt.getElementsByTagName(key.$dict.__name__),res=[],pos=0
  10549. for(var $i=0;$i<elts.length;$i++)res[pos++]=DOMNode(elts[$i])
  10550. return res}catch(err){throw KeyError(str(key))}}}else{if(typeof self.elt.length=='number'){if((typeof key=="number" ||typeof key=="boolean")&&
  10551. typeof self.elt.item=='function'){var key_to_int=_b_.int(key)
  10552. if(key_to_int<0){key_to_int+=self.elt.length}
  10553. var res=DOMNode(self.elt.item(key_to_int))
  10554. if(res===undefined){throw _b_.KeyError(key)}
  10555. return res}else if(typeof key=="string" &&
  10556. typeof self.elt.getNamedItem=='function'){var res=DOMNode(self.elt.getNamedItem(key))
  10557. if(res===undefined){throw _b_.keyError(key)}
  10558. return res}}
  10559. throw _b_.TypeError('DOMNode object is not subscriptable')}}
  10560. DOMNodeDict.__iter__=function(self){
  10561. if(self.elt.length!==undefined && typeof self.elt.item=="function"){var items=[]
  10562. for(var i=0,len=self.elt.length;i<len;i++){items.push(DOMNode(self.elt.item(i)))}}else if(self.elt.childNodes!==undefined){var items=[]
  10563. for(var i=0,len=self.elt.childNodes.length;i<len;i++){items.push(DOMNode(self.elt.childNodes[i]))}}
  10564. return iter(items)}
  10565. DOMNodeDict.__le__=function(self,other){
  10566. var elt=self.elt
  10567. if(self.elt.nodeType===9){elt=self.elt.body}
  10568. if(isinstance(other,$TagSum)){var $i=0
  10569. for($i=0;$i<other.children.length;$i++){elt.appendChild(other.children[$i].elt)}}else if(typeof other==="string" ||typeof other==="number"){var $txt=document.createTextNode(other.toString())
  10570. elt.appendChild($txt)}else if(isinstance(other,DOMNode)){
  10571. elt.appendChild(other.elt)}else{try{
  10572. var items=_b_.list(other)
  10573. for(var i=0;i<items.length;i++){DOMNodeDict.__le__(self,items[i])}}catch(err){throw _b_.TypeError("can't add '"+
  10574. $B.get_class(other).__name__+
  10575. "' object to DOMNode instance")}}}
  10576. DOMNodeDict.__len__=function(self){return self.elt.length}
  10577. DOMNodeDict.__mul__=function(self,other){if(isinstance(other,_b_.int)&& other.valueOf()>0){var res=$TagSum()
  10578. var pos=res.children.length
  10579. for(var i=0;i<other.valueOf();i++){res.children[pos++]=DOMNodeDict.clone(self)()}
  10580. return res}
  10581. throw _b_.ValueError("can't multiply "+self.__class__+"by "+other)}
  10582. DOMNodeDict.__ne__=function(self,other){return !DOMNodeDict.__eq__(self,other)}
  10583. DOMNodeDict.__next__=function(self){self.$counter++
  10584. if(self.$counter<self.elt.childNodes.length){return DOMNode(self.elt.childNodes[self.$counter])}
  10585. throw _b_.StopIteration('StopIteration')}
  10586. DOMNodeDict.__radd__=function(self,other){
  10587. var res=$TagSum()
  10588. var txt=DOMNode(document.createTextNode(other))
  10589. res.children=[txt,self]
  10590. return res}
  10591. DOMNodeDict.__str__=DOMNodeDict.__repr__=function(self){var proto=Object.getPrototypeOf(self.elt)
  10592. if(proto){var name=proto.constructor.name
  10593. if(name===undefined){
  10594. var proto_str=proto.constructor.toString()
  10595. name=proto_str.substring(8,proto_str.length-1)}
  10596. return "<"+name+" object>"}
  10597. var res="<DOMNode object type '"
  10598. return res+$NodeTypes[self.elt.nodeType]+"' name '"+self.elt.nodeName+"'>"}
  10599. DOMNodeDict.__setattr__=function(self,attr,value){if(attr.substr(0,2)=='on'){
  10600. if(!_b_.bool(value)){
  10601. DOMNodeDict.unbind(self,attr.substr(2))}else{
  10602. DOMNodeDict.bind(self,attr.substr(2),value)}}else{if(DOMNodeDict['set_'+attr]!==undefined){return DOMNodeDict['set_'+attr](self,value)}
  10603. var attr1=attr.replace('_','-').toLowerCase()
  10604. if(self.elt instanceof SVGElement &&
  10605. self.elt.getAttributeNS(null,attr1)!==null){self.elt.setAttributeNS(null,attr1,value)
  10606. return}
  10607. if(self.elt[attr1]!==undefined){self.elt[attr1]=value;return}
  10608. if(typeof self.elt.getAttribute=='function' &&
  10609. typeof self.elt.setAttribute=='function'){var res=self.elt.getAttribute(attr1)
  10610. if(res!==undefined&&res!==null&&res!=''){if(value===false){self.elt.removeAttribute(attr1)}else{self.elt.setAttribute(attr1,value)}
  10611. return}}
  10612. self.elt[attr]=value}}
  10613. DOMNodeDict.__setitem__=function(self,key,value){self.elt.childNodes[key]=value}
  10614. DOMNodeDict.abs_left={__get__: function(self){return $getPosition(self.elt).left},__set__: function(){throw _b_.AttributeError("'DOMNode' objectattribute 'abs_left' is read-only")}}
  10615. DOMNodeDict.abs_top={__get__: function(self){return $getPosition(self.elt).top},__set__: function(){throw _b_.AttributeError("'DOMNode' objectattribute 'abs_top' is read-only")}}
  10616. DOMNodeDict.bind=function(self,event){
  10617. var _id
  10618. if(self.elt.nodeType===9){_id=0}
  10619. else{_id=self.elt.$brython_id}
  10620. var _d=_b_.dict.$dict
  10621. if(!_d.__contains__($B.events,_id)){_d.__setitem__($B.events,_id,dict())}
  10622. var item=_d.__getitem__($B.events,_id)
  10623. if(!_d.__contains__(item,event)){_d.__setitem__(item,event,[])}
  10624. var evlist=_d.__getitem__(item,event)
  10625. var pos=evlist.length
  10626. for(var i=2;i<arguments.length;i++){var func=arguments[i]
  10627. var callback=(function(f){return function(ev){try{return f($DOMEvent(ev))}catch(err){if(err.__class__!==undefined){var msg=_b_.getattr(err,'info')+
  10628. '\n'+err.__class__.__name__
  10629. if(err.args){msg +=': '+err.args[0]}
  10630. try{getattr($B.stderr,"write")(msg)}
  10631. catch(err){console.log(msg)}}else{try{getattr($B.stderr,"write")(err)}
  10632. catch(err1){console.log(err)}}}}}
  10633. )(func)
  10634. if(window.addEventListener){self.elt.addEventListener(event,callback,false)}else if(window.attachEvent){self.elt.attachEvent("on"+event,callback)}
  10635. evlist[pos++]=[func,callback]}
  10636. return self}
  10637. DOMNodeDict.children=function(self){var res=[],pos=0,elt=self.elt
  10638. console.log(elt,elt.childNodes)
  10639. if(elt.nodeType==9){elt=elt.body}
  10640. for(var i=0;i<elt.childNodes.length;i++){res[pos++]=DOMNode(elt.childNodes[i])}
  10641. return res}
  10642. DOMNodeDict.clear=function(self){
  10643. var elt=self.elt
  10644. if(elt.nodeType==9){elt=elt.body}
  10645. for(var i=elt.childNodes.length-1;i>=0;i--){elt.removeChild(elt.childNodes[i])}}
  10646. DOMNodeDict.Class=function(self){if(self.elt.className !==undefined)return self.elt.className
  10647. return None}
  10648. DOMNodeDict.class_name=function(self){return DOMNodeDict.Class(self)}
  10649. DOMNodeDict.clone=function(self){res=DOMNode(self.elt.cloneNode(true))
  10650. res.elt.$brython_id='DOM-' + $B.UUID()
  10651. var _d=_b_.dict.$dict
  10652. if(_d.__contains__($B.events,self.elt.$brython_id)){var events=_d.__getitem__($B.events,self.elt.$brython_id)
  10653. var items=_b_.list(_d.items(events))
  10654. for(var i=0;i<items.length;i++){var event=items[i][0]
  10655. for(var j=0;j<items[i][1].length;j++){DOMNodeDict.bind(res,event,items[i][1][j][0])}}}
  10656. return res}
  10657. DOMNodeDict.closest=function(self,tagName){
  10658. var res=self.elt,tagName=tagName.toLowerCase()
  10659. while(res.tagName.toLowerCase()!=tagName){res=res.parentNode
  10660. if(res===undefined){throw _b_.KeyError('no parent of type '+tagName)}}
  10661. return DOMNode(res)}
  10662. DOMNodeDict.events=function(self,event){var _id
  10663. if(self.elt.nodeType===9){_id=0}
  10664. else{_id=self.elt.$brython_id}
  10665. var _d=_b_.dict.$dict
  10666. if(!_d.__contains__($B.events,_id)){return[]}
  10667. var item=_d.__getitem__($B.events,_id)
  10668. if(!_d.__contains__(item,event)){return[]}
  10669. var evt_list=_d.__getitem__(item,event),callbacks=[]
  10670. for(var i=0;i<evt_list.length;i++){callbacks.push(evt_list[i][1])}
  10671. return callbacks}
  10672. DOMNodeDict.focus=function(self){return(function(obj){return function(){
  10673. setTimeout(function(){obj.focus();},10)}})(self.elt)}
  10674. DOMNodeDict.get=function(self){
  10675. var obj=self.elt
  10676. var args=[],pos=0
  10677. for(var i=1;i<arguments.length;i++){args[pos++]=arguments[i]}
  10678. var $ns=$B.args('get',0,{},[],args,{},null,'kw')
  10679. var $dict={}
  10680. var items=_b_.list(_b_.dict.$dict.items($ns['kw']))
  10681. for(var i=0;i<items.length;i++){$dict[items[i][0]]=items[i][1]}
  10682. if($dict['name']!==undefined){if(obj.getElementsByName===undefined){throw _b_.TypeError("DOMNode object doesn't support selection by name")}
  10683. var res=[],pos=0
  10684. var node_list=document.getElementsByName($dict['name'])
  10685. if(node_list.length===0)return[]
  10686. for(var i=0;i<node_list.length;i++)res[pos++]=DOMNode(node_list[i])}
  10687. if($dict['tag']!==undefined){if(obj.getElementsByTagName===undefined){throw _b_.TypeError("DOMNode object doesn't support selection by tag name")}
  10688. var res=[],pos=0
  10689. var node_list=document.getElementsByTagName($dict['tag'])
  10690. if(node_list.length===0)return[]
  10691. for(var i=0;i<node_list.length;i++)res[pos++]=DOMNode(node_list[i])}
  10692. if($dict['classname']!==undefined){if(obj.getElementsByClassName===undefined){throw _b_.TypeError("DOMNode object doesn't support selection by class name")}
  10693. var res=[],pos=0
  10694. var node_list=document.getElementsByClassName($dict['classname'])
  10695. if(node_list.length===0)return[]
  10696. for(var i=0;i<node_list.length;i++)res[pos++]=DOMNode(node_list[i])}
  10697. if($dict['id']!==undefined){if(obj.getElementById===undefined){throw _b_.TypeError("DOMNode object doesn't support selection by id")}
  10698. var id_res=obj.getElementById($dict['id'])
  10699. if(!id_res)return[]
  10700. return[DOMNode(id_res)]}
  10701. if($dict['selector']!==undefined){if(obj.querySelectorAll===undefined){throw _b_.TypeError("DOMNode object doesn't support selection by selector")}
  10702. var node_list=obj.querySelectorAll($dict['selector'])
  10703. var sel_res=[],pos=0
  10704. if(node_list.length===0)return[]
  10705. for(var i=0;i<node_list.length;i++)sel_res[pos++]=DOMNode(node_list[i])
  10706. if(res===undefined)return sel_res
  10707. var to_delete=[],pos=0
  10708. for(var i=0;i<res.length;i++){var elt=res[i],
  10709. flag=false
  10710. for(var j=0;j<sel_res.length;j++){if(elt.__eq__(sel_res[j])){flag=true;break}}
  10711. if(!flag){to_delete[pos++]=i}}
  10712. for(var i=to_delete.length-1;i>=0;i--)res.splice(to_delete[i],1)}
  10713. return res}
  10714. DOMNodeDict.getContext=function(self){
  10715. if(!('getContext' in self.elt)){throw _b_.AttributeError("object has no attribute 'getContext'")}
  10716. var obj=self.elt
  10717. return function(ctx){return JSObject(obj.getContext(ctx))}}
  10718. DOMNodeDict.getSelectionRange=function(self){
  10719. if(self.elt['getSelectionRange']!==undefined){return self.elt.getSelectionRange.apply(null,arguments)}}
  10720. DOMNodeDict.height={'__get__': function(self){
  10721. if(self.elt.tagName=='CANVAS'){return self.elt.height}
  10722. if(self.elt.style===undefined){return _b_.None}
  10723. var res=parseInt(self.elt.style.height)
  10724. if(isNaN(res)){return self.elt.offsetHeight}
  10725. return res},'__set__': function(obj,self,value){if(self.elt.tagName=='CANVAS'){self.elt.height=value}
  10726. self.elt.style.height=value+'px'}}
  10727. DOMNodeDict.html=function(self){var res=self.elt.innerHTML
  10728. if(res===undefined){if(self.elt.nodeType==9){res=self.elt.body.innerHTML}
  10729. else{res=_b_.None}}
  10730. return res}
  10731. DOMNodeDict.id=function(self){if(self.elt.id !==undefined)return self.elt.id
  10732. return None}
  10733. DOMNodeDict.inside=function(self,other){
  10734. other=other.elt
  10735. var elt=self.elt
  10736. while(true){if(other===elt){return true}
  10737. elt=elt.parentElement
  10738. if(!elt){return false}}}
  10739. DOMNodeDict.left={'__get__': function(self){if(self.elt.style===undefined){return _b_.None}
  10740. var res=parseInt(self.elt.style.left)
  10741. if(isNaN(res)){throw _b_.AttributeError("node has no attribute 'left'")}
  10742. return res},'__set__': function(obj,self,value){self.elt.style.left=value+'px'}}
  10743. DOMNodeDict.options=function(self){
  10744. return new $OptionsClass(self.elt)}
  10745. DOMNodeDict.parent=function(self){if(self.elt.parentElement)return DOMNode(self.elt.parentElement)
  10746. return None}
  10747. DOMNodeDict.remove=function(self,child){
  10748. console.log('WARNING - since version 3.1.2, method remove() is the '+
  10749. 'DOM Node method of the same name.')
  10750. if(typeof self.elt.remove=="function"){self.elt.remove(child)
  10751. return None}else{throw _b_.AttributeError(_b_.str(self)+" has no attribute 'remove'")}}
  10752. DOMNodeDict.reset=function(self){
  10753. return function(){self.elt.reset()}}
  10754. DOMNodeDict.style=function(self){
  10755. self.elt.style.float=self.elt.style.cssFloat ||self.style.styleFloat
  10756. return $B.JSObject(self.elt.style)}
  10757. DOMNodeDict.top={'__get__': function(self){if(self.elt.style===undefined){return _b_.None}
  10758. var res=parseInt(self.elt.style.top)
  10759. if(isNaN(res)){throw _b_.AttributeError("node has no attribute 'top'")}
  10760. return res},'__set__': function(obj,self,value){self.elt.style.top=value+'px'}}
  10761. DOMNodeDict.setSelectionRange=function(self){
  10762. if(this['setSelectionRange']!==undefined){return(function(obj){return function(){return obj.setSelectionRange.apply(obj,arguments)}})(this)}else if(this['createTextRange']!==undefined){return(function(obj){return function(start_pos,end_pos){if(end_pos==undefined){end_pos=start_pos}
  10763. var range=obj.createTextRange();
  10764. range.collapse(true);
  10765. range.moveEnd('character',start_pos);
  10766. range.moveStart('character',end_pos);
  10767. range.select();}})(this)}}
  10768. DOMNodeDict.set_class_name=function(self,arg){self.elt.setAttribute('class',arg)}
  10769. DOMNodeDict.set_html=function(self,value){var elt=self.elt
  10770. if(elt.nodeType==9){elt=elt.body}
  10771. elt.innerHTML=str(value)}
  10772. DOMNodeDict.set_style=function(self,style){
  10773. if(!_b_.isinstance(style,_b_.dict)){throw TypeError('style must be dict, not '+$B.get_class(style).__name__)}
  10774. var items=_b_.list(_b_.dict.$dict.items(style))
  10775. for(var i=0;i<items.length;i++){var key=items[i][0],value=items[i][1]
  10776. if(key.toLowerCase()==='float'){self.elt.style.cssFloat=value
  10777. self.elt.style.styleFloat=value}else{switch(key){case 'top':
  10778. case 'left':
  10779. case 'width':
  10780. case 'borderWidth':
  10781. if(isinstance(value,_b_.int)){value=value+'px'}}
  10782. self.elt.style[key]=value}}}
  10783. DOMNodeDict.set_text=function(self,value){var elt=self.elt
  10784. if(elt.nodeType==9){elt=elt.body}
  10785. elt.innerText=str(value)
  10786. elt.textContent=str(value)}
  10787. DOMNodeDict.set_value=function(self,value){self.elt.value=str(value)}
  10788. DOMNodeDict.submit=function(self){
  10789. return function(){self.elt.submit()}}
  10790. DOMNodeDict.text=function(self){var elt=self.elt
  10791. if(elt.nodeType==9){elt=elt.body}
  10792. var res=elt.innerText ||elt.textContent
  10793. if(res===null){res=_b_.None}
  10794. return res}
  10795. DOMNodeDict.toString=function(self){if(self===undefined)return 'DOMNode'
  10796. return self.elt.nodeName}
  10797. DOMNodeDict.trigger=function(self,etype){
  10798. if(self.elt.fireEvent){self.elt.fireEvent('on' + etype);}else{
  10799. var evObj=document.createEvent('Events');
  10800. evObj.initEvent(etype,true,false);
  10801. self.elt.dispatchEvent(evObj);}}
  10802. DOMNodeDict.unbind=function(self,event){
  10803. var _id
  10804. if(self.elt.nodeType==9){_id=0}else{_id=self.elt.$brython_id}
  10805. if(!_b_.dict.$dict.__contains__($B.events,_id))return
  10806. var item=_b_.dict.$dict.__getitem__($B.events,_id)
  10807. if(event===undefined){var events=_b_.list(_b_.dict.$dict.keys(item))
  10808. for(var i=0;i<events.length;i++){DOMNodeDict.unbind(self,events[i])}
  10809. return}
  10810. if(!_b_.dict.$dict.__contains__(item,event))return
  10811. var events=_b_.dict.$dict.__getitem__(item,event)
  10812. if(arguments.length===2){for(var i=0;i<events.length;i++){var callback=events[i][1]
  10813. if(window.removeEventListener){self.elt.removeEventListener(event,callback,false)}else if(window.detachEvent){self.elt.detachEvent(event,callback,false)}}
  10814. events=[]
  10815. return}
  10816. for(var i=2;i<arguments.length;i++){var func=arguments[i],flag=false
  10817. for(var j=0;j<events.length;j++){if(getattr(func,'__eq__')(events[j][0])){var callback=events[j][1]
  10818. if(window.removeEventListener){self.elt.removeEventListener(event,callback,false)}else if(window.detachEvent){self.elt.detachEvent(event,callback,false)}
  10819. events.splice(j,1)
  10820. flag=true
  10821. break}}
  10822. if(!flag){throw KeyError('missing callback for event '+event)}}}
  10823. DOMNodeDict.width={'__get__': function(self){
  10824. if(self.elt.tagName=='CANVAS'){return self.elt.width}
  10825. if(self.elt.style===undefined){return _b_.None}
  10826. var res=parseInt(self.elt.style.width)
  10827. if(isNaN(res)){
  10828. return self.elt.offsetWidth}
  10829. return res},'__set__': function(obj,self,value){if(self.elt.tagName=='CANVAS'){
  10830. self.elt.width=value}
  10831. self.elt.style.width=value+'px'}}
  10832. var $QueryDict={__class__:$B.$type,__name__:'query'}
  10833. $QueryDict.__contains__=function(self,key){return self._keys.indexOf(key)>-1}
  10834. $QueryDict.__getitem__=function(self,key){
  10835. var result=self._values[key]
  10836. if(result===undefined)throw KeyError(key)
  10837. if(result.length==1)return result[0]
  10838. return result}
  10839. var $QueryDict_iterator=$B.$iterator_class('query string iterator')
  10840. $QueryDict.__iter__=function(self){return $B.$iterator(self._keys,$QueryDict_iterator)}
  10841. $QueryDict.__mro__=[$ObjectDict]
  10842. $QueryDict.getfirst=function(self,key,_default){
  10843. var result=self._values[key]
  10844. if(result===undefined){if(_default===undefined)return None
  10845. return _default}
  10846. return result[0]}
  10847. $QueryDict.getlist=function(self,key){
  10848. var result=self._values[key]
  10849. if(result===undefined)return[]
  10850. return result}
  10851. $QueryDict.getvalue=function(self,key,_default){try{return $QueryDict.__getitem__(self,key)}
  10852. catch(err){if(_default===undefined)return None
  10853. return _default}}
  10854. $QueryDict.keys=function(self){return self._keys}
  10855. DOMNodeDict.query=function(self){var res={__class__:$QueryDict,_keys :[],_values :{}}
  10856. var qs=location.search.substr(1).split('&')
  10857. for(var i=0;i<qs.length;i++){var pos=qs[i].search('=')
  10858. var elts=[qs[i].substr(0,pos),qs[i].substr(pos+1)]
  10859. var key=decodeURIComponent(elts[0])
  10860. var value=decodeURIComponent(elts[1])
  10861. if(res._keys.indexOf(key)>-1){res._values[key].push(value)}
  10862. else{res._keys.push(key)
  10863. res._values[key]=[value]}}
  10864. return res}
  10865. var $TagSumDict={__class__ : $B.$type,__name__:'TagSum'}
  10866. $TagSumDict.appendChild=function(self,child){self.children.push(child)}
  10867. $TagSumDict.__add__=function(self,other){if($B.get_class(other)===$TagSumDict){self.children=self.children.concat(other.children)}else if(isinstance(other,[_b_.str,_b_.int,_b_.float,_b_.dict,_b_.set,_b_.list])){self.children=self.children.concat(DOMNode(document.createTextNode(other)))}else{self.children.push(other)}
  10868. return self}
  10869. $TagSumDict.__mro__=[$ObjectDict]
  10870. $TagSumDict.__radd__=function(self,other){var res=$TagSum()
  10871. res.children=self.children.concat(DOMNode(document.createTextNode(other)))
  10872. return res}
  10873. $TagSumDict.__repr__=function(self){var res='<object TagSum> '
  10874. for(var i=0;i<self.children.length;i++){res+=self.children[i]
  10875. if(self.children[i].toString()=='[object Text]'){res +=' ['+self.children[i].textContent+']\n'}}
  10876. return res}
  10877. $TagSumDict.__str__=$TagSumDict.toString=$TagSumDict.__repr__
  10878. $TagSumDict.clone=function(self){var res=$TagSum(),$i=0
  10879. for($i=0;$i<self.children.length;$i++){res.children.push(self.children[$i].cloneNode(true))}
  10880. return res}
  10881. function $TagSum(){return{__class__:$TagSumDict,children:[],toString:function(){return '(TagSum)'}}}
  10882. $TagSum.__class__=$B.$factory
  10883. $TagSum.$dict=$TagSumDict
  10884. $B.$TagSum=$TagSum
  10885. var win=JSObject(window)
  10886. win.get_postMessage=function(msg,targetOrigin){if(isinstance(msg,dict)){var temp={__class__:'dict'}
  10887. var items=_b_.list(_b_.dict.$dict.items(msg))
  10888. for(var i=0;i<items.length;i++)temp[items[i][0]]=items[i][1]
  10889. msg=temp}
  10890. return window.postMessage(msg,targetOrigin)}
  10891. $B.DOMNodeDict=DOMNodeDict
  10892. $B.win=win})(__BRYTHON__)
  10893. ;(function($B){
  10894. var _b_=$B.builtins
  10895. eval($B.InjectBuiltins())
  10896. function make_node(top_node,node){
  10897. if(node.C.$genjs){var ctx_js=node.C.$genjs}else{var ctx_js=node.C.$genjs=node.C.to_js()}
  10898. var is_cond=false,is_except=false,is_else=false,is_continue
  10899. if(node.locals_def){
  10900. var iter_name=top_node.iter_id
  10901. ctx_js='for(var attr in this.blocks){'+
  10902. 'eval("var "+attr+"=this.blocks[attr]");};'+
  10903. 'var $locals_'+iter_name+' = this.env = {}'+
  10904. ', $local_name = "'+iter_name+
  10905. '", $locals = $locals_'+iter_name+';'}
  10906. if(node.is_catch){is_except=true;is_cond=true}
  10907. if(node.is_except){is_except=true}
  10908. if(node.C.type=='node'){var ctx=node.C.tree[0]
  10909. var ctype=ctx.type
  10910. switch(ctx.type){case 'except':
  10911. is_except=true
  10912. is_cond=true
  10913. break
  10914. case 'single_kw':
  10915. is_cond=true
  10916. if(ctx.token=='else')is_else=true
  10917. if(ctx.token=='finally')is_except=true
  10918. break
  10919. case 'condition':
  10920. if(ctx.token=='elif'){is_else=true;is_cond=true}
  10921. if(ctx.token=='if')is_cond=true}}
  10922. if(ctx_js){
  10923. var new_node=new $B.genNode(ctx_js)
  10924. if(ctype=='yield'){
  10925. var yield_node_id=top_node.yields.length
  10926. while(ctx_js.charAt(ctx_js.length-1)==';'){ctx_js=ctx_js.substr(0,ctx_js.length-1)}
  10927. var res='return ['+ctx_js+', '+yield_node_id+']'
  10928. new_node.data=res
  10929. top_node.yields.push(new_node)}else if(node.is_set_yield_value){
  10930. var yield_node_id=top_node.yields.length
  10931. var js='var sent_value = this.sent_value || None;'
  10932. js +='if(sent_value.__class__===$B.$GeneratorSendError)'+
  10933. '{throw sent_value.err}'
  10934. js +='var $yield_value'+ctx_js+'=sent_value;'
  10935. js +='this.sent_value=None'
  10936. new_node.data=js}else if(ctype=='break' ||ctype=="continue"){
  10937. new_node['is_'+ctype]=true
  10938. new_node.loop_num=node.C.tree[0].loop_ctx.loop_num}
  10939. new_node.is_yield=(ctype=='yield'||ctype=='return')
  10940. new_node.is_cond=is_cond
  10941. new_node.is_except=is_except
  10942. new_node.is_if=ctype=='condition' && ctx.token=="if"
  10943. new_node.is_try=node.is_try
  10944. new_node.is_else=is_else
  10945. new_node.loop_start=node.loop_start
  10946. new_node.is_set_yield_value=node.is_set_yield_value
  10947. for(var i=0,_len_i=node.children.length;i < _len_i;i++){var nd=make_node(top_node,node.children[i])
  10948. if(nd!==undefined){new_node.addChild(nd)}}}
  10949. return new_node}
  10950. $B.genNode=function(data,parent){this.data=data
  10951. this.parent=parent
  10952. this.children=[]
  10953. this.has_child=false
  10954. if(parent===undefined){this.nodes={}
  10955. this.num=0}
  10956. this.addChild=function(child){if(child===undefined){console.log('child of '+this+' undefined')}
  10957. this.children[this.children.length]=child
  10958. this.has_child=true
  10959. child.parent=this
  10960. child.rank=this.children.length-1}
  10961. this.clone=function(){var res=new $B.genNode(this.data)
  10962. res.has_child=this.has_child
  10963. res.is_cond=this.is_cond
  10964. res.is_except=this.is_except
  10965. res.is_if=this.is_if
  10966. res.is_try=this.is_try
  10967. res.is_else=this.is_else
  10968. res.loop_num=this.loop_num
  10969. res.loop_start=this.loop_start
  10970. res.is_yield=this.is_yield
  10971. return res}
  10972. this.clone_tree=function(exit_node,head){
  10973. var res=new $B.genNode(this.data)
  10974. if(this.replaced && !in_loop(this)){
  10975. res.data='void(0)'}
  10976. if(this===exit_node &&(this.parent.is_cond ||!in_loop(this))){
  10977. if(!exit_node.replaced){
  10978. res=new $B.genNode('void(0)')}else{res=new $B.genNode(exit_node.data)}
  10979. exit_node.replaced=true}
  10980. if(head && this.is_break){res.data='$locals["$no_break'+this.loop_num+'"]=false;'
  10981. res.data +='var err = new Error("break");'
  10982. res.data +='err.__class__=$B.GeneratorBreak;throw err;'
  10983. res.is_break=true}
  10984. res.is_continue=this.is_continue
  10985. res.has_child=this.has_child
  10986. res.is_cond=this.is_cond
  10987. res.is_except=this.is_except
  10988. res.is_try=this.is_try
  10989. res.is_else=this.is_else
  10990. res.loop_num=this.loop_num
  10991. res.loop_start=this.loop_start
  10992. res.no_break=true
  10993. res.is_yield=this.is_yield
  10994. for(var i=0,_len_i=this.children.length;i < _len_i;i++){if(this.children[i].is_continue){
  10995. res.addChild(new $B.genNode('void(0)'))
  10996. break}
  10997. res.addChild(this.children[i].clone_tree(exit_node,head))
  10998. if(this.children[i].is_break){res.no_break=false}}
  10999. return res}
  11000. this.has=function(keyword){
  11001. if(this['is_'+keyword]){return true}
  11002. else{for(var i=0,_len_i=this.children.length;i < _len_i;i++){if(this.children[i].has(keyword)){return true}}}
  11003. return false}
  11004. this.indent_src=function(indent){return ' '.repeat(indent*indent)}
  11005. this.src=function(indent){
  11006. indent=indent ||0
  11007. var res=[this.indent_src(indent)+this.data],pos=1
  11008. if(this.has_child)res[pos++]='{'
  11009. res[pos++]='\n'
  11010. for(var i=0,_len_i=this.children.length;i < _len_i;i++){res[pos++]=this.children[i].src(indent+1)
  11011. if(this.children[i].is_yield){break}}
  11012. if(this.has_child)res[pos++]='\n'+this.indent_src(indent)+'}\n'
  11013. return res.join('')}
  11014. this.toString=function(){return '<Node '+this.data+'>'}}
  11015. $B.GeneratorBreak={}
  11016. $B.$GeneratorSendError={}
  11017. var $GeneratorReturn={}
  11018. $B.generator_return=function(value){return{__class__:$GeneratorReturn,value:value}}
  11019. function in_loop(node){
  11020. while(node){if(node.loop_start!==undefined)return node
  11021. node=node.parent}
  11022. return false}
  11023. function in_try(node){
  11024. var tries=[],pnode=node.parent,pos=0
  11025. while(pnode){if(pnode.is_try){tries[pos++]=pnode}
  11026. pnode=pnode.parent}
  11027. return tries}
  11028. var $BRGeneratorDict={__class__:$B.$type,__name__:'generator'}
  11029. $B.gen_counter=0
  11030. $B.$BRgenerator=function(func_name,blocks,def_id,def_node){
  11031. var def_ctx=def_node.C.tree[0]
  11032. var module=def_node.module,
  11033. iter_id=def_id
  11034. var func_root=new $B.genNode(def_ctx.to_js())
  11035. func_root.module=module
  11036. func_root.yields=[]
  11037. func_root.loop_ends={}
  11038. func_root.def_id=def_id
  11039. func_root.iter_id=iter_id
  11040. for(var i=0,_len_i=def_node.children.length;i < _len_i;i++){var nd=make_node(func_root,def_node.children[i])
  11041. if(nd===undefined){continue}
  11042. func_root.addChild(nd)}
  11043. var obj={__class__ : $BRGeneratorDict,blocks: blocks,def_ctx:def_ctx,def_id:def_id,func_name:func_name,func_root:func_root,module:module,gi_running:false,iter_id:iter_id,id:iter_id,num:0}
  11044. var src=func_root.src(),
  11045. raw_src=src.substr(src.search('function'))
  11046. raw_src +='return '+def_ctx.name+def_ctx.num+'}'
  11047. var funcs=[raw_src]
  11048. obj.parent_block=def_node.parent_block
  11049. for(var i=0;i<func_root.yields.length;i++){funcs.push(make_next(obj,i))}
  11050. delete $B.modules[iter_id]
  11051. delete $B.bound[iter_id]
  11052. return funcs}
  11053. function make_next(self,yield_node_id){
  11054. var exit_node=self.func_root.yields[yield_node_id]
  11055. exit_node.replaced=false
  11056. var root=new $B.genNode(self.def_ctx.to_js())
  11057. var fnode=self.func_root.clone()
  11058. root.addChild(fnode)
  11059. var js='for(var attr in this.blocks){eval("var "+attr+"='+
  11060. 'this.blocks[attr]");};var $locals_'+self.iter_id+' = this.env,'+
  11061. ' $locals = $locals_'+self.iter_id+', $local_name="'+self.iter_id+'";'
  11062. fnode.addChild(new $B.genNode(js))
  11063. js='var $top_frame = ["'+self.iter_id+'",$locals,"'+self.module+
  11064. '",$locals_'+self.module.replace(/\./g,'_')+'];'+
  11065. '$B.frames_stack.push($top_frame); var $stack_length = '+
  11066. '$B.frames_stack.length;'
  11067. fnode.addChild(new $B.genNode(js))
  11068. while(1){
  11069. var exit_parent=exit_node.parent,rest=[],pos=0,has_break,has_continue
  11070. var start=exit_node.rank+1
  11071. if(exit_node.loop_start!==undefined){
  11072. start=exit_node.rank}else if(exit_node.is_cond){
  11073. while(start<exit_parent.children.length &&
  11074. (exit_parent.children[start].is_except ||
  11075. exit_parent.children[start].is_else)){start++}}else if(exit_node.is_try ||exit_node.is_except){
  11076. while(start<exit_parent.children.length &&
  11077. (exit_parent.children[start].is_except ||
  11078. exit_parent.children[start].is_else)){start++}}
  11079. for(var i=start,_len_i=exit_parent.children.length;i < _len_i;i++){var clone=exit_parent.children[i].clone_tree(null,true)
  11080. if(clone.has('continue')){has_continue=true;break}
  11081. rest[pos++]=clone
  11082. if(clone.has('break')){has_break=true}}
  11083. if(has_break){
  11084. var rest_try=new $B.genNode('try')
  11085. for(var i=0,_len_i=rest.length;i < _len_i;i++){rest_try.addChild(rest[i])}
  11086. var catch_test='catch(err)'
  11087. catch_test +='{if(err.__class__!==$B.GeneratorBreak)'
  11088. catch_test +='{throw err}}'
  11089. catch_test=new $B.genNode(catch_test)
  11090. rest=[rest_try,catch_test]}
  11091. var tries=in_try(exit_node)
  11092. if(tries.length==0){
  11093. for(var i=0;i<rest.length;i++){fnode.addChild(rest[i])}}else{
  11094. var tree=[],pos=0
  11095. for(var i=0;i<tries.length;i++){var try_node=tries[i],try_clone=try_node.clone()
  11096. if(i==0){for(var j=0;j<rest.length;j++){try_clone.addChild(rest[j])}}
  11097. var children=[try_clone],cpos=1
  11098. for(var j=try_node.rank+1;j<try_node.parent.children.length;j++){if(try_node.parent.children[j].is_except){children[cpos++]=try_node.parent.children[j].clone_tree(null,true)}else{break}}
  11099. tree[pos++]=children}
  11100. var parent=fnode
  11101. while(tree.length){children=tree.pop()
  11102. for(var i=0;i<children.length;i++){parent.addChild(children[i])}
  11103. parent=children[0]}}
  11104. exit_node=exit_parent
  11105. if(exit_node===self.func_root){break}}
  11106. var src=root.children[0].src(),next_src=src.substr(src.search('function'))
  11107. next_src=next_src.substr(10)
  11108. next_src=next_src.substr(next_src.search('function'))
  11109. return next_src}
  11110. var $gen_it={__class__: $B.$type,__name__: "generator"}
  11111. $gen_it.__mro__=[_b_.object.$dict]
  11112. $gen_it.__enter__=function(self){console.log("generator.__enter__ called")}
  11113. $gen_it.__exit__=function(self){console.log("generator.__exit__ called")}
  11114. $gen_it.__iter__=function(self){return self}
  11115. $gen_it.__next__=function(self){if(self.$finished){throw _b_.StopIteration()}
  11116. if(self.gi_running===true){throw ValueError("generator already executing")}
  11117. self.gi_running=true
  11118. if(self.next===undefined){self.$finished=true
  11119. throw _b_.StopIteration()}
  11120. try{var res=self.next.apply(self,self.args)}catch(err){
  11121. self.$finished=true
  11122. throw err}finally{
  11123. self.gi_running=false
  11124. $B.leave_frame(self.iter_id)}
  11125. if(res===undefined){throw _b_.StopIteration()}
  11126. else if(res[0].__class__==$GeneratorReturn){
  11127. self.$finished=true
  11128. throw StopIteration(res[0].value)}
  11129. self.next=self.nexts[res[1]]
  11130. self.gi_running=false
  11131. return res[0]}
  11132. $gen_it.close=function(self,value){self.sent_value=_b_.GeneratorExit()
  11133. try{var res=$gen_it.__next__(self)
  11134. if(res!==_b_.None){throw _b_.RuntimeError("closed generator returned a value")}}catch(err){if($B.is_exc(err,[_b_.StopIteration,_b_.GeneratorExit])){return _b_.None}
  11135. throw err}}
  11136. $gen_it.send=function(self,value){self.sent_value=value
  11137. return $gen_it.__next__(self)}
  11138. $gen_it.$$throw=function(self,value){if(_b_.isinstance(value,_b_.type))value=value()
  11139. self.sent_value={__class__:$B.$GeneratorSendError,err:value}
  11140. return $gen_it.__next__(self)}
  11141. $B.genfunc=function(name,blocks,funcs,$defaults){
  11142. return function(){var iter_id='$gen'+$B.gen_counter++,gfuncs=[]
  11143. gfuncs.push(funcs[0]($defaults))
  11144. for(var i=1;i<funcs.length;i++){gfuncs.push(funcs[i])}
  11145. var res={__class__: $gen_it,args: Array.prototype.slice.call(arguments),blocks: blocks,env:{},name: name,nexts: gfuncs.slice(1),next: gfuncs[0],iter_id: iter_id,gi_running: false,$started: false,$defaults: $defaults}
  11146. return res}}
  11147. $B.genfunc.__class__=$B.$factory
  11148. $B.genfunc.$dict=$gen_it
  11149. $gen_it.$factory=$B.genfunc})(__BRYTHON__)
  11150. ;(function($B){var modules={}
  11151. modules['browser']={$package: true,$is_package: true,__package__:'browser',__file__:$B.brython_path.replace(/\/*$/g,'')+
  11152. '/Lib/browser/__init__.py',alert:function(message){window.alert($B.builtins.str(message))},confirm: $B.JSObject(window.confirm),console:$B.JSObject(window.console),document:$B.DOMNode(document),doc: $B.DOMNode(document),
  11153. DOMEvent:$B.DOMEvent,DOMNode:$B.DOMNode,load:function(script_url,names){
  11154. var file_obj=$B.builtins.open(script_url)
  11155. var content=$B.builtins.getattr(file_obj,'read')()
  11156. eval(content)
  11157. if(names!==undefined){if(!Array.isArray(names)){throw $B.builtins.TypeError("argument 'names' should be a"+
  11158. " list, not '"+$B.get_class(names).__name__)}else{for(var i=0;i<names.length;i++){try{window[names[i]]=eval(names[i])}
  11159. catch(err){throw $B.builtins.NameError("name '"+
  11160. names[i]+"' not found in script "+script_url)}}}}},mouseCoords: function(ev){return $B.JSObject($mouseCoords(ev))},prompt: function(message,default_value){return $B.JSObject(window.prompt(message,default_value||''))},reload: function(){
  11161. var scripts=document.getElementsByTagName('script'),js_scripts=[]
  11162. for(var i=0;i<scripts.length;i++){if(scripts[i].type===undefined ||
  11163. scripts[i].type=='text/javascript'){js_scripts.push(scripts[i])
  11164. if(scripts[i].src){console.log(scripts[i].src)}}}
  11165. console.log(js_scripts)
  11166. for(var i=0;i<$B.scripts.length;i++){var name=$B.scripts[i]
  11167. console.log('script:',name)}
  11168. for(var mod in $B.imported){if($B.imported[mod].$last_modified){console.log('check',mod,$B.imported[mod].__file__,$B.imported[mod].$last_modified)}else{console.log('no date for mod',mod)}}},select: function(css_selector){var elts=document.querySelectorAll(css_selector),DOMNode=$B.DOMNodeDict.$factory,res=[]
  11169. for(var i=0;i<elts.length;i++){res.push(DOMNode(elts[i]))}
  11170. return res},win: $B.win,window: $B.win,URLParameter:function(name){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
  11171. var regex=new RegExp("[\\?&]" + name + "=([^&#]*)"),results=regex.exec(location.search);
  11172. results=results===null ? "" : decodeURIComponent(results[1].replace(/\+/g," "));
  11173. return $B.builtins.str(results);}}
  11174. modules['browser'].__path__=modules['browser'].__file__
  11175. modules['browser.html']=(function($B){var _b_=$B.builtins
  11176. var $TagSumDict=$B.$TagSum.$dict
  11177. function makeTagDict(tagName){
  11178. var dict={__class__:$B.$type,__name__:tagName}
  11179. dict.__init__=function(){var $ns=$B.args('pow',1,{self:null},['self'],arguments,{},'args','kw'),self=$ns['self'],args=$ns['args']
  11180. if(args.length==1){var first=args[0]
  11181. if(_b_.isinstance(first,[_b_.str,_b_.int,_b_.float])){
  11182. self.elt.innerHTML=_b_.str(first)}else if(first.__class__===$TagSumDict){for(var i=0,len=first.children.length;i < len;i++){self.elt.appendChild(first.children[i].elt)}}else{
  11183. if(_b_.isinstance(first,$B.DOMNode)){self.elt.appendChild(first.elt)}else{try{
  11184. var items=_b_.list(first)
  11185. for(var i=0;i<items.length;i++){$B.DOMNode.$dict.__le__(self,items[i])}}catch(err){throw _b_.ValueError('wrong element '+first)}}}}
  11186. var items=_b_.list(_b_.dict.$dict.items($ns['kw']))
  11187. for(var i=0,len=items.length;i < len;i++){
  11188. var arg=items[i][0],value=items[i][1]
  11189. if(arg.toLowerCase().substr(0,2)==="on"){
  11190. var js='$B.DOMNodeDict.bind(self,"'
  11191. js +=arg.toLowerCase().substr(2)
  11192. eval(js+'",function(){'+value+'})')}else if(arg.toLowerCase()=="style"){$B.DOMNodeDict.set_style(self,value)}else{
  11193. if(value!==false){
  11194. try{arg=arg.replace('_','-')
  11195. self.elt.setAttribute(arg,value)}catch(err){throw _b_.ValueError("can't set attribute "+arg)}}}}}
  11196. dict.__mro__=[$B.DOMNodeDict,$B.builtins.object.$dict]
  11197. dict.__new__=function(cls){
  11198. var res=$B.DOMNode(document.createElement(tagName))
  11199. res.__class__=cls.$dict
  11200. return res}
  11201. return dict}
  11202. function makeFactory(tagName){var factory=function(){if(tagName=='SVG'){var res=$B.DOMNode(document.createElementNS("http://www.w3.org/2000/svg","svg"))}else{var res=$B.DOMNode(document.createElement(tagName))}
  11203. res.__class__=dicts[tagName]
  11204. var args=[res].concat(Array.prototype.slice.call(arguments))
  11205. dicts[tagName].__init__.apply(null,args)
  11206. return res}
  11207. factory.__class__=$B.$factory
  11208. factory.$dict=dicts[tagName]
  11209. return factory}
  11210. var $tags=['A','ABBR','ACRONYM','ADDRESS','APPLET','AREA','B','BASE','BASEFONT','BDO','BIG','BLOCKQUOTE','BODY','BR','BUTTON','CAPTION','CENTER','CITE','CODE','COL','COLGROUP','DD','DEL','DFN','DIR','DIV','DL','DT','EM','FIELDSET','FONT','FORM','FRAME','FRAMESET','H1','H2','H3','H4','H5','H6','HEAD','HR','HTML','I','IFRAME','IMG','INPUT','INS','ISINDEX','KBD','LABEL','LEGEND','LI','LINK','MAP','MENU','META','NOFRAMES','NOSCRIPT','OBJECT','OL','OPTGROUP','OPTION','P','PARAM','PRE','Q','S','SAMP','SCRIPT','SELECT','SMALL','SPAN','STRIKE','STRONG','STYLE','SUB','SUP','SVG','TABLE','TBODY','TD','TEXTAREA','TFOOT','TH','THEAD','TITLE','TR','TT','U','UL','VAR',
  11211. 'ARTICLE','ASIDE','AUDIO','BDI','CANVAS','COMMAND','DATA','DATALIST','EMBED','FIGCAPTION','FIGURE','FOOTER','HEADER','KEYGEN','MAIN','MARK','MATH','METER','NAV','OUTPUT','PROGRESS','RB','RP','RT','RTC','RUBY','SECTION','SOURCE','TEMPLATE','TIME','TRACK','VIDEO','WBR',
  11212. 'DETAILS','DIALOG','MENUITEM','PICTURE','SUMMARY']
  11213. var obj={},dicts={}
  11214. for(var i=0,len=$tags.length;i < len;i++){var tag=$tags[i]
  11215. dicts[tag]=makeTagDict(tag)
  11216. obj[tag]=makeFactory(tag)
  11217. dicts[tag].$factory=obj[tag]}
  11218. $B.tag_classes=dicts
  11219. return obj})(__BRYTHON__)
  11220. modules['javascript']={__file__:$B.brython_path+'/libs/javascript.js',$$this: function(){
  11221. return $B.JSObject($B.js_this)},JSObject: function(){console.log('"javascript.JSObject" is deprecrated. '+
  11222. 'Please refer to the documentation.')
  11223. return $B.JSObject.apply(null,arguments)},JSConstructor: function(){console.log('"javascript.JSConstructor" is deprecrated. '+
  11224. 'Please refer to the documentation.')
  11225. return $B.JSConstructor.apply(null,arguments)},load:function(script_url,names){console.log('"javascript.load" is deprecrated. '+
  11226. 'Please refer to the documentation.')
  11227. var file_obj=$B.builtins.open(script_url)
  11228. var content=$B.builtins.getattr(file_obj,'read')()
  11229. eval(content)
  11230. if(names!==undefined){if(!Array.isArray(names)){throw $B.builtins.TypeError("argument 'names' should be a"+
  11231. " list, not '"+$B.get_class(names).__name__)}else{for(var i=0;i<names.length;i++){try{window[names[i]]=eval(names[i])}
  11232. catch(err){throw $B.builtins.NameError("name '"+
  11233. names[i]+"' not found in script "+script_url)}}}}},py2js: function(src,module_name){if($B.is_none(module_name)){module_name='__main__'+$B.UUID()}
  11234. return $B.py2js(src,module_name,module_name,'__builtins__').to_js()},pyobj2jsobj:function(obj){return $B.pyobj2jsobj(obj)},jsobj2pyobj:function(obj){return $B.jsobj2pyobj(obj)}}
  11235. var _b_=$B.builtins
  11236. modules['_sys']={__file__:$B.brython_path+'/libs/_sys.js',
  11237. Getframe : function(depth){return $B._frame($B.frames_stack,depth)},argv:{
  11238. __get__: function(){var locals_id=$B.last($B.frames_stack)[0]
  11239. res=[locals_id]
  11240. if($B.$options.args!==undefined){var options=$B.$options.args[locals_id]
  11241. if(options !==undefined){if(Array.isArray(options)){for(var i=0,len=options.length;i<len;i++){if(typeof options[i]=='string' ||
  11242. typeof options[i]=='number'){res.push(options[i])}else{throw _b_.ValueError("can only pass strings or numbers in options.args")}}}}}
  11243. return res},__set__: function(){throw _b_.TypeError("Read only property 'sys.argv'")}},modules:{
  11244. __get__: function(){return _b_.dict($B.JSObject($B.imported))},__set__: function(self,obj,value){throw _b_.TypeError("Read only property 'sys.modules'")}},path:{
  11245. __get__: function(){return $B.path},__set__: function(self,obj,value){$B.path=value;}},meta_path:{
  11246. __get__: function(){return $B.meta_path},__set__: function(self,obj,value){$B.meta_path=value }},path_hooks:{
  11247. __get__: function(){return $B.path_hooks},__set__: function(self,obj,value){$B.path_hooks=value }},path_importer_cache:{
  11248. __get__: function(){return _b_.dict($B.JSObject($B.path_importer_cache))},__set__: function(self,obj,value){throw _b_.TypeError("Read only property"+
  11249. " 'sys.path_importer_cache'")}},stderr:{
  11250. __get__: function(){return $B.stderr},__set__: function(self,obj,value){$B.stderr=value},write: function(data){_b_.getattr($B.stderr,"write")(data)}},stdout:{
  11251. __get__: function(){return $B.stdout},__set__: function(self,obj,value){$B.stdout=value},write: function(data){_b_.getattr($B.stdout,"write")(data)}},stdin : $B.stdin}
  11252. function load(name,module_obj){
  11253. module_obj.__class__=$B.$ModuleDict
  11254. module_obj.__name__=name
  11255. module_obj.__repr__=module_obj.__str__=function(){return "<module '"+name+"' (built-in)>"}
  11256. $B.imported[name]=$B.modules[name]=module_obj}
  11257. for(var attr in modules){load(attr,modules[attr])}
  11258. modules['browser'].html=modules['browser.html']
  11259. var _b_=$B.builtins
  11260. _b_.__builtins__=$B.$ModuleDict.$factory('__builtins__','Python builtins')
  11261. for(var attr in $B.builtins){_b_.__builtins__[attr]=_b_[attr]}
  11262. _b_.__builtins__.__setattr__=function(attr,value){_b_[attr]=value}
  11263. $B.bound.__builtins__.__builtins__=_b_.__builtins__})(__BRYTHON__)
  11264. ;(function($B){var _b_=$B.builtins
  11265. function import_hooks(mod_name,_path,module,blocking){
  11266. if($B.is_none(module)){module=undefined;}
  11267. var _meta_path=$B.meta_path;
  11268. var spec=undefined;
  11269. for(var i=0,_len_i=_meta_path.length;i < _len_i && $B.is_none(spec);i++){var _finder=_meta_path[i],find_spec=_b_.getattr(_finder,'find_spec',null)
  11270. if(find_spec !==null){spec=_b_.getattr(find_spec,'__call__')(mod_name,_path,undefined,blocking);
  11271. spec.blocking=blocking}}
  11272. if($B.is_none(spec)){
  11273. throw _b_.ImportError('No module named '+mod_name);}
  11274. var _loader=_b_.getattr(spec,'loader',_b_.None),_sys_modules=$B.imported,_spec_name=_b_.getattr(spec,'name');
  11275. if($B.is_none(module)){
  11276. if(!$B.is_none(_loader)){var create_module=_b_.getattr(_loader,'create_module',_b_.None);
  11277. if(!$B.is_none(create_module)){module=_b_.getattr(create_module,'__call__')(spec);}}
  11278. if(module===undefined){throw _b_.ImportError(mod_name)}
  11279. if($B.is_none(module)){
  11280. module=$B.$ModuleDict.$factory(mod_name);
  11281. var mod_desc=_b_.getattr(spec,'origin');
  11282. if(_b_.getattr(spec,'has_location')){mod_desc="from '" + mod_desc + "'";}
  11283. else{
  11284. mod_desc='(' + mod_desc + ')';}
  11285. module.toString=module.__repr__=module.__str__=
  11286. function(){return "<module '" + mod_name + "' " + mod_desc + ">"}}}
  11287. module.__name__=_spec_name;
  11288. module.__loader__=_loader;
  11289. module.__package__=_b_.getattr(spec,'parent','');
  11290. module.__spec__=spec;
  11291. var locs=_b_.getattr(spec,'submodule_search_locations');
  11292. if(module.$is_package=!$B.is_none(locs)){module.__path__=locs;}
  11293. if(_b_.getattr(spec,'has_location')){module.__file__=_b_.getattr(spec,'origin')
  11294. $B.$py_module_path[module.__name__]=module.__file__;}
  11295. var cached=_b_.getattr(spec,'cached');
  11296. if(!$B.is_none(cached)){module.__cached__=cached;}
  11297. if($B.is_none(_loader)){if(!$B.is_none(locs)){$B.modules[_spec_name]=_sys_modules[_spec_name]=module;}
  11298. else{
  11299. throw _b_.ImportError(mod_name);}}
  11300. else{
  11301. var exec_module=_b_.getattr(_loader,'exec_module',_b_.None);
  11302. if($B.is_none(exec_module)){
  11303. module=_b_.getattr(_b_.getattr(_loader,'load_module'),'__call__')(_spec_name);}
  11304. else{
  11305. $B.modules[_spec_name]=_sys_modules[_spec_name]=module;
  11306. try{_b_.getattr(exec_module,'__call__')(module,blocking)}
  11307. catch(e){delete $B.modules[_spec_name];
  11308. delete _sys_modules[_spec_name];
  11309. throw e;}}}
  11310. return _sys_modules[_spec_name];}
  11311. $B.import_hooks=import_hooks})(__BRYTHON__)