browser-test.js 626 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172
  1. window.addevent('onload', function(){
  2. function read(fn)
  3. {
  4. var hexToStr = function(str)
  5. {
  6. var ret = "";
  7. for (var i = 0; i < str.length; i += 2)
  8. ret += unescape("%" + str.substr(i, 2));
  9. return ret;
  10. }
  11. if (VFSData[fn] === undefined) throw "file not found: " + fn;
  12. return hexToStr(VFSData[fn]);
  13. }
  14. var SkulptTestRunOutput = '';
  15. function print()
  16. {
  17. var out = document.getElementById("output");
  18. for (var i = 0; i < arguments.length; ++i)
  19. {
  20. out.innerHTML += arguments[i];
  21. SkulptTestRunOutput += arguments[i];
  22. out.innerHTML += " ";
  23. SkulptTestRunOutput += " ";
  24. }
  25. out.innerHTML += "<br/>"
  26. SkulptTestRunOutput += "\n";
  27. }
  28. function quit(rc)
  29. {
  30. var out = document.getElementById("output");
  31. if (rc === 0)
  32. {
  33. out.innerHTML += "<font color='green'>OK</font>";
  34. }
  35. else
  36. {
  37. out.innerHTML += "<font color='red'>FAILED</font>";
  38. }
  39. out.innerHTML += "<br/>Saving results...";
  40. var sendData = JSON.encode({
  41. browsername: BrowserDetect.browser,
  42. browserversion: BrowserDetect.version,
  43. browseros: BrowserDetect.OS,
  44. version: '524a8ae0b3ad',
  45. rc: rc,
  46. results: SkulptTestRunOutput
  47. });
  48. var results = new Request.JSON({
  49. url: '/testresults',
  50. method: 'post',
  51. onSuccess: function() { out.innerHTML += "<br/>Results saved."; },
  52. onFailure: function() { out.innerHTML += "<br/>Couldn't save results."; }
  53. });
  54. results.send(sendData);
  55. }
  56. var BrowserDetect = {
  57. init: function () {
  58. this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
  59. this.version = this.searchVersion(navigator.userAgent)
  60. || this.searchVersion(navigator.appVersion)
  61. || "an unknown version";
  62. this.OS = this.searchString(this.dataOS) || "an unknown OS";
  63. },
  64. searchString: function (data) {
  65. for (var i=0;i<data.length;i++) {
  66. var dataString = data[i].string;
  67. var dataProp = data[i].prop;
  68. this.versionSearchString = data[i].versionSearch || data[i].identity;
  69. if (dataString) {
  70. if (dataString.indexOf(data[i].subString) != -1)
  71. return data[i].identity;
  72. }
  73. else if (dataProp)
  74. return data[i].identity;
  75. }
  76. },
  77. searchVersion: function (dataString) {
  78. var index = dataString.indexOf(this.versionSearchString);
  79. if (index == -1) return;
  80. return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
  81. },
  82. dataBrowser: [
  83. {
  84. string: navigator.userAgent,
  85. subString: "Chrome",
  86. identity: "Chrome"
  87. },
  88. { string: navigator.userAgent,
  89. subString: "OmniWeb",
  90. versionSearch: "OmniWeb/",
  91. identity: "OmniWeb"
  92. },
  93. {
  94. string: navigator.vendor,
  95. subString: "Apple",
  96. identity: "Safari",
  97. versionSearch: "Version"
  98. },
  99. {
  100. prop: window.opera,
  101. identity: "Opera"
  102. },
  103. {
  104. string: navigator.vendor,
  105. subString: "iCab",
  106. identity: "iCab"
  107. },
  108. {
  109. string: navigator.vendor,
  110. subString: "KDE",
  111. identity: "Konqueror"
  112. },
  113. {
  114. string: navigator.userAgent,
  115. subString: "Firefox",
  116. identity: "Firefox"
  117. },
  118. {
  119. string: navigator.vendor,
  120. subString: "Camino",
  121. identity: "Camino"
  122. },
  123. { // for newer Netscapes (6+)
  124. string: navigator.userAgent,
  125. subString: "Netscape",
  126. identity: "Netscape"
  127. },
  128. {
  129. string: navigator.userAgent,
  130. subString: "MSIE",
  131. identity: "Explorer",
  132. versionSearch: "MSIE"
  133. },
  134. {
  135. string: navigator.userAgent,
  136. subString: "Gecko",
  137. identity: "Mozilla",
  138. versionSearch: "rv"
  139. },
  140. { // for older Netscapes (4-)
  141. string: navigator.userAgent,
  142. subString: "Mozilla",
  143. identity: "Netscape",
  144. versionSearch: "Mozilla"
  145. }
  146. ],
  147. dataOS : [
  148. {
  149. string: navigator.platform,
  150. subString: "Win",
  151. identity: "Windows"
  152. },
  153. {
  154. string: navigator.platform,
  155. subString: "Mac",
  156. identity: "Mac"
  157. },
  158. {
  159. string: navigator.userAgent,
  160. subString: "iPhone",
  161. identity: "iPhone/iPod"
  162. },
  163. {
  164. string: navigator.platform,
  165. subString: "Linux",
  166. identity: "Linux"
  167. }
  168. ]
  169. };
  170. BrowserDetect.init();
  171. // Copyright 2006 The Closure Library Authors. All Rights Reserved.
  172. //
  173. // Licensed under the Apache License, Version 2.0 (the "License");
  174. // you may not use this file except in compliance with the License.
  175. // You may obtain a copy of the License at
  176. //
  177. // http://www.apache.org/licenses/LICENSE-2.0
  178. //
  179. // Unless required by applicable law or agreed to in writing, software
  180. // distributed under the License is distributed on an "AS-IS" BASIS,
  181. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  182. // See the License for the specific language governing permissions and
  183. // limitations under the License.
  184. /**
  185. * @fileoverview Bootstrap for the Google JS Library (Closure).
  186. *
  187. * In uncompiled mode base.js will write out Closure's deps file, unless the
  188. * global <code>CLOSURE_NO_DEPS</code> is set to true. This allows projects to
  189. * include their own deps file(s) from different locations.
  190. *
  191. *
  192. *
  193. */
  194. /**
  195. * @define {boolean} Overridden to true by the compiler when --closure_pass
  196. * or --mark_as_compiled is specified.
  197. */
  198. var COMPILED = false;
  199. /**
  200. * Base namespace for the Closure library. Checks to see goog is
  201. * already defined in the current scope before assigning to prevent
  202. * clobbering if base.js is loaded more than once.
  203. */
  204. var goog = goog || {}; // Check to see if already defined in current scope
  205. /**
  206. * Reference to the global context. In most cases this will be 'window'.
  207. */
  208. goog.global = this;
  209. /**
  210. * @define {boolean} DEBUG is provided as a convenience so that debugging code
  211. * that should not be included in a production js_binary can be easily stripped
  212. * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most
  213. * toString() methods should be declared inside an "if (goog.DEBUG)" conditional
  214. * because they are generally used for debugging purposes and it is difficult
  215. * for the JSCompiler to statically determine whether they are used.
  216. */
  217. goog.DEBUG = true;
  218. /**
  219. * @define {string} LOCALE defines the locale being used for compilation. It is
  220. * used to select locale specific data to be compiled in js binary. BUILD rule
  221. * can specify this value by "--define goog.LOCALE=<locale_name>" as JSCompiler
  222. * option.
  223. *
  224. * Take into account that the locale code format is important. You should use
  225. * the canonical Unicode format with hyphen as a delimiter. Language must be
  226. * lowercase, Language Script - Capitalized, Region - UPPERCASE.
  227. * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.
  228. *
  229. * See more info about locale codes here:
  230. * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers
  231. *
  232. * For language codes you should use values defined by ISO 693-1. See it here
  233. * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from
  234. * this rule: the Hebrew language. For legacy reasons the old code (iw) should
  235. * be used instead of the new code (he), see http://wiki/Main/IIISynonyms.
  236. */
  237. goog.LOCALE = 'en'; // default to en
  238. /**
  239. * Indicates whether or not we can call 'eval' directly to eval code in the
  240. * global scope. Set to a Boolean by the first call to goog.globalEval (which
  241. * empirically tests whether eval works for globals). @see goog.globalEval
  242. * @type {?boolean}
  243. * @private
  244. */
  245. goog.evalWorksForGlobals_ = null;
  246. /**
  247. * Creates object stubs for a namespace. When present in a file, goog.provide
  248. * also indicates that the file defines the indicated object. Calls to
  249. * goog.provide are resolved by the compiler if --closure_pass is set.
  250. * @param {string} name name of the object that this file defines.
  251. */
  252. goog.provide = function(name) {
  253. if (!COMPILED) {
  254. // Ensure that the same namespace isn't provided twice. This is intended
  255. // to teach new developers that 'goog.provide' is effectively a variable
  256. // declaration. And when JSCompiler transforms goog.provide into a real
  257. // variable declaration, the compiled JS should work the same as the raw
  258. // JS--even when the raw JS uses goog.provide incorrectly.
  259. if (goog.getObjectByName(name) && !goog.implicitNamespaces_[name]) {
  260. throw Error('Namespace "' + name + '" already declared.');
  261. }
  262. var namespace = name;
  263. while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) {
  264. goog.implicitNamespaces_[namespace] = true;
  265. }
  266. }
  267. goog.exportPath_(name);
  268. };
  269. if (!COMPILED) {
  270. /**
  271. * Namespaces implicitly defined by goog.provide. For example,
  272. * goog.provide('goog.events.Event') implicitly declares
  273. * that 'goog' and 'goog.events' must be namespaces.
  274. *
  275. * @type {Object}
  276. * @private
  277. */
  278. goog.implicitNamespaces_ = {};
  279. }
  280. /**
  281. * Builds an object structure for the provided namespace path,
  282. * ensuring that names that already exist are not overwritten. For
  283. * example:
  284. * "a.b.c" -> a = {};a.b={};a.b.c={};
  285. * Used by goog.provide and goog.exportSymbol.
  286. * @param {string} name name of the object that this file defines.
  287. * @param {*=} opt_object the object to expose at the end of the path.
  288. * @param {Object=} opt_objectToExportTo The object to add the path to; default
  289. * is |goog.global|.
  290. * @private
  291. */
  292. goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {
  293. var parts = name.split('.');
  294. var cur = opt_objectToExportTo || goog.global;
  295. // Internet Explorer exhibits strange behavior when throwing errors from
  296. // methods externed in this manner. See the testExportSymbolExceptions in
  297. // base_test.html for an example.
  298. if (!(parts[0] in cur) && cur.execScript) {
  299. cur.execScript('var ' + parts[0]);
  300. }
  301. // Certain browsers cannot parse code in the form for((a in b); c;);
  302. // This pattern is produced by the JSCompiler when it collapses the
  303. // statement above into the conditional loop below. To prevent this from
  304. // happening, use a for-loop and reserve the init logic as below.
  305. // Parentheses added to eliminate strict JS warning in Firefox.
  306. for (var part; parts.length && (part = parts.shift());) {
  307. if (!parts.length && goog.isDef(opt_object)) {
  308. // last part and we have an object; use it
  309. cur[part] = opt_object;
  310. } else if (cur[part]) {
  311. cur = cur[part];
  312. } else {
  313. cur = cur[part] = {};
  314. }
  315. }
  316. };
  317. /**
  318. * Returns an object based on its fully qualified external name. If you are
  319. * using a compilation pass that renames property names beware that using this
  320. * function will not find renamed properties.
  321. *
  322. * @param {string} name The fully qualified name.
  323. * @param {Object=} opt_obj The object within which to look; default is
  324. * |goog.global|.
  325. * @return {Object} The object or, if not found, null.
  326. */
  327. goog.getObjectByName = function(name, opt_obj) {
  328. var parts = name.split('.');
  329. var cur = opt_obj || goog.global;
  330. for (var part; part = parts.shift(); ) {
  331. if (cur[part]) {
  332. cur = cur[part];
  333. } else {
  334. return null;
  335. }
  336. }
  337. return cur;
  338. };
  339. /**
  340. * Globalizes a whole namespace, such as goog or goog.lang.
  341. *
  342. * @param {Object} obj The namespace to globalize.
  343. * @param {Object=} opt_global The object to add the properties to.
  344. * @deprecated Properties may be explicitly exported to the global scope, but
  345. * this should no longer be done in bulk.
  346. */
  347. goog.globalize = function(obj, opt_global) {
  348. var global = opt_global || goog.global;
  349. for (var x in obj) {
  350. global[x] = obj[x];
  351. }
  352. };
  353. /**
  354. * Adds a dependency from a file to the files it requires.
  355. * @param {string} relPath The path to the js file.
  356. * @param {Array} provides An array of strings with the names of the objects
  357. * this file provides.
  358. * @param {Array} requires An array of strings with the names of the objects
  359. * this file requires.
  360. */
  361. goog.addDependency = function(relPath, provides, requires) {
  362. if (!COMPILED) {
  363. var provide, require;
  364. var path = relPath.replace(/\\/g, '/');
  365. var deps = goog.dependencies_;
  366. for (var i = 0; provide = provides[i]; i++) {
  367. deps.nameToPath[provide] = path;
  368. if (!(path in deps.pathToNames)) {
  369. deps.pathToNames[path] = {};
  370. }
  371. deps.pathToNames[path][provide] = true;
  372. }
  373. for (var j = 0; require = requires[j]; j++) {
  374. if (!(path in deps.requires)) {
  375. deps.requires[path] = {};
  376. }
  377. deps.requires[path][require] = true;
  378. }
  379. }
  380. };
  381. /**
  382. * Implements a system for the dynamic resolution of dependencies
  383. * that works in parallel with the BUILD system. Note that all calls
  384. * to goog.require will be stripped by the JSCompiler when the
  385. * --closure_pass option is used.
  386. * @param {string} rule Rule to include, in the form goog.package.part.
  387. */
  388. goog.require = function(rule) {
  389. // if the object already exists we do not need do do anything
  390. // TODO(user): If we start to support require based on file name this has
  391. // to change
  392. // TODO(user): If we allow goog.foo.* this has to change
  393. // TODO(user): If we implement dynamic load after page load we should probably
  394. // not remove this code for the compiled output
  395. if (!COMPILED) {
  396. if (goog.getObjectByName(rule)) {
  397. return;
  398. }
  399. var path = goog.getPathFromDeps_(rule);
  400. if (path) {
  401. goog.included_[path] = true;
  402. goog.writeScripts_();
  403. } else {
  404. var errorMessage = 'goog.require could not find: ' + rule;
  405. if (goog.global.console) {
  406. goog.global.console['error'](errorMessage);
  407. }
  408. throw Error(errorMessage);
  409. }
  410. }
  411. };
  412. /**
  413. * Path for included scripts
  414. * @type {string}
  415. */
  416. goog.basePath = '';
  417. /**
  418. * A hook for overriding the base path.
  419. * @type {string|undefined}
  420. */
  421. goog.global.CLOSURE_BASE_PATH;
  422. /**
  423. * Whether to write out Closure's deps file. By default,
  424. * the deps are written.
  425. * @type {boolean|undefined}
  426. */
  427. goog.global.CLOSURE_NO_DEPS;
  428. /**
  429. * Null function used for default values of callbacks, etc.
  430. * @return {void}
  431. */
  432. goog.nullFunction = function() {};
  433. /**
  434. * The identity function. Returns its first argument.
  435. *
  436. * @param {...*} var_args The arguments of the function.
  437. * @return {*} The first argument.
  438. * @deprecated Use goog.functions.identity instead.
  439. */
  440. goog.identityFunction = function(var_args) {
  441. return arguments[0];
  442. };
  443. /**
  444. * When defining a class Foo with an abstract method bar(), you can do:
  445. *
  446. * Foo.prototype.bar = goog.abstractMethod
  447. *
  448. * Now if a subclass of Foo fails to override bar(), an error
  449. * will be thrown when bar() is invoked.
  450. *
  451. * Note: This does not take the name of the function to override as
  452. * an argument because that would make it more difficult to obfuscate
  453. * our JavaScript code.
  454. *
  455. * @type {!Function}
  456. * @throws {Error} when invoked to indicate the method should be
  457. * overridden.
  458. */
  459. goog.abstractMethod = function() {
  460. throw Error('unimplemented abstract method');
  461. };
  462. /**
  463. * Adds a {@code getInstance} static method that always return the same instance
  464. * object.
  465. * @param {!Function} ctor The constructor for the class to add the static
  466. * method to.
  467. */
  468. goog.addSingletonGetter = function(ctor) {
  469. ctor.getInstance = function() {
  470. return ctor.instance_ || (ctor.instance_ = new ctor());
  471. };
  472. };
  473. if (!COMPILED) {
  474. /**
  475. * Object used to keep track of urls that have already been added. This
  476. * record allows the prevention of circular dependencies.
  477. * @type {Object}
  478. * @private
  479. */
  480. goog.included_ = {};
  481. /**
  482. * This object is used to keep track of dependencies and other data that is
  483. * used for loading scripts
  484. * @private
  485. * @type {Object}
  486. */
  487. goog.dependencies_ = {
  488. pathToNames: {}, // 1 to many
  489. nameToPath: {}, // 1 to 1
  490. requires: {}, // 1 to many
  491. visited: {}, // used when resolving dependencies to prevent us from
  492. // visiting the file twice
  493. written: {} // used to keep track of script files we have written
  494. };
  495. /**
  496. * Tries to detect whether is in the context of an HTML document.
  497. * @return {boolean} True if it looks like HTML document.
  498. * @private
  499. */
  500. goog.inHtmlDocument_ = function() {
  501. var doc = goog.global.document;
  502. return typeof doc != 'undefined' &&
  503. 'write' in doc; // XULDocument misses write.
  504. };
  505. /**
  506. * Tries to detect the base path of the base.js script that bootstraps Closure
  507. * @private
  508. */
  509. goog.findBasePath_ = function() {
  510. if (!goog.inHtmlDocument_()) {
  511. return;
  512. }
  513. var doc = goog.global.document;
  514. if (goog.global.CLOSURE_BASE_PATH) {
  515. goog.basePath = goog.global.CLOSURE_BASE_PATH;
  516. return;
  517. }
  518. var scripts = doc.getElementsByTagName('script');
  519. // Search backwards since the current script is in almost all cases the one
  520. // that has base.js.
  521. for (var i = scripts.length - 1; i >= 0; --i) {
  522. var src = scripts[i].src;
  523. var l = src.length;
  524. if (src.substr(l - 7) == 'base.js') {
  525. goog.basePath = src.substr(0, l - 7);
  526. return;
  527. }
  528. }
  529. };
  530. /**
  531. * Writes a script tag if, and only if, that script hasn't already been added
  532. * to the document. (Must be called at execution time)
  533. * @param {string} src Script source.
  534. * @private
  535. */
  536. goog.writeScriptTag_ = function(src) {
  537. if (goog.inHtmlDocument_() &&
  538. !goog.dependencies_.written[src]) {
  539. goog.dependencies_.written[src] = true;
  540. var doc = goog.global.document;
  541. doc.write('<script type="text/javascript" src="' +
  542. src + '"></' + 'script>');
  543. }
  544. };
  545. /**
  546. * Resolves dependencies based on the dependencies added using addDependency
  547. * and calls writeScriptTag_ in the correct order.
  548. * @private
  549. */
  550. goog.writeScripts_ = function() {
  551. // the scripts we need to write this time
  552. var scripts = [];
  553. var seenScript = {};
  554. var deps = goog.dependencies_;
  555. function visitNode(path) {
  556. if (path in deps.written) {
  557. return;
  558. }
  559. // we have already visited this one. We can get here if we have cyclic
  560. // dependencies
  561. if (path in deps.visited) {
  562. if (!(path in seenScript)) {
  563. seenScript[path] = true;
  564. scripts.push(path);
  565. }
  566. return;
  567. }
  568. deps.visited[path] = true;
  569. if (path in deps.requires) {
  570. for (var requireName in deps.requires[path]) {
  571. if (requireName in deps.nameToPath) {
  572. visitNode(deps.nameToPath[requireName]);
  573. } else if (!goog.getObjectByName(requireName)) {
  574. // If the required name is defined, we assume that this
  575. // dependency was bootstapped by other means. Otherwise,
  576. // throw an exception.
  577. throw Error('Undefined nameToPath for ' + requireName);
  578. }
  579. }
  580. }
  581. if (!(path in seenScript)) {
  582. seenScript[path] = true;
  583. scripts.push(path);
  584. }
  585. }
  586. for (var path in goog.included_) {
  587. if (!deps.written[path]) {
  588. visitNode(path);
  589. }
  590. }
  591. for (var i = 0; i < scripts.length; i++) {
  592. if (scripts[i]) {
  593. goog.writeScriptTag_(goog.basePath + scripts[i]);
  594. } else {
  595. throw Error('Undefined script input');
  596. }
  597. }
  598. };
  599. /**
  600. * Looks at the dependency rules and tries to determine the script file that
  601. * fulfills a particular rule.
  602. * @param {string} rule In the form goog.namespace.Class or project.script.
  603. * @return {?string} Url corresponding to the rule, or null.
  604. * @private
  605. */
  606. goog.getPathFromDeps_ = function(rule) {
  607. if (rule in goog.dependencies_.nameToPath) {
  608. return goog.dependencies_.nameToPath[rule];
  609. } else {
  610. return null;
  611. }
  612. };
  613. goog.findBasePath_();
  614. // Allow projects to manage the deps files themselves.
  615. if (!goog.global.CLOSURE_NO_DEPS) {
  616. goog.writeScriptTag_(goog.basePath + 'deps.js');
  617. }
  618. }
  619. //==============================================================================
  620. // Language Enhancements
  621. //==============================================================================
  622. /**
  623. * This is a "fixed" version of the typeof operator. It differs from the typeof
  624. * operator in such a way that null returns 'null' and arrays return 'array'.
  625. * @param {*} value The value to get the type of.
  626. * @return {string} The name of the type.
  627. */
  628. goog.typeOf = function(value) {
  629. var s = typeof value;
  630. if (s == 'object') {
  631. if (value) {
  632. // We cannot use constructor == Array or instanceof Array because
  633. // different frames have different Array objects. In IE6, if the iframe
  634. // where the array was created is destroyed, the array loses its
  635. // prototype. Then dereferencing val.splice here throws an exception, so
  636. // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
  637. // so that will work. In this case, this function will return false and
  638. // most array functions will still work because the array is still
  639. // array-like (supports length and []) even though it has lost its
  640. // prototype.
  641. // Mark Miller noticed that Object.prototype.toString
  642. // allows access to the unforgeable [[Class]] property.
  643. // 15.2.4.2 Object.prototype.toString ( )
  644. // When the toString method is called, the following steps are taken:
  645. // 1. Get the [[Class]] property of this object.
  646. // 2. Compute a string value by concatenating the three strings
  647. // "[object ", Result(1), and "]".
  648. // 3. Return Result(2).
  649. // and this behavior survives the destruction of the execution context.
  650. if (value instanceof Array || // Works quickly in same execution context.
  651. // If value is from a different execution context then
  652. // !(value instanceof Object), which lets us early out in the common
  653. // case when value is from the same context but not an array.
  654. // The {if (value)} check above means we don't have to worry about
  655. // undefined behavior of Object.prototype.toString on null/undefined.
  656. //
  657. // HACK: In order to use an Object prototype method on the arbitrary
  658. // value, the compiler requires the value be cast to type Object,
  659. // even though the ECMA spec explicitly allows it.
  660. (!(value instanceof Object) &&
  661. (Object.prototype.toString.call(
  662. /** @type {Object} */ (value)) == '[object Array]') ||
  663. // In IE all non value types are wrapped as objects across window
  664. // boundaries (not iframe though) so we have to do object detection
  665. // for this edge case
  666. typeof value.length == 'number' &&
  667. typeof value.splice != 'undefined' &&
  668. typeof value.propertyIsEnumerable != 'undefined' &&
  669. !value.propertyIsEnumerable('splice')
  670. )) {
  671. return 'array';
  672. }
  673. // HACK: There is still an array case that fails.
  674. // function ArrayImpostor() {}
  675. // ArrayImpostor.prototype = [];
  676. // var impostor = new ArrayImpostor;
  677. // this can be fixed by getting rid of the fast path
  678. // (value instanceof Array) and solely relying on
  679. // (value && Object.prototype.toString.vall(value) === '[object Array]')
  680. // but that would require many more function calls and is not warranted
  681. // unless closure code is receiving objects from untrusted sources.
  682. // IE in cross-window calls does not correctly marshal the function type
  683. // (it appears just as an object) so we cannot use just typeof val ==
  684. // 'function'. However, if the object has a call property, it is a
  685. // function.
  686. if (!(value instanceof Object) &&
  687. (Object.prototype.toString.call(
  688. /** @type {Object} */ (value)) == '[object Function]' ||
  689. typeof value.call != 'undefined' &&
  690. typeof value.propertyIsEnumerable != 'undefined' &&
  691. !value.propertyIsEnumerable('call'))) {
  692. return 'function';
  693. }
  694. } else {
  695. return 'null';
  696. }
  697. // In Safari typeof nodeList returns 'function', and on Firefox
  698. // typeof behaves similarly for HTML{Applet,Embed,Object}Elements
  699. // and RegExps. We would like to return object for those and we can
  700. // detect an invalid function by making sure that the function
  701. // object has a call method.
  702. } else if (s == 'function' && typeof value.call == 'undefined') {
  703. return 'object';
  704. }
  705. return s;
  706. };
  707. /**
  708. * Safe way to test whether a property is enumarable. It allows testing
  709. * for enumerable on objects where 'propertyIsEnumerable' is overridden or
  710. * does not exist (like DOM nodes in IE). Does not use browser native
  711. * Object.propertyIsEnumerable.
  712. * @param {Object} object The object to test if the property is enumerable.
  713. * @param {string} propName The property name to check for.
  714. * @return {boolean} True if the property is enumarable.
  715. * @private
  716. */
  717. goog.propertyIsEnumerableCustom_ = function(object, propName) {
  718. // KJS in Safari 2 is not ECMAScript compatible and lacks crucial methods
  719. // such as propertyIsEnumerable. We therefore use a workaround.
  720. // Does anyone know a more efficient work around?
  721. if (propName in object) {
  722. for (var key in object) {
  723. if (key == propName &&
  724. Object.prototype.hasOwnProperty.call(object, propName)) {
  725. return true;
  726. }
  727. }
  728. }
  729. return false;
  730. };
  731. /**
  732. * Safe way to test whether a property is enumarable. It allows testing
  733. * for enumerable on objects where 'propertyIsEnumerable' is overridden or
  734. * does not exist (like DOM nodes in IE).
  735. * @param {Object} object The object to test if the property is enumerable.
  736. * @param {string} propName The property name to check for.
  737. * @return {boolean} True if the property is enumarable.
  738. * @private
  739. */
  740. goog.propertyIsEnumerable_ = function(object, propName) {
  741. // In IE if object is from another window, cannot use propertyIsEnumerable
  742. // from this window's Object. Will raise a 'JScript object expected' error.
  743. if (object instanceof Object) {
  744. return Object.prototype.propertyIsEnumerable.call(object, propName);
  745. } else {
  746. return goog.propertyIsEnumerableCustom_(object, propName);
  747. }
  748. };
  749. /**
  750. * Returns true if the specified value is not |undefined|.
  751. * WARNING: Do not use this to test if an object has a property. Use the in
  752. * operator instead. Additionally, this function assumes that the global
  753. * undefined variable has not been redefined.
  754. * @param {*} val Variable to test.
  755. * @return {boolean} Whether variable is defined.
  756. */
  757. goog.isDef = function(val) {
  758. return val !== undefined;
  759. };
  760. /**
  761. * Returns true if the specified value is |null|
  762. * @param {*} val Variable to test.
  763. * @return {boolean} Whether variable is null.
  764. */
  765. goog.isNull = function(val) {
  766. return val === null;
  767. };
  768. /**
  769. * Returns true if the specified value is defined and not null
  770. * @param {*} val Variable to test.
  771. * @return {boolean} Whether variable is defined and not null.
  772. */
  773. goog.isDefAndNotNull = function(val) {
  774. // Note that undefined == null.
  775. return val != null;
  776. };
  777. /**
  778. * Returns true if the specified value is an array
  779. * @param {*} val Variable to test.
  780. * @return {boolean} Whether variable is an array.
  781. */
  782. goog.isArray = function(val) {
  783. return goog.typeOf(val) == 'array';
  784. };
  785. /**
  786. * Returns true if the object looks like an array. To qualify as array like
  787. * the value needs to be either a NodeList or an object with a Number length
  788. * property.
  789. * @param {*} val Variable to test.
  790. * @return {boolean} Whether variable is an array.
  791. */
  792. goog.isArrayLike = function(val) {
  793. var type = goog.typeOf(val);
  794. return type == 'array' || type == 'object' && typeof val.length == 'number';
  795. };
  796. /**
  797. * Returns true if the object looks like a Date. To qualify as Date-like
  798. * the value needs to be an object and have a getFullYear() function.
  799. * @param {*} val Variable to test.
  800. * @return {boolean} Whether variable is a like a Date.
  801. */
  802. goog.isDateLike = function(val) {
  803. return goog.isObject(val) && typeof val.getFullYear == 'function';
  804. };
  805. /**
  806. * Returns true if the specified value is a string
  807. * @param {*} val Variable to test.
  808. * @return {boolean} Whether variable is a string.
  809. */
  810. goog.isString = function(val) {
  811. return typeof val == 'string';
  812. };
  813. /**
  814. * Returns true if the specified value is a boolean
  815. * @param {*} val Variable to test.
  816. * @return {boolean} Whether variable is boolean.
  817. */
  818. goog.isBoolean = function(val) {
  819. return typeof val == 'boolean';
  820. };
  821. /**
  822. * Returns true if the specified value is a number
  823. * @param {*} val Variable to test.
  824. * @return {boolean} Whether variable is a number.
  825. */
  826. goog.isNumber = function(val) {
  827. return typeof val == 'number';
  828. };
  829. /**
  830. * Returns true if the specified value is a function
  831. * @param {*} val Variable to test.
  832. * @return {boolean} Whether variable is a function.
  833. */
  834. goog.isFunction = function(val) {
  835. return goog.typeOf(val) == 'function';
  836. };
  837. /**
  838. * Returns true if the specified value is an object. This includes arrays
  839. * and functions.
  840. * @param {*} val Variable to test.
  841. * @return {boolean} Whether variable is an object.
  842. */
  843. goog.isObject = function(val) {
  844. var type = goog.typeOf(val);
  845. return type == 'object' || type == 'array' || type == 'function';
  846. };
  847. /**
  848. * Gets a unique ID for an object. This mutates the object so that further
  849. * calls with the same object as a parameter returns the same value. The unique
  850. * ID is guaranteed to be unique across the current session amongst objects that
  851. * are passed into {@code getUid}. There is no guarantee that the ID is unique
  852. * or consistent across sessions.
  853. *
  854. * @param {Object} obj The object to get the unique ID for.
  855. * @return {number} The unique ID for the object.
  856. */
  857. goog.getUid = function(obj) {
  858. // TODO(user): Make the type stricter, do not accept null.
  859. // In IE, DOM nodes do not extend Object so they do not have this method.
  860. // we need to check hasOwnProperty because the proto might have this set.
  861. if (obj.hasOwnProperty && obj.hasOwnProperty(goog.UID_PROPERTY_)) {
  862. return obj[goog.UID_PROPERTY_];
  863. }
  864. if (!obj[goog.UID_PROPERTY_]) {
  865. obj[goog.UID_PROPERTY_] = ++goog.uidCounter_;
  866. }
  867. return obj[goog.UID_PROPERTY_];
  868. };
  869. /**
  870. * Removes the unique ID from an object. This is useful if the object was
  871. * previously mutated using {@code goog.getUid} in which case the mutation is
  872. * undone.
  873. * @param {Object} obj The object to remove the unique ID field from.
  874. */
  875. goog.removeUid = function(obj) {
  876. // TODO(user): Make the type stricter, do not accept null.
  877. // DOM nodes in IE are not instance of Object and throws exception
  878. // for delete. Instead we try to use removeAttribute
  879. if ('removeAttribute' in obj) {
  880. obj.removeAttribute(goog.UID_PROPERTY_);
  881. }
  882. /** @preserveTry */
  883. try {
  884. delete obj[goog.UID_PROPERTY_];
  885. } catch (ex) {
  886. }
  887. };
  888. /**
  889. * Name for unique ID property. Initialized in a way to help avoid collisions
  890. * with other closure javascript on the same page.
  891. * @type {string}
  892. * @private
  893. */
  894. goog.UID_PROPERTY_ = 'closure_uid_' +
  895. Math.floor(Math.random() * 2147483648).toString(36);
  896. /**
  897. * Counter for UID.
  898. * @type {number}
  899. * @private
  900. */
  901. goog.uidCounter_ = 0;
  902. /**
  903. * Adds a hash code field to an object. The hash code is unique for the
  904. * given object.
  905. * @param {Object} obj The object to get the hash code for.
  906. * @return {number} The hash code for the object.
  907. * @deprecated Use goog.getUid instead.
  908. */
  909. goog.getHashCode = goog.getUid;
  910. /**
  911. * Removes the hash code field from an object.
  912. * @param {Object} obj The object to remove the field from.
  913. * @deprecated Use goog.removeUid instead.
  914. */
  915. goog.removeHashCode = goog.removeUid;
  916. /**
  917. * Clones a value. The input may be an Object, Array, or basic type. Objects and
  918. * arrays will be cloned recursively.
  919. *
  920. * WARNINGS:
  921. * <code>goog.cloneObject</code> does not detect reference loops. Objects that
  922. * refer to themselves will cause infinite recursion.
  923. *
  924. * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies
  925. * UIDs created by <code>getUid</code> into cloned results.
  926. *
  927. * @param {*} obj The value to clone.
  928. * @return {*} A clone of the input value.
  929. * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.
  930. */
  931. goog.cloneObject = function(obj) {
  932. var type = goog.typeOf(obj);
  933. if (type == 'object' || type == 'array') {
  934. if (obj.clone) {
  935. return obj.clone();
  936. }
  937. var clone = type == 'array' ? [] : {};
  938. for (var key in obj) {
  939. clone[key] = goog.cloneObject(obj[key]);
  940. }
  941. return clone;
  942. }
  943. return obj;
  944. };
  945. /**
  946. * Forward declaration for the clone method. This is necessary until the
  947. * compiler can better support duck-typing constructs as used in
  948. * goog.cloneObject.
  949. *
  950. * TODO(user): Remove once the JSCompiler can infer that the check for
  951. * proto.clone is safe in goog.cloneObject.
  952. *
  953. * @type {Function}
  954. */
  955. Object.prototype.clone;
  956. /**
  957. * Partially applies this function to a particular 'this object' and zero or
  958. * more arguments. The result is a new function with some arguments of the first
  959. * function pre-filled and the value of |this| 'pre-specified'.<br><br>
  960. *
  961. * Remaining arguments specified at call-time are appended to the pre-
  962. * specified ones.<br><br>
  963. *
  964. * Also see: {@link #partial}.<br><br>
  965. *
  966. * Usage:
  967. * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
  968. * barMethBound('arg3', 'arg4');</pre>
  969. *
  970. * @param {Function} fn A function to partially apply.
  971. * @param {Object|undefined} selfObj Specifies the object which |this| should
  972. * point to when the function is run. If the value is null or undefined, it
  973. * will default to the global object.
  974. * @param {...*} var_args Additional arguments that are partially
  975. * applied to the function.
  976. *
  977. * @return {!Function} A partially-applied form of the function bind() was
  978. * invoked as a method of.
  979. */
  980. goog.bind = function(fn, selfObj, var_args) {
  981. var context = selfObj || goog.global;
  982. if (arguments.length > 2) {
  983. var boundArgs = Array.prototype.slice.call(arguments, 2);
  984. return function() {
  985. // Prepend the bound arguments to the current arguments.
  986. var newArgs = Array.prototype.slice.call(arguments);
  987. Array.prototype.unshift.apply(newArgs, boundArgs);
  988. return fn.apply(context, newArgs);
  989. };
  990. } else {
  991. return function() {
  992. return fn.apply(context, arguments);
  993. };
  994. }
  995. };
  996. /**
  997. * Like bind(), except that a 'this object' is not required. Useful when the
  998. * target function is already bound.
  999. *
  1000. * Usage:
  1001. * var g = partial(f, arg1, arg2);
  1002. * g(arg3, arg4);
  1003. *
  1004. * @param {Function} fn A function to partially apply.
  1005. * @param {...*} var_args Additional arguments that are partially
  1006. * applied to fn.
  1007. * @return {!Function} A partially-applied form of the function bind() was
  1008. * invoked as a method of.
  1009. */
  1010. goog.partial = function(fn, var_args) {
  1011. var args = Array.prototype.slice.call(arguments, 1);
  1012. return function() {
  1013. // Prepend the bound arguments to the current arguments.
  1014. var newArgs = Array.prototype.slice.call(arguments);
  1015. newArgs.unshift.apply(newArgs, args);
  1016. return fn.apply(this, newArgs);
  1017. };
  1018. };
  1019. /**
  1020. * Copies all the members of a source object to a target object. This method
  1021. * does not work on all browsers for all objects that contain keys such as
  1022. * toString or hasOwnProperty. Use goog.object.extend for this purpose.
  1023. * @param {Object} target Target.
  1024. * @param {Object} source Source.
  1025. */
  1026. goog.mixin = function(target, source) {
  1027. for (var x in source) {
  1028. target[x] = source[x];
  1029. }
  1030. // For IE7 or lower, the for-in-loop does not contain any properties that are
  1031. // not enumerable on the prototype object (for example, isPrototypeOf from
  1032. // Object.prototype) but also it will not include 'replace' on objects that
  1033. // extend String and change 'replace' (not that it is common for anyone to
  1034. // extend anything except Object).
  1035. };
  1036. /**
  1037. * @return {number} An integer value representing the number of milliseconds
  1038. * between midnight, January 1, 1970 and the current time.
  1039. */
  1040. goog.now = Date.now || (function() {
  1041. // Unary plus operator converts its operand to a number which in the case of
  1042. // a date is done by calling getTime().
  1043. return +new Date();
  1044. });
  1045. /**
  1046. * Evals javascript in the global scope. In IE this uses execScript, other
  1047. * browsers use goog.global.eval. If goog.global.eval does not evaluate in the
  1048. * global scope (for example, in Safari), appends a script tag instead.
  1049. * Throws an exception if neither execScript or eval is defined.
  1050. * @param {string} script JavaScript string.
  1051. */
  1052. goog.globalEval = function(script) {
  1053. if (goog.global.execScript) {
  1054. goog.global.execScript(script, 'JavaScript');
  1055. } else if (goog.global.eval) {
  1056. // Test to see if eval works
  1057. if (goog.evalWorksForGlobals_ == null) {
  1058. goog.global.eval('var _et_ = 1;');
  1059. if (typeof goog.global['_et_'] != 'undefined') {
  1060. delete goog.global['_et_'];
  1061. goog.evalWorksForGlobals_ = true;
  1062. } else {
  1063. goog.evalWorksForGlobals_ = false;
  1064. }
  1065. }
  1066. if (goog.evalWorksForGlobals_) {
  1067. goog.global.eval(script);
  1068. } else {
  1069. var doc = goog.global.document;
  1070. var scriptElt = doc.createElement('script');
  1071. scriptElt.type = 'text/javascript';
  1072. scriptElt.defer = false;
  1073. // Note(user): can't use .innerHTML since "t('<test>')" will fail and
  1074. // .text doesn't work in Safari 2. Therefore we append a text node.
  1075. scriptElt.appendChild(doc.createTextNode(script));
  1076. doc.body.appendChild(scriptElt);
  1077. doc.body.removeChild(scriptElt);
  1078. }
  1079. } else {
  1080. throw Error('goog.globalEval not available');
  1081. }
  1082. };
  1083. /**
  1084. * A macro for defining composite types.
  1085. *
  1086. * By assigning goog.typedef to a name, this tells JSCompiler that this is not
  1087. * the name of a class, but rather it's the name of a composite type.
  1088. *
  1089. * For example,
  1090. * /** @type {Array|NodeList} / goog.ArrayLike = goog.typedef;
  1091. * will tell JSCompiler to replace all appearances of goog.ArrayLike in type
  1092. * definitions with the union of Array and NodeList.
  1093. *
  1094. * Does nothing in uncompiled code.
  1095. *
  1096. * @deprecated Please use the {@code @typedef} annotation.
  1097. */
  1098. goog.typedef = true;
  1099. /**
  1100. * Optional map of CSS class names to obfuscated names used with
  1101. * goog.getCssName().
  1102. * @type {Object|undefined}
  1103. * @private
  1104. * @see goog.setCssNameMapping
  1105. */
  1106. goog.cssNameMapping_;
  1107. /**
  1108. * Handles strings that are intended to be used as CSS class names.
  1109. *
  1110. * Without JS Compiler the arguments are simple joined with a hyphen and passed
  1111. * through unaltered.
  1112. *
  1113. * With the JS Compiler the arguments are inlined, e.g:
  1114. * var x = goog.getCssName('foo');
  1115. * var y = goog.getCssName(this.baseClass, 'active');
  1116. * becomes:
  1117. * var x= 'foo';
  1118. * var y = this.baseClass + '-active';
  1119. *
  1120. * If a CSS renaming map is passed to the compiler it will replace symbols in
  1121. * the classname. If one argument is passed it will be processed, if two are
  1122. * passed only the modifier will be processed, as it is assumed the first
  1123. * argument was generated as a result of calling goog.getCssName.
  1124. *
  1125. * Names are split on 'hyphen' and processed in parts such that the following
  1126. * are equivalent:
  1127. * var base = goog.getCssName('baseclass');
  1128. * goog.getCssName(base, 'modifier');
  1129. * goog.getCSsName('baseclass-modifier');
  1130. *
  1131. * If any part does not appear in the renaming map a warning is logged and the
  1132. * original, unobfuscated class name is inlined.
  1133. *
  1134. * @param {string} className The class name.
  1135. * @param {string=} opt_modifier A modifier to be appended to the class name.
  1136. * @return {string} The class name or the concatenation of the class name and
  1137. * the modifier.
  1138. */
  1139. goog.getCssName = function(className, opt_modifier) {
  1140. var cssName = className + (opt_modifier ? '-' + opt_modifier : '');
  1141. return (goog.cssNameMapping_ && (cssName in goog.cssNameMapping_)) ?
  1142. goog.cssNameMapping_[cssName] : cssName;
  1143. };
  1144. /**
  1145. * Sets the map to check when returning a value from goog.getCssName(). Example:
  1146. * <pre>
  1147. * goog.setCssNameMapping({
  1148. * "goog-menu": "a",
  1149. * "goog-menu-disabled": "a-b",
  1150. * "CSS_LOGO": "b",
  1151. * "hidden": "c"
  1152. * });
  1153. *
  1154. * // The following evaluates to: "a a-b".
  1155. * goog.getCssName('goog-menu') + ' ' + goog.getCssName('goog-menu', 'disabled')
  1156. * </pre>
  1157. * When declared as a map of string literals to string literals, the JSCompiler
  1158. * will replace all calls to goog.getCssName() using the supplied map if the
  1159. * --closure_pass flag is set.
  1160. *
  1161. * @param {!Object} mapping A map of strings to strings where keys are possible
  1162. * arguments to goog.getCssName() and values are the corresponding values
  1163. * that should be returned.
  1164. */
  1165. goog.setCssNameMapping = function(mapping) {
  1166. goog.cssNameMapping_ = mapping;
  1167. };
  1168. /**
  1169. * Abstract implementation of goog.getMsg for use with localized messages.
  1170. * @param {string} str Translatable string, places holders in the form {$foo}.
  1171. * @param {Object=} opt_values Map of place holder name to value.
  1172. * @return {string} message with placeholders filled.
  1173. */
  1174. goog.getMsg = function(str, opt_values) {
  1175. var values = opt_values || {};
  1176. for (var key in values) {
  1177. var value = ('' + values[key]).replace(/\$/g, '$$$$');
  1178. str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), value);
  1179. }
  1180. return str;
  1181. };
  1182. /**
  1183. * Exposes an unobfuscated global namespace path for the given object.
  1184. * Note that fields of the exported object *will* be obfuscated,
  1185. * unless they are exported in turn via this function or
  1186. * goog.exportProperty
  1187. *
  1188. * <p>Also handy for making public items that are defined in anonymous
  1189. * closures.
  1190. *
  1191. * ex. goog.exportSymbol('Foo', Foo);
  1192. *
  1193. * ex. goog.exportSymbol('public.path.Foo.staticFunction',
  1194. * Foo.staticFunction);
  1195. * public.path.Foo.staticFunction();
  1196. *
  1197. * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
  1198. * Foo.prototype.myMethod);
  1199. * new public.path.Foo().myMethod();
  1200. *
  1201. * @param {string} publicPath Unobfuscated name to export.
  1202. * @param {*} object Object the name should point to.
  1203. * @param {Object=} opt_objectToExportTo The object to add the path to; default
  1204. * is |goog.global|.
  1205. */
  1206. goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {
  1207. goog.exportPath_(publicPath, object, opt_objectToExportTo);
  1208. };
  1209. /**
  1210. * Exports a property unobfuscated into the object's namespace.
  1211. * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
  1212. * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
  1213. * @param {Object} object Object whose static property is being exported.
  1214. * @param {string} publicName Unobfuscated name to export.
  1215. * @param {*} symbol Object the name should point to.
  1216. */
  1217. goog.exportProperty = function(object, publicName, symbol) {
  1218. object[publicName] = symbol;
  1219. };
  1220. /**
  1221. * Inherit the prototype methods from one constructor into another.
  1222. *
  1223. * Usage:
  1224. * <pre>
  1225. * function ParentClass(a, b) { }
  1226. * ParentClass.prototype.foo = function(a) { }
  1227. *
  1228. * function ChildClass(a, b, c) {
  1229. * ParentClass.call(this, a, b);
  1230. * }
  1231. *
  1232. * goog.inherits(ChildClass, ParentClass);
  1233. *
  1234. * var child = new ChildClass('a', 'b', 'see');
  1235. * child.foo(); // works
  1236. * </pre>
  1237. *
  1238. * In addition, a superclass' implementation of a method can be invoked
  1239. * as follows:
  1240. *
  1241. * <pre>
  1242. * ChildClass.prototype.foo = function(a) {
  1243. * ChildClass.superClass_.foo.call(this, a);
  1244. * // other code
  1245. * };
  1246. * </pre>
  1247. *
  1248. * @param {Function} childCtor Child class.
  1249. * @param {Function} parentCtor Parent class.
  1250. */
  1251. goog.inherits = function(childCtor, parentCtor) {
  1252. /** @constructor */
  1253. function tempCtor() {};
  1254. tempCtor.prototype = parentCtor.prototype;
  1255. childCtor.superClass_ = parentCtor.prototype;
  1256. childCtor.prototype = new tempCtor();
  1257. childCtor.prototype.constructor = childCtor;
  1258. };
  1259. /**
  1260. * Call up to the superclass.
  1261. *
  1262. * If this is called from a constructor, then this calls the superclass
  1263. * contructor with arguments 1-N.
  1264. *
  1265. * If this is called from a prototype method, then you must pass
  1266. * the name of the method as the second argument to this function. If
  1267. * you do not, you will get a runtime error. This calls the superclass'
  1268. * method with arguments 2-N.
  1269. *
  1270. * This function only works if you use goog.inherits to express
  1271. * inheritance relationships between your classes.
  1272. *
  1273. * This function is a compiler primitive. At compile-time, the
  1274. * compiler will do macro expansion to remove a lot of
  1275. * the extra overhead that this function introduces. The compiler
  1276. * will also enforce a lot of the assumptions that this function
  1277. * makes, and treat it as a compiler error if you break them.
  1278. *
  1279. * @param {!Object} me Should always be "this".
  1280. * @param {*=} opt_methodName The method name if calling a super method.
  1281. * @param {...*} var_args The rest of the arguments.
  1282. * @return {*} The return value of the superclass method.
  1283. */
  1284. goog.base = function(me, opt_methodName, var_args) {
  1285. var caller = arguments.callee.caller;
  1286. if (caller.superClass_) {
  1287. // This is a constructor. Call the superclass constructor.
  1288. return caller.superClass_.constructor.apply(
  1289. me, Array.prototype.slice.call(arguments, 1));
  1290. }
  1291. var args = Array.prototype.slice.call(arguments, 2);
  1292. var foundCaller = false;
  1293. for (var ctor = me.constructor;
  1294. ctor; ctor = ctor.superClass_ && ctor.superClass_.constructor) {
  1295. if (ctor.prototype[opt_methodName] === caller) {
  1296. foundCaller = true;
  1297. } else if (foundCaller) {
  1298. return ctor.prototype[opt_methodName].apply(me, args);
  1299. }
  1300. }
  1301. // If we did not find the caller in the prototype chain,
  1302. // then one of two things happened:
  1303. // 1) The caller is an instance method.
  1304. // 2) This method was not called by the right caller.
  1305. if (me[opt_methodName] === caller) {
  1306. return me.constructor.prototype[opt_methodName].apply(me, args);
  1307. } else {
  1308. throw Error(
  1309. 'goog.base called from a method of one name ' +
  1310. 'to a method of a different name');
  1311. }
  1312. };
  1313. /**
  1314. * Allow for aliasing within scope functions. This function exists for
  1315. * uncompiled code - in compiled code the calls will be inlined and the
  1316. * aliases applied. In uncompiled code the function is simply run since the
  1317. * aliases as written are valid JavaScript.
  1318. * @param {function()} fn Function to call. This function can contain aliases
  1319. * to namespaces (e.g. "var dom = goog.dom") or classes
  1320. * (e.g. "var Timer = goog.Timer").
  1321. */
  1322. goog.scope = function(fn) {
  1323. fn.call(goog.global);
  1324. };
  1325. // Copyright 2010 The Closure Library Authors. All Rights Reserved.
  1326. //
  1327. // Licensed under the Apache License, Version 2.0 (the "License");
  1328. // you may not use this file except in compliance with the License.
  1329. // You may obtain a copy of the License at
  1330. //
  1331. // http://www.apache.org/licenses/LICENSE-2.0
  1332. //
  1333. // Unless required by applicable law or agreed to in writing, software
  1334. // distributed under the License is distributed on an "AS-IS" BASIS,
  1335. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1336. // See the License for the specific language governing permissions and
  1337. // limitations under the License.
  1338. //
  1339. // This file has been auto-generated by GenJsDeps, please do not edit.
  1340. goog.addDependency('array/array.js', ['goog.array'], ['goog.asserts']);
  1341. goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.string']);
  1342. goog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay']);
  1343. goog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer']);
  1344. goog.addDependency('async/throttle.js', ['goog.Throttle', 'goog.async.Throttle'], ['goog.Disposable', 'goog.Timer']);
  1345. goog.addDependency('base.js', ['goog'], []);
  1346. goog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color']);
  1347. goog.addDependency('color/color.js', ['goog.color'], ['goog.color.names', 'goog.math']);
  1348. goog.addDependency('color/names.js', ['goog.color.names'], []);
  1349. goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.crypt']);
  1350. goog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], []);
  1351. goog.addDependency('crypt/crypt.js', ['goog.crypt'], []);
  1352. goog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt']);
  1353. goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], []);
  1354. goog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom']);
  1355. goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.style', 'goog.userAgent']);
  1356. goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.string', 'goog.structs', 'goog.structs.Map']);
  1357. goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.debug.Logger']);
  1358. goog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string']);
  1359. goog.addDependency('datasource/fastdatanode.js', ['goog.ds.AbstractFastDataNode', 'goog.ds.FastDataNode', 'goog.ds.FastListNode', 'goog.ds.PrimitiveFastDataNode'], ['goog.ds.DataManager', 'goog.ds.EmptyNodeList', 'goog.string']);
  1360. goog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog.ds.JsPropertyDataSource'], ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState']);
  1361. goog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.Uri', 'goog.dom', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger']);
  1362. goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.net.EventType', 'goog.net.XhrIo']);
  1363. goog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.net.XhrIo', 'goog.string']);
  1364. goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.string']);
  1365. goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration']);
  1366. goog.addDependency('date/relative.js', ['goog.date.relative'], ['goog.i18n.DateTimeFormat']);
  1367. goog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval']);
  1368. goog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger.Level', 'goog.debug.TextFormatter']);
  1369. goog.addDependency('debug/debug.js', ['goog.debug'], ['goog.array', 'goog.string', 'goog.structs.Set']);
  1370. goog.addDependency('debug/debugwindow.js', ['goog.debug.DebugWindow'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.structs.CircularBuffer', 'goog.userAgent']);
  1371. goog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.cssom', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent']);
  1372. goog.addDependency('debug/devcss/devcssrunner.js', ['goog.debug.devCssRunner'], ['goog.debug.DevCss']);
  1373. goog.addDependency('debug/divconsole.js', ['goog.debug.DivConsole'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.style']);
  1374. goog.addDependency('debug/error.js', ['goog.debug.Error'], []);
  1375. goog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler'], ['goog.debug', 'goog.debug.Trace']);
  1376. goog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], []);
  1377. goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.debug', 'goog.debug.ErrorHandler', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils']);
  1378. goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.dom.DomHelper', 'goog.object', 'goog.userAgent']);
  1379. goog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug.RelativeTimeProvider', 'goog.string']);
  1380. goog.addDependency('debug/gcdiagnostics.js', ['goog.debug.GcDiagnostics'], ['goog.debug.Logger', 'goog.debug.Trace', 'goog.userAgent']);
  1381. goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord']);
  1382. goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord']);
  1383. goog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], []);
  1384. goog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], []);
  1385. goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.structs.Map', 'goog.structs.SimplePool']);
  1386. goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose'], []);
  1387. goog.addDependency('dom/a11y.js', ['goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State'], ['goog.dom', 'goog.userAgent']);
  1388. goog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange']);
  1389. goog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent']);
  1390. goog.addDependency('dom/annotate.js', ['goog.dom.annotate'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.string']);
  1391. goog.addDependency('dom/browserrange/abstractrange.js', ['goog.dom.browserrange.AbstractRange'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter', 'goog.string', 'goog.string.StringBuffer', 'goog.userAgent']);
  1392. goog.addDependency('dom/browserrange/browserrange.js', ['goog.dom.browserrange', 'goog.dom.browserrange.Error'], ['goog.dom', 'goog.dom.browserrange.GeckoRange', 'goog.dom.browserrange.IeRange', 'goog.dom.browserrange.OperaRange', 'goog.dom.browserrange.W3cRange', 'goog.dom.browserrange.WebKitRange', 'goog.userAgent']);
  1393. goog.addDependency('dom/browserrange/geckorange.js', ['goog.dom.browserrange.GeckoRange'], ['goog.dom.browserrange.W3cRange']);
  1394. goog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.iter', 'goog.iter.StopIteration', 'goog.string']);
  1395. goog.addDependency('dom/browserrange/operarange.js', ['goog.dom.browserrange.OperaRange'], ['goog.dom.browserrange.W3cRange']);
  1396. goog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRange'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.browserrange.AbstractRange', 'goog.string']);
  1397. goog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent']);
  1398. goog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array']);
  1399. goog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent']);
  1400. goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType'], ['goog.array', 'goog.dom.TagName', 'goog.dom.classes', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']);
  1401. goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.asserts', 'goog.userAgent']);
  1402. goog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent']);
  1403. goog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.structs.Map']);
  1404. goog.addDependency('dom/iframe.js', ['goog.dom.iframe'], ['goog.dom']);
  1405. goog.addDependency('dom/iter.js', ['goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator'], ['goog.iter.Iterator', 'goog.iter.StopIteration']);
  1406. goog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.debug.Logger', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter.StopIteration']);
  1407. goog.addDependency('dom/nodeiterator.js', ['goog.dom.NodeIterator'], ['goog.dom.TagIterator']);
  1408. goog.addDependency('dom/nodeoffset.js', ['goog.dom.NodeOffset'], ['goog.Disposable', 'goog.dom.TagName']);
  1409. goog.addDependency('dom/pattern/abstractpattern.js', ['goog.dom.pattern.AbstractPattern'], ['goog.dom.pattern.MatchType']);
  1410. goog.addDependency('dom/pattern/allchildren.js', ['goog.dom.pattern.AllChildren'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']);
  1411. goog.addDependency('dom/pattern/callback/callback.js', ['goog.dom.pattern.callback'], ['goog.dom', 'goog.dom.TagWalkType', 'goog.iter']);
  1412. goog.addDependency('dom/pattern/callback/counter.js', ['goog.dom.pattern.callback.Counter'], []);
  1413. goog.addDependency('dom/pattern/callback/test.js', ['goog.dom.pattern.callback.Test'], ['goog.iter.StopIteration']);
  1414. goog.addDependency('dom/pattern/childmatches.js', ['goog.dom.pattern.ChildMatches'], ['goog.dom.pattern.AllChildren', 'goog.dom.pattern.MatchType']);
  1415. goog.addDependency('dom/pattern/endtag.js', ['goog.dom.pattern.EndTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag']);
  1416. goog.addDependency('dom/pattern/fulltag.js', ['goog.dom.pattern.FullTag'], ['goog.dom.pattern.MatchType', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Tag']);
  1417. goog.addDependency('dom/pattern/matcher.js', ['goog.dom.pattern.Matcher'], ['goog.dom.TagIterator', 'goog.dom.pattern.MatchType', 'goog.iter']);
  1418. goog.addDependency('dom/pattern/nodetype.js', ['goog.dom.pattern.NodeType'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']);
  1419. goog.addDependency('dom/pattern/pattern.js', ['goog.dom.pattern', 'goog.dom.pattern.MatchType'], []);
  1420. goog.addDependency('dom/pattern/repeat.js', ['goog.dom.pattern.Repeat'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']);
  1421. goog.addDependency('dom/pattern/sequence.js', ['goog.dom.pattern.Sequence'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']);
  1422. goog.addDependency('dom/pattern/starttag.js', ['goog.dom.pattern.StartTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag']);
  1423. goog.addDependency('dom/pattern/tag.js', ['goog.dom.pattern.Tag'], ['goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType', 'goog.object']);
  1424. goog.addDependency('dom/pattern/text.js', ['goog.dom.pattern.Text'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']);
  1425. goog.addDependency('dom/range.js', ['goog.dom.Range'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.ControlRange', 'goog.dom.MultiRange', 'goog.dom.NodeType', 'goog.dom.TextRange', 'goog.userAgent']);
  1426. goog.addDependency('dom/rangeendpoint.js', ['goog.dom.RangeEndpoint'], []);
  1427. goog.addDependency('dom/savedcaretrange.js', ['goog.dom.SavedCaretRange'], ['goog.array', 'goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.string']);
  1428. goog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.debug.Logger']);
  1429. goog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.string', 'goog.userAgent']);
  1430. goog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration']);
  1431. goog.addDependency('dom/tagname.js', ['goog.dom.TagName'], []);
  1432. goog.addDependency('dom/textrange.js', ['goog.dom.TextRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.dom.browserrange', 'goog.string', 'goog.userAgent']);
  1433. goog.addDependency('dom/textrangeiterator.js', ['goog.dom.TextRangeIterator'], ['goog.array', 'goog.dom.NodeType', 'goog.dom.RangeIterator', 'goog.dom.TagName', 'goog.iter.StopIteration']);
  1434. goog.addDependency('dom/viewportsizemonitor.js', ['goog.dom.ViewportSizeMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size', 'goog.userAgent']);
  1435. goog.addDependency('dom/xml.js', ['goog.dom.xml'], ['goog.dom', 'goog.dom.NodeType']);
  1436. goog.addDependency('editor/browserfeature.js', ['goog.editor.BrowserFeature'], ['goog.editor.defines', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']);
  1437. goog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.asserts', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.node', 'goog.editor.range', 'goog.events.BrowserEvent.MouseButton', 'goog.events.EventHandler', 'goog.events.EventType']);
  1438. goog.addDependency('editor/command.js', ['goog.editor.Command'], []);
  1439. goog.addDependency('editor/defines.js', ['goog.editor.defines'], []);
  1440. goog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.array', 'goog.async.Delay', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classes', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent']);
  1441. goog.addDependency('editor/focus.js', ['goog.editor.focus'], ['goog.dom.selection']);
  1442. goog.addDependency('editor/icontent.js', ['goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo'], ['goog.editor.BrowserFeature', 'goog.style', 'goog.userAgent']);
  1443. goog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.range', 'goog.string.Unicode', 'goog.uri.utils']);
  1444. goog.addDependency('editor/node.js', ['goog.editor.node'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode']);
  1445. goog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.debug.Logger', 'goog.editor.Command', 'goog.events.EventTarget', 'goog.functions', 'goog.object', 'goog.reflect']);
  1446. goog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component.EventType', 'goog.ui.editor.Bubble', 'goog.userAgent']);
  1447. goog.addDependency('editor/plugins/abstractdialogplugin.js', ['goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.plugins.AbstractDialogPlugin.EventType'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field.EventType', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.ui.editor.AbstractDialog.EventType']);
  1448. goog.addDependency('editor/plugins/abstracttabhandler.js', ['goog.editor.plugins.AbstractTabHandler'], ['goog.editor.Plugin', 'goog.events.KeyCodes']);
  1449. goog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent']);
  1450. goog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions']);
  1451. goog.addDependency('editor/plugins/emoticons.js', ['goog.editor.plugins.Emoticons'], ['goog.dom.TagName', 'goog.editor.Plugin', 'goog.functions', 'goog.ui.emoji.Emoji']);
  1452. goog.addDependency('editor/plugins/enterhandler.js', ['goog.editor.plugins.EnterHandler'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.Blockquote', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.string', 'goog.userAgent']);
  1453. goog.addDependency('editor/plugins/headerformatter.js', ['goog.editor.plugins.HeaderFormatter'], ['goog.editor.Command', 'goog.editor.Plugin', 'goog.userAgent']);
  1454. goog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.editor.range', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.window']);
  1455. goog.addDependency('editor/plugins/linkdialogplugin.js', ['goog.editor.plugins.LinkDialogPlugin'], ['goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.EventHandler', 'goog.functions', 'goog.ui.editor.AbstractDialog.EventType', 'goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.OkEvent']);
  1456. goog.addDependency('editor/plugins/listtabhandler.js', ['goog.editor.plugins.ListTabHandler'], ['goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractTabHandler']);
  1457. goog.addDependency('editor/plugins/loremipsum.js', ['goog.editor.plugins.LoremIpsum'], ['goog.asserts', 'goog.dom', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions']);
  1458. goog.addDependency('editor/plugins/removeformatting.js', ['goog.editor.plugins.RemoveFormatting'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.string']);
  1459. goog.addDependency('editor/plugins/spacestabhandler.js', ['goog.editor.plugins.SpacesTabHandler'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.plugins.AbstractTabHandler', 'goog.editor.range']);
  1460. goog.addDependency('editor/plugins/tableeditor.js', ['goog.editor.plugins.TableEditor'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.Table', 'goog.editor.node', 'goog.editor.range', 'goog.object']);
  1461. goog.addDependency('editor/plugins/tagonenterhandler.js', ['goog.editor.plugins.TagOnEnterHandler'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.userAgent']);
  1462. goog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.Plugin', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler']);
  1463. goog.addDependency('editor/plugins/undoredomanager.js', ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoManager.EventType'], ['goog.editor.plugins.UndoRedoState', 'goog.events.EventTarget']);
  1464. goog.addDependency('editor/plugins/undoredostate.js', ['goog.editor.plugins.UndoRedoState'], ['goog.events.EventTarget']);
  1465. goog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.style', 'goog.iter']);
  1466. goog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Field.EventType', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.style']);
  1467. goog.addDependency('editor/seamlessfield_test.js', ['goog.editor.seamlessfield_test'], ['goog.dom', 'goog.editor.BrowserFeature', 'goog.editor.SeamlessField', 'goog.events', 'goog.style', 'goog.testing.MockClock', 'goog.testing.MockRange', 'goog.testing.jsunit']);
  1468. goog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.dom', 'goog.dom.NodeType', 'goog.editor.BrowserFeature', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.userAgent']);
  1469. goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.string.Unicode', 'goog.style']);
  1470. goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes']);
  1471. goog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']);
  1472. goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.Event', 'goog.userAgent']);
  1473. goog.addDependency('events/event.js', ['goog.events.Event'], ['goog.Disposable']);
  1474. goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.events.EventWrapper', 'goog.object', 'goog.structs.SimplePool']);
  1475. goog.addDependency('events/events.js', ['goog.events', 'goog.events.EventType'], ['goog.array', 'goog.debug.errorHandlerWeakDep', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventWrapper', 'goog.events.pools', 'goog.object', 'goog.userAgent']);
  1476. goog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.events']);
  1477. goog.addDependency('events/eventwrapper.js', ['goog.events.EventWrapper'], []);
  1478. goog.addDependency('events/focushandler.js', ['goog.events.FocusHandler', 'goog.events.FocusHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.userAgent']);
  1479. goog.addDependency('events/imehandler.js', ['goog.events.ImeHandler', 'goog.events.ImeHandler.Event', 'goog.events.ImeHandler.EventType'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent', 'goog.userAgent.product']);
  1480. goog.addDependency('events/inputhandler.js', ['goog.events.InputHandler', 'goog.events.InputHandler.EventType'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.userAgent']);
  1481. goog.addDependency('events/keycodes.js', ['goog.events.KeyCodes'], ['goog.userAgent']);
  1482. goog.addDependency('events/keyhandler.js', ['goog.events.KeyEvent', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']);
  1483. goog.addDependency('events/keynames.js', ['goog.events.KeyNames'], []);
  1484. goog.addDependency('events/listener.js', ['goog.events.Listener'], []);
  1485. goog.addDependency('events/mousewheelhandler.js', ['goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.math', 'goog.userAgent']);
  1486. goog.addDependency('events/onlinehandler.js', ['goog.events.OnlineHandler', 'goog.events.OnlineHandler.EventType'], ['goog.Timer', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.userAgent']);
  1487. goog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.debug.Logger', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes']);
  1488. goog.addDependency('events/pools.js', ['goog.events.pools'], ['goog.events.BrowserEvent', 'goog.events.Listener', 'goog.structs.SimplePool', 'goog.userAgent.jscript']);
  1489. goog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent']);
  1490. goog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.object', 'goog.string.StringBuffer']);
  1491. goog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.HtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.StringBuffer', 'goog.string.format']);
  1492. goog.addDependency('functions/functions.js', ['goog.functions'], []);
  1493. goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']);
  1494. goog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.Timer', 'goog.array', 'goog.events.Event', 'goog.events.EventTarget', 'goog.object']);
  1495. goog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.events.EventHandler', 'goog.fx.Animation', 'goog.fx.Animation.EventType']);
  1496. goog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation']);
  1497. goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.style']);
  1498. goog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']);
  1499. goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']);
  1500. goog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.userAgent']);
  1501. goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroupEvent'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Coordinate', 'goog.style']);
  1502. goog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style']);
  1503. goog.addDependency('fx/easing.js', ['goog.fx.easing'], []);
  1504. goog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.easing']);
  1505. goog.addDependency('gears/basestore.js', ['goog.gears.BaseStore', 'goog.gears.BaseStore.SchemaType'], ['goog.Disposable']);
  1506. goog.addDependency('gears/database.js', ['goog.gears.Database', 'goog.gears.Database.EventType', 'goog.gears.Database.TransactionEvent'], ['goog.array', 'goog.debug', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.json']);
  1507. goog.addDependency('gears/fakeworkerpool.js', ['goog.gears.FakeWorkerPool'], ['goog.Uri', 'goog.gears', 'goog.gears.WorkerPool', 'goog.net.XmlHttp']);
  1508. goog.addDependency('gears/gears.js', ['goog.gears'], ['goog.string']);
  1509. goog.addDependency('gears/httprequest.js', ['goog.gears.HttpRequest'], ['goog.Timer', 'goog.gears', 'goog.net.XmlHttp']);
  1510. goog.addDependency('gears/loggerclient.js', ['goog.gears.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger']);
  1511. goog.addDependency('gears/loggerserver.js', ['goog.gears.LoggerServer'], ['goog.Disposable', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.gears.Worker.EventType']);
  1512. goog.addDependency('gears/logstore.js', ['goog.gears.LogStore', 'goog.gears.LogStore.Query'], ['goog.async.Delay', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.gears.BaseStore', 'goog.gears.BaseStore.SchemaType', 'goog.json']);
  1513. goog.addDependency('gears/managedresourcestore.js', ['goog.gears.ManagedResourceStore', 'goog.gears.ManagedResourceStore.EventType', 'goog.gears.ManagedResourceStore.UpdateStatus', 'goog.gears.ManagedResourceStoreEvent'], ['goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.string']);
  1514. goog.addDependency('gears/multipartformdata.js', ['goog.gears.MultipartFormData'], ['goog.asserts', 'goog.gears', 'goog.string']);
  1515. goog.addDependency('gears/statustype.js', ['goog.gears.StatusType'], []);
  1516. goog.addDependency('gears/urlcapture.js', ['goog.gears.UrlCapture', 'goog.gears.UrlCapture.Event', 'goog.gears.UrlCapture.EventType'], ['goog.Uri', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears']);
  1517. goog.addDependency('gears/worker.js', ['goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent'], ['goog.events.Event', 'goog.events.EventTarget']);
  1518. goog.addDependency('gears/workerpool.js', ['goog.gears.WorkerPool', 'goog.gears.WorkerPool.Event', 'goog.gears.WorkerPool.EventType'], ['goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.gears.Worker']);
  1519. goog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.graphics.Path', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component']);
  1520. goog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], ['goog.math']);
  1521. goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']);
  1522. goog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics'], ['goog.dom', 'goog.graphics.AbstractGraphics', 'goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math.Size']);
  1523. goog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.graphics.AffineTransform', 'goog.math']);
  1524. goog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement']);
  1525. goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], []);
  1526. goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.functions', 'goog.graphics', 'goog.graphics.ext.coordinates']);
  1527. goog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement']);
  1528. goog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates']);
  1529. goog.addDependency('graphics/ext/graphics.js', ['goog.graphics.ext.Graphics'], ['goog.graphics.ext.Group']);
  1530. goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.graphics.ext.Element']);
  1531. goog.addDependency('graphics/ext/image.js', ['goog.graphics.ext.Image'], ['goog.graphics.ext.Element']);
  1532. goog.addDependency('graphics/ext/path.js', ['goog.graphics.ext.Path'], ['goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math', 'goog.math.Rect']);
  1533. goog.addDependency('graphics/ext/rectangle.js', ['goog.graphics.ext.Rectangle'], ['goog.graphics.ext.StrokeAndFillElement']);
  1534. goog.addDependency('graphics/ext/shape.js', ['goog.graphics.ext.Shape'], ['goog.graphics.ext.Path', 'goog.graphics.ext.StrokeAndFillElement', 'goog.math.Rect']);
  1535. goog.addDependency('graphics/ext/strokeandfillelement.js', ['goog.graphics.ext.StrokeAndFillElement'], ['goog.graphics.ext.Element']);
  1536. goog.addDependency('graphics/fill.js', ['goog.graphics.Fill'], []);
  1537. goog.addDependency('graphics/font.js', ['goog.graphics.Font'], []);
  1538. goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent']);
  1539. goog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element']);
  1540. goog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element']);
  1541. goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.graphics.Fill']);
  1542. goog.addDependency('graphics/path.js', ['goog.graphics.Path', 'goog.graphics.Path.Segment'], ['goog.array', 'goog.math']);
  1543. goog.addDependency('graphics/pathelement.js', ['goog.graphics.PathElement'], ['goog.graphics.StrokeAndFillElement']);
  1544. goog.addDependency('graphics/paths.js', ['goog.graphics.paths'], ['goog.graphics.Path', 'goog.math.Coordinate']);
  1545. goog.addDependency('graphics/rectelement.js', ['goog.graphics.RectElement'], ['goog.graphics.StrokeAndFillElement']);
  1546. goog.addDependency('graphics/solidfill.js', ['goog.graphics.SolidFill'], ['goog.graphics.Fill']);
  1547. goog.addDependency('graphics/stroke.js', ['goog.graphics.Stroke'], []);
  1548. goog.addDependency('graphics/strokeandfillelement.js', ['goog.graphics.StrokeAndFillElement'], ['goog.graphics.Element']);
  1549. goog.addDependency('graphics/svgelement.js', ['goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']);
  1550. goog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math.Size', 'goog.userAgent']);
  1551. goog.addDependency('graphics/textelement.js', ['goog.graphics.TextElement'], ['goog.graphics.StrokeAndFillElement']);
  1552. goog.addDependency('graphics/vmlelement.js', ['goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']);
  1553. goog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom', 'goog.events.EventHandler', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.math.Size', 'goog.string']);
  1554. goog.addDependency('history/event.js', ['goog.history.Event'], ['goog.events.Event', 'goog.history.EventType']);
  1555. goog.addDependency('history/eventtype.js', ['goog.history.EventType'], []);
  1556. goog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.string', 'goog.userAgent']);
  1557. goog.addDependency('history/html5history.js', ['goog.history.Html5History'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType']);
  1558. goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi'], []);
  1559. goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.i18n.bidi', 'goog.string']);
  1560. goog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar']);
  1561. goog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], []);
  1562. goog.addDependency('i18n/currency.js', ['goog.i18n.currency'], []);
  1563. goog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap'], []);
  1564. goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat'], ['goog.asserts', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string']);
  1565. goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols']);
  1566. goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh'], []);
  1567. goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_GB', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_Latn', 'goog.i18n.DateTimePatterns_ha_Latn_GH', 'goog.i18n.DateTimePatterns_ha_Latn_NE', 'goog.i18n.DateTimePatterns_ha_Latn_NG', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_kk_Cyrl', 'goog.i18n.DateTimePatterns_kk_Cyrl_KZ', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_tl_PH', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_Latn', 'goog.i18n.DateTimePatterns_tzm_Latn_MA', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']);
  1568. goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mo', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW'], []);
  1569. goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_aa', 'goog.i18n.DateTimeSymbols_aa_DJ', 'goog.i18n.DateTimeSymbols_aa_ER', 'goog.i18n.DateTimeSymbols_aa_ER_SAAHO', 'goog.i18n.DateTimeSymbols_aa_ET', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_az_AZ', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_bs_BA', 'goog.i18n.DateTimeSymbols_byn', 'goog.i18n.DateTimeSymbols_byn_ER', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_cch', 'goog.i18n.DateTimeSymbols_cch_NG', 'goog.i18n.DateTimeSymbols_cop', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dv', 'goog.i18n.DateTimeSymbols_dv_MV', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_el_POLYTON', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_Dsrt', 'goog.i18n.DateTimeSymbols_en_Dsrt_US', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_Shaw', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gaa', 'goog.i18n.DateTimeSymbols_gaa_GH', 'goog.i18n.DateTimeSymbols_gez', 'goog.i18n.DateTimeSymbols_gez_ER', 'goog.i18n.DateTimeSymbols_gez_ET', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_GB', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_Arab', 'goog.i18n.DateTimeSymbols_ha_Arab_NG', 'goog.i18n.DateTimeSymbols_ha_Arab_SD', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_Latn', 'goog.i18n.DateTimeSymbols_ha_Latn_GH', 'goog.i18n.DateTimeSymbols_ha_Latn_NE', 'goog.i18n.DateTimeSymbols_ha_Latn_NG', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_ha_SD', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_iu', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kaj', 'goog.i18n.DateTimeSymbols_kaj_NG', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kcg', 'goog.i18n.DateTimeSymbols_kcg_NG', 'goog.i18n.DateTimeSymbols_kfo', 'goog.i18n.DateTimeSymbols_kfo_CI', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_kk_Cyrl', 'goog.i18n.DateTimeSymbols_kk_Cyrl_KZ', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_kpe', 'goog.i18n.DateTimeSymbols_kpe_GN', 'goog.i18n.DateTimeSymbols_kpe_LR', 'goog.i18n.DateTimeSymbols_ku', 'goog.i18n.DateTimeSymbols_ku_Arab', 'goog.i18n.DateTimeSymbols_ku_Arab_IQ', 'goog.i18n.DateTimeSymbols_ku_Arab_IR', 'goog.i18n.DateTimeSymbols_ku_Arab_SY', 'goog.i18n.DateTimeSymbols_ku_IQ', 'goog.i18n.DateTimeSymbols_ku_IR', 'goog.i18n.DateTimeSymbols_ku_Latn', 'goog.i18n.DateTimeSymbols_ku_Latn_TR', 'goog.i18n.DateTimeSymbols_ku_SY', 'goog.i18n.DateTimeSymbols_ku_TR', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mn_CN', 'goog.i18n.DateTimeSymbols_mn_Cyrl', 'goog.i18n.DateTimeSymbols_mn_Cyrl_MN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mn_Mong', 'goog.i18n.DateTimeSymbols_mn_Mong_CN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nds', 'goog.i18n.DateTimeSymbols_nds_DE', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nr', 'goog.i18n.DateTimeSymbols_nr_ZA', 'goog.i18n.DateTimeSymbols_nso', 'goog.i18n.DateTimeSymbols_nso_ZA', 'goog.i18n.DateTimeSymbols_ny', 'goog.i18n.DateTimeSymbols_ny_MW', 'goog.i18n.DateTimeSymbols_oc', 'goog.i18n.DateTimeSymbols_oc_FR', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pa_IN', 'goog.i18n.DateTimeSymbols_pa_PK', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_sa', 'goog.i18n.DateTimeSymbols_sa_IN', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_sh_BA', 'goog.i18n.DateTimeSymbols_sh_CS', 'goog.i18n.DateTimeSymbols_sh_YU', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sid', 'goog.i18n.DateTimeSymbols_sid_ET', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sr_BA', 'goog.i18n.DateTimeSymbols_sr_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_YU', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_CS', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_YU', 'goog.i18n.DateTimeSymbols_sr_ME', 'goog.i18n.DateTimeSymbols_sr_RS', 'goog.i18n.DateTimeSymbols_sr_YU', 'goog.i18n.DateTimeSymbols_ss', 'goog.i18n.DateTimeSymbols_ss_SZ', 'goog.i18n.DateTimeSymbols_ss_ZA', 'goog.i18n.DateTimeSymbols_st', 'goog.i18n.DateTimeSymbols_st_LS', 'goog.i18n.DateTimeSymbols_st_ZA', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_syr', 'goog.i18n.DateTimeSymbols_syr_SY', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_Cyrl', 'goog.i18n.DateTimeSymbols_tg_Cyrl_TJ', 'goog.i18n.DateTimeSymbols_tg_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tig', 'goog.i18n.DateTimeSymbols_tig_ER', 'goog.i18n.DateTimeSymbols_tl_PH', 'goog.i18n.DateTimeSymbols_tn', 'goog.i18n.DateTimeSymbols_tn_ZA', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_trv', 'goog.i18n.DateTimeSymbols_trv_TW', 'goog.i18n.DateTimeSymbols_ts', 'goog.i18n.DateTimeSymbols_ts_ZA', 'goog.i18n.DateTimeSymbols_tt', 'goog.i18n.DateTimeSymbols_tt_RU', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_Arab', 'goog.i18n.DateTimeSymbols_ug_Arab_CN', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_uz_AF', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_uz_UZ', 'goog.i18n.DateTimeSymbols_ve', 'goog.i18n.DateTimeSymbols_ve_ZA', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_wal', 'goog.i18n.DateTimeSymbols_wal_ET', 'goog.i18n.DateTimeSymbols_wo', 'goog.i18n.DateTimeSymbols_wo_Latn', 'goog.i18n.DateTimeSymbols_wo_Latn_SN', 'goog.i18n.DateTimeSymbols_wo_SN', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zh_MO', 'goog.i18n.DateTimeSymbols_zh_SG', 'goog.i18n.DateTimeSymbols_zu', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']);
  1570. goog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.structs.InversionMap']);
  1571. goog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], []);
  1572. goog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat'], ['goog.i18n.NumberFormatSymbols', 'goog.i18n.currencyCodeMap']);
  1573. goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_aa', 'goog.i18n.NumberFormatSymbols_aa_DJ', 'goog.i18n.NumberFormatSymbols_aa_ER', 'goog.i18n.NumberFormatSymbols_aa_ER_SAAHO', 'goog.i18n.NumberFormatSymbols_aa_ET', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_AZ', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_BA', 'goog.i18n.NumberFormatSymbols_byn', 'goog.i18n.NumberFormatSymbols_byn_ER', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_cch', 'goog.i18n.NumberFormatSymbols_cch_NG', 'goog.i18n.NumberFormatSymbols_cop', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_dv', 'goog.i18n.NumberFormatSymbols_dv_MV', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_el_POLYTON', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_Dsrt', 'goog.i18n.NumberFormatSymbols_en_Dsrt_US', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_Shaw', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gaa', 'goog.i18n.NumberFormatSymbols_gaa_GH', 'goog.i18n.NumberFormatSymbols_gez', 'goog.i18n.NumberFormatSymbols_gez_ER', 'goog.i18n.NumberFormatSymbols_gez_ET', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_GB', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_Arab', 'goog.i18n.NumberFormatSymbols_ha_Arab_NG', 'goog.i18n.NumberFormatSymbols_ha_Arab_SD', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn', 'goog.i18n.NumberFormatSymbols_ha_Latn_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn_NE', 'goog.i18n.NumberFormatSymbols_ha_Latn_NG', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_ha_SD', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_iu', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kaj', 'goog.i18n.NumberFormatSymbols_kaj_NG', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kcg', 'goog.i18n.NumberFormatSymbols_kcg_NG', 'goog.i18n.NumberFormatSymbols_kfo', 'goog.i18n.NumberFormatSymbols_kfo_CI', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_Cyrl', 'goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_kpe', 'goog.i18n.NumberFormatSymbols_kpe_GN', 'goog.i18n.NumberFormatSymbols_kpe_LR', 'goog.i18n.NumberFormatSymbols_ku', 'goog.i18n.NumberFormatSymbols_ku_Arab', 'goog.i18n.NumberFormatSymbols_ku_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ku_Arab_IR', 'goog.i18n.NumberFormatSymbols_ku_Arab_SY', 'goog.i18n.NumberFormatSymbols_ku_IQ', 'goog.i18n.NumberFormatSymbols_ku_IR', 'goog.i18n.NumberFormatSymbols_ku_Latn', 'goog.i18n.NumberFormatSymbols_ku_Latn_TR', 'goog.i18n.NumberFormatSymbols_ku_SY', 'goog.i18n.NumberFormatSymbols_ku_TR', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_CN', 'goog.i18n.NumberFormatSymbols_mn_Cyrl', 'goog.i18n.NumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mn_Mong', 'goog.i18n.NumberFormatSymbols_mn_Mong_CN', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nds', 'goog.i18n.NumberFormatSymbols_nds_DE', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_nr', 'goog.i18n.NumberFormatSymbols_nr_ZA', 'goog.i18n.NumberFormatSymbols_nso', 'goog.i18n.NumberFormatSymbols_nso_ZA', 'goog.i18n.NumberFormatSymbols_ny', 'goog.i18n.NumberFormatSymbols_ny_MW', 'goog.i18n.NumberFormatSymbols_oc', 'goog.i18n.NumberFormatSymbols_oc_FR', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pa_IN', 'goog.i18n.NumberFormatSymbols_pa_PK', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_sa', 'goog.i18n.NumberFormatSymbols_sa_IN', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_sh_BA', 'goog.i18n.NumberFormatSymbols_sh_CS', 'goog.i18n.NumberFormatSymbols_sh_YU', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sid', 'goog.i18n.NumberFormatSymbols_sid_ET', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_BA', 'goog.i18n.NumberFormatSymbols_sr_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_YU', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_CS', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_YU', 'goog.i18n.NumberFormatSymbols_sr_ME', 'goog.i18n.NumberFormatSymbols_sr_RS', 'goog.i18n.NumberFormatSymbols_sr_YU', 'goog.i18n.NumberFormatSymbols_ss', 'goog.i18n.NumberFormatSymbols_ss_SZ', 'goog.i18n.NumberFormatSymbols_ss_ZA', 'goog.i18n.NumberFormatSymbols_st', 'goog.i18n.NumberFormatSymbols_st_LS', 'goog.i18n.NumberFormatSymbols_st_ZA', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_syr', 'goog.i18n.NumberFormatSymbols_syr_SY', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_Cyrl', 'goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.NumberFormatSymbols_tg_TJ', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tig', 'goog.i18n.NumberFormatSymbols_tig_ER', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tl_PH', 'goog.i18n.NumberFormatSymbols_tn', 'goog.i18n.NumberFormatSymbols_tn_ZA', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_trv', 'goog.i18n.NumberFormatSymbols_trv_TW', 'goog.i18n.NumberFormatSymbols_ts', 'goog.i18n.NumberFormatSymbols_ts_ZA', 'goog.i18n.NumberFormatSymbols_tt', 'goog.i18n.NumberFormatSymbols_tt_RU', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_Arab', 'goog.i18n.NumberFormatSymbols_ug_Arab_CN', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_AF', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_uz_UZ', 'goog.i18n.NumberFormatSymbols_ve', 'goog.i18n.NumberFormatSymbols_ve_ZA', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_wal', 'goog.i18n.NumberFormatSymbols_wal_ET', 'goog.i18n.NumberFormatSymbols_wo', 'goog.i18n.NumberFormatSymbols_wo_Latn', 'goog.i18n.NumberFormatSymbols_wo_Latn_SN', 'goog.i18n.NumberFormatSymbols_wo_SN', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zh_MO', 'goog.i18n.NumberFormatSymbols_zh_SG', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], []);
  1574. goog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.string']);
  1575. goog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], []);
  1576. goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array']);
  1577. goog.addDependency('json/json.js', ['goog.json', 'goog.json.Serializer'], []);
  1578. goog.addDependency('locale/countries.js', ['goog.locale.countries'], []);
  1579. goog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], []);
  1580. goog.addDependency('locale/genericfontnames.js', ['goog.locale.genericFontNames'], []);
  1581. goog.addDependency('locale/genericfontnamesdata.js', ['goog.locale.genericFontNamesData'], ['goog.locale']);
  1582. goog.addDependency('locale/locale.js', ['goog.locale'], ['goog.locale.nativeNameConstants']);
  1583. goog.addDependency('locale/nativenameconstants.js', ['goog.locale.nativeNameConstants'], []);
  1584. goog.addDependency('locale/scriptToLanguages.js', ['goog.locale.scriptToLanguages'], ['goog.locale']);
  1585. goog.addDependency('locale/timezonedetection.js', ['goog.locale.timeZoneDetection'], ['goog.locale', 'goog.locale.TimeZoneFingerprint']);
  1586. goog.addDependency('locale/timezonefingerprint.js', ['goog.locale.TimeZoneFingerprint'], ['goog.locale']);
  1587. goog.addDependency('locale/timezonelist.js', ['goog.locale.TimeZoneList'], ['goog.locale']);
  1588. goog.addDependency('math/bezier.js', ['goog.math.Bezier'], ['goog.math', 'goog.math.Coordinate']);
  1589. goog.addDependency('math/box.js', ['goog.math.Box'], ['goog.math.Coordinate']);
  1590. goog.addDependency('math/coordinate.js', ['goog.math.Coordinate'], []);
  1591. goog.addDependency('math/coordinate3.js', ['goog.math.Coordinate3'], []);
  1592. goog.addDependency('math/integer.js', ['goog.math.Integer'], []);
  1593. goog.addDependency('math/line.js', ['goog.math.Line'], ['goog.math', 'goog.math.Coordinate']);
  1594. goog.addDependency('math/long.js', ['goog.math.Long'], []);
  1595. goog.addDependency('math/math.js', ['goog.math'], ['goog.array']);
  1596. goog.addDependency('math/matrix.js', ['goog.math.Matrix'], ['goog.array', 'goog.math', 'goog.math.Size']);
  1597. goog.addDependency('math/range.js', ['goog.math.Range'], []);
  1598. goog.addDependency('math/rangeset.js', ['goog.math.RangeSet'], ['goog.array', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.math.Range']);
  1599. goog.addDependency('math/rect.js', ['goog.math.Rect'], ['goog.math.Box', 'goog.math.Size']);
  1600. goog.addDependency('math/size.js', ['goog.math.Size'], []);
  1601. goog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate']);
  1602. goog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3']);
  1603. goog.addDependency('memoize/memoize.js', ['goog.memoize'], []);
  1604. goog.addDependency('module/abstractmoduleloader.js', ['goog.module.AbstractModuleLoader'], []);
  1605. goog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Disposable']);
  1606. goog.addDependency('module/basemoduleloader.js', ['goog.module.BaseModuleLoader'], ['goog.Disposable', 'goog.debug.Logger', 'goog.module.AbstractModuleLoader']);
  1607. goog.addDependency('module/loader.js', ['goog.module.Loader'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.object']);
  1608. goog.addDependency('module/module.js', ['goog.module'], ['goog.array', 'goog.module.Loader']);
  1609. goog.addDependency('module/moduleinfo.js', ['goog.module.ModuleInfo'], ['goog.Disposable', 'goog.Timer', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleLoadCallback']);
  1610. goog.addDependency('module/moduleloadcallback.js', ['goog.module.ModuleLoadCallback'], ['goog.debug.errorHandlerWeakDep']);
  1611. goog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.events.EventHandler', 'goog.module.BaseModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.userAgent']);
  1612. goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.FailureType'], ['goog.Disposable', 'goog.array', 'goog.async.Deferred', 'goog.debug.Logger', 'goog.debug.Trace', 'goog.module.AbstractModuleLoader', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback']);
  1613. goog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], []);
  1614. goog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager']);
  1615. goog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager']);
  1616. goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.string', 'goog.structs.CircularBuffer', 'goog.userAgent']);
  1617. goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.userAgent']);
  1618. goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.debug.Logger', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo']);
  1619. goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable', 'goog.debug.Logger']);
  1620. goog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.debug.Logger', 'goog.json']);
  1621. goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest'], ['goog.Timer', 'goog.Uri', 'goog.events.EventHandler', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.tmpnetwork', 'goog.object', 'goog.userAgent']);
  1622. goog.addDependency('net/cookies.js', ['goog.net.cookies'], ['goog.userAgent']);
  1623. goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri.QueryData', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.EventType', 'goog.userAgent']);
  1624. goog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], []);
  1625. goog.addDependency('net/eventtype.js', ['goog.net.EventType'], []);
  1626. goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.xhrMonitor', 'goog.string', 'goog.structs', 'goog.userAgent']);
  1627. goog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.userAgent']);
  1628. goog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent']);
  1629. goog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.Uri', 'goog.dom']);
  1630. goog.addDependency('net/mockiframeio.js', ['goog.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent']);
  1631. goog.addDependency('net/mockxhrlite.js', ['goog.net.MockXhrLite'], ['goog.testing.net.XhrIo']);
  1632. goog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.net.IframeLoadMonitor']);
  1633. goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.debug.Logger']);
  1634. goog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.net.ChannelDebug']);
  1635. goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XmlHttpFactory']);
  1636. goog.addDependency('net/xhrio.js', ['goog.net.XhrIo'], ['goog.Timer', 'goog.debug.Logger', 'goog.debug.errorHandlerWeakDep', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.net.xhrMonitor', 'goog.structs', 'goog.structs.Map']);
  1637. goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs', 'goog.structs.PriorityPool']);
  1638. goog.addDependency('net/xhrlite.js', ['goog.net.XhrLite'], ['goog.net.XhrIo']);
  1639. goog.addDependency('net/xhrlitepool.js', ['goog.net.XhrLitePool'], ['goog.net.XhrIoPool']);
  1640. goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.Disposable', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs.Map']);
  1641. goog.addDependency('net/xhrmonitor.js', ['goog.net.xhrMonitor'], ['goog.array', 'goog.debug.Logger', 'goog.userAgent']);
  1642. goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState'], ['goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory']);
  1643. goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], []);
  1644. goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannel.Role'], ['goog.Disposable', 'goog.Uri', 'goog.dom', 'goog.json', 'goog.net.xpc', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.Transport', 'goog.userAgent']);
  1645. goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.net.xpc', 'goog.net.xpc.Transport']);
  1646. goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.net.xpc', 'goog.net.xpc.Transport', 'goog.userAgent']);
  1647. goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.Transport', 'goog.userAgent']);
  1648. goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.events', 'goog.net.xpc', 'goog.net.xpc.Transport']);
  1649. goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.net.xpc', 'goog.net.xpc.Transport']);
  1650. goog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], []);
  1651. goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.net.xpc']);
  1652. goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc'], ['goog.debug.Logger']);
  1653. goog.addDependency('object/object.js', ['goog.object'], []);
  1654. goog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition']);
  1655. goog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning.Corner']);
  1656. goog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AbstractPosition']);
  1657. goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus']);
  1658. goog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition']);
  1659. goog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow']);
  1660. goog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.dom', 'goog.dom.TagName', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style']);
  1661. goog.addDependency('positioning/viewportclientposition.js', ['goog.positioning.ViewportClientPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning.ClientPosition']);
  1662. goog.addDependency('positioning/viewportposition.js', ['goog.positioning.ViewportPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning.AbstractPosition']);
  1663. goog.addDependency('proto/proto.js', ['goog.proto'], ['goog.proto.Serializer']);
  1664. goog.addDependency('proto/serializer.js', ['goog.proto.Serializer'], ['goog.json.Serializer', 'goog.string']);
  1665. goog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.object', 'goog.proto2.Util']);
  1666. goog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.proto2.Util', 'goog.string']);
  1667. goog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.proto2.Serializer', 'goog.proto2.Util']);
  1668. goog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor', 'goog.proto2.Util', 'goog.string']);
  1669. goog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.proto2.Serializer', 'goog.proto2.Util', 'goog.string']);
  1670. goog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', 'proto2.TestAllTypes']);
  1671. goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.proto2.LazyDeserializer', 'goog.proto2.Util']);
  1672. goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Util']);
  1673. goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], ['goog.proto2.Message']);
  1674. goog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts']);
  1675. goog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array']);
  1676. goog.addDependency('reflect/reflect.js', ['goog.reflect'], []);
  1677. goog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.EventTarget', 'goog.structs.Set']);
  1678. goog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], []);
  1679. goog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], ['goog.userAgent.jscript']);
  1680. goog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string']);
  1681. goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs']);
  1682. goog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], []);
  1683. goog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.structs.Node']);
  1684. goog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array']);
  1685. goog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map']);
  1686. goog.addDependency('structs/map.js', ['goog.structs.Map'], ['goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.object', 'goog.structs']);
  1687. goog.addDependency('structs/node.js', ['goog.structs.Node'], []);
  1688. goog.addDependency('structs/pool.js', ['goog.structs.Pool'], ['goog.Disposable', 'goog.structs.Queue', 'goog.structs.Set']);
  1689. goog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['goog.structs.Pool', 'goog.structs.PriorityQueue']);
  1690. goog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs', 'goog.structs.Heap']);
  1691. goog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate']);
  1692. goog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array']);
  1693. goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Map']);
  1694. goog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable']);
  1695. goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.iter']);
  1696. goog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object']);
  1697. goog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node']);
  1698. goog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs']);
  1699. goog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent']);
  1700. goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.dom', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.userAgent']);
  1701. goog.addDependency('testing/asserts.js', ['goog.testing.JsUnitException', 'goog.testing.asserts'], ['goog.testing.stacktrace']);
  1702. goog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']);
  1703. goog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase']);
  1704. goog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.Step', 'goog.testing.ContinuationTestCase.Test'], ['goog.array', 'goog.events.EventHandler', 'goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']);
  1705. goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classes', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent']);
  1706. goog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.string', 'goog.testing.asserts']);
  1707. goog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock']);
  1708. goog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.testing.dom']);
  1709. goog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array']);
  1710. goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.userAgent']);
  1711. goog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher']);
  1712. goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.debug.DivConsole', 'goog.debug.Logger', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts']);
  1713. goog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock']);
  1714. goog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path.Segment', 'goog.testing.asserts']);
  1715. goog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.testing.TestCase', 'goog.testing.TestRunner']);
  1716. goog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.structs.Map', 'goog.testing.Mock']);
  1717. goog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.array', 'goog.testing.JsUnitException', 'goog.testing.mockmatchers']);
  1718. goog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers']);
  1719. goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.testing.PropertyReplacer']);
  1720. goog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.StrictMock']);
  1721. goog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts']);
  1722. goog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable']);
  1723. goog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock']);
  1724. goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.userAgent']);
  1725. goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.classes', 'goog.events.EventHandler', 'goog.functions', 'goog.string', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.ServerChart.ChartType', 'goog.ui.TableSorter']);
  1726. goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.structs.Map']);
  1727. goog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], []);
  1728. goog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.dom', 'goog.testing.PerformanceTimer']);
  1729. goog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer'], ['goog.array', 'goog.math']);
  1730. goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.userAgent']);
  1731. goog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable']);
  1732. goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], []);
  1733. goog.addDependency('testing/singleton.js', ['goog.testing.singleton'], ['goog.array']);
  1734. goog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], []);
  1735. goog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.testing.Mock']);
  1736. goog.addDependency('testing/style/layoutasserts.js', ['goog.testing.style.layoutasserts'], ['goog.style', 'goog.testing.asserts']);
  1737. goog.addDependency('testing/testcase.js', ['goog.testing.TestCase', 'goog.testing.TestCase.Error', 'goog.testing.TestCase.Order', 'goog.testing.TestCase.Result', 'goog.testing.TestCase.Test'], ['goog.testing.asserts', 'goog.testing.stacktrace']);
  1738. goog.addDependency('testing/testqueue.js', ['goog.testing.TestQueue'], []);
  1739. goog.addDependency('testing/testrunner.js', ['goog.testing.TestRunner'], ['goog.testing.TestCase']);
  1740. goog.addDependency('testing/ui/rendererasserts.js', ['goog.testing.ui.rendererasserts'], ['goog.testing.asserts']);
  1741. goog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHarness'], ['goog.Disposable', 'goog.dom.NodeType', 'goog.testing.asserts']);
  1742. goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.testing.asserts']);
  1743. goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.events.EventTarget']);
  1744. goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.object']);
  1745. goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.asserts', 'goog.debug.Logger', 'goog.object', 'goog.tweak.BaseEntry', 'goog.uri.utils']);
  1746. goog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak']);
  1747. goog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting']);
  1748. goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom.DomHelper', 'goog.object', 'goog.style', 'goog.tweak', 'goog.ui.Zippy']);
  1749. goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.dom', 'goog.dom.classes', 'goog.dom.selection', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu']);
  1750. goog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget']);
  1751. goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.math.Coordinate', 'goog.ui.Tooltip', 'goog.userAgent']);
  1752. goog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.dom', 'goog.events', 'goog.fx.Animation', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent']);
  1753. goog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.KeyCodes', 'goog.ui.ItemEvent', 'goog.ui.MenuBase']);
  1754. goog.addDependency('ui/autocomplete/arraymatcher.js', ['goog.ui.AutoComplete.ArrayMatcher'], ['goog.iter', 'goog.string', 'goog.ui.AutoComplete']);
  1755. goog.addDependency('ui/autocomplete/autocomplete.js', ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.EventType'], ['goog.events', 'goog.events.EventTarget']);
  1756. goog.addDependency('ui/autocomplete/basic.js', ['goog.ui.AutoComplete.Basic'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.ArrayMatcher', 'goog.ui.AutoComplete.InputHandler', 'goog.ui.AutoComplete.Renderer']);
  1757. goog.addDependency('ui/autocomplete/inputhandler.js', ['goog.ui.AutoComplete.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.dom.a11y', 'goog.dom.selection', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.AutoComplete']);
  1758. goog.addDependency('ui/autocomplete/remote.js', ['goog.ui.AutoComplete.Remote'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.InputHandler', 'goog.ui.AutoComplete.RemoteArrayMatcher', 'goog.ui.AutoComplete.Renderer']);
  1759. goog.addDependency('ui/autocomplete/remotearraymatcher.js', ['goog.ui.AutoComplete.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.json', 'goog.net.XhrIo', 'goog.ui.AutoComplete']);
  1760. goog.addDependency('ui/autocomplete/renderer.js', ['goog.ui.AutoComplete.Renderer', 'goog.ui.AutoComplete.Renderer.CustomRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events.EventTarget', 'goog.iter', 'goog.string', 'goog.style', 'goog.ui.AutoComplete', 'goog.ui.IdGenerator', 'goog.userAgent']);
  1761. goog.addDependency('ui/autocomplete/richinputhandler.js', ['goog.ui.AutoComplete.RichInputHandler'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.InputHandler']);
  1762. goog.addDependency('ui/autocomplete/richremote.js', ['goog.ui.AutoComplete.RichRemote'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.Remote', 'goog.ui.AutoComplete.Renderer', 'goog.ui.AutoComplete.RichInputHandler', 'goog.ui.AutoComplete.RichRemoteArrayMatcher']);
  1763. goog.addDependency('ui/autocomplete/richremotearraymatcher.js', ['goog.ui.AutoComplete.RichRemoteArrayMatcher'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.RemoteArrayMatcher']);
  1764. goog.addDependency('ui/basicmenu.js', ['goog.ui.BasicMenu', 'goog.ui.BasicMenu.Item', 'goog.ui.BasicMenu.Separator'], ['goog.array', 'goog.dom', 'goog.dom.a11y', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.AttachableMenu', 'goog.ui.ItemEvent']);
  1765. goog.addDependency('ui/bidiinput.js', ['goog.ui.BidiInput'], ['goog.events', 'goog.events.InputHandler', 'goog.i18n.bidi', 'goog.ui.Component']);
  1766. goog.addDependency('ui/bubble.js', ['goog.ui.Bubble'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AbstractPosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.Popup.AnchoredPosition']);
  1767. goog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.KeyCodes', 'goog.ui.ButtonRenderer', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.NativeButtonRenderer']);
  1768. goog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State', 'goog.ui.Component.State', 'goog.ui.ControlRenderer']);
  1769. goog.addDependency('ui/cccbutton.js', ['goog.ui.CccButton'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.ui.DeprecatedButton', 'goog.userAgent']);
  1770. goog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler']);
  1771. goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.InputHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.uChar', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem']);
  1772. goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.array', 'goog.dom.classes', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler.EventType', 'goog.object', 'goog.ui.Component.EventType', 'goog.ui.Control', 'goog.ui.registry']);
  1773. goog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.ControlContent', 'goog.ui.MenuItem', 'goog.ui.registry']);
  1774. goog.addDependency('ui/colorbutton.js', ['goog.ui.ColorButton'], ['goog.ui.Button', 'goog.ui.ColorButtonRenderer', 'goog.ui.registry']);
  1775. goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.dom.classes', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer']);
  1776. goog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component.EventType', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry']);
  1777. goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.color', 'goog.dom.classes', 'goog.ui.ControlContent', 'goog.ui.MenuButtonRenderer', 'goog.userAgent']);
  1778. goog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array', 'goog.color', 'goog.dom', 'goog.style', 'goog.ui.Palette', 'goog.ui.PaletteRenderer']);
  1779. goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Component.State']);
  1780. goog.addDependency('ui/colorsplitbehavior.js', ['goog.ui.ColorSplitBehavior'], ['goog.ui.ColorButton', 'goog.ui.ColorMenuButton', 'goog.ui.SplitBehavior']);
  1781. goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.debug.Logger', 'goog.dom.classes', 'goog.events', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.registry', 'goog.userAgent']);
  1782. goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator']);
  1783. goog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ContainerRenderer']);
  1784. goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.array', 'goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.string', 'goog.style', 'goog.ui.Separator', 'goog.ui.registry', 'goog.userAgent']);
  1785. goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.Container.EventType']);
  1786. goog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.array', 'goog.dom', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.string', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.decorate', 'goog.ui.registry', 'goog.userAgent']);
  1787. goog.addDependency('ui/controlcontent.js', ['goog.ui.ControlContent'], []);
  1788. goog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.array', 'goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.dom.classes', 'goog.object', 'goog.style', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.userAgent']);
  1789. goog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']);
  1790. goog.addDependency('ui/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], []);
  1791. goog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry']);
  1792. goog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.dom', 'goog.dom.classes', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME']);
  1793. goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.ui.ColorPalette']);
  1794. goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.date', 'goog.date.Date', 'goog.date.Interval', 'goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component']);
  1795. goog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry']);
  1796. goog.addDependency('ui/deprecatedbutton.js', ['goog.ui.DeprecatedButton'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget']);
  1797. goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.Timer', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.a11y', 'goog.dom.classes', 'goog.dom.iframe', 'goog.events', 'goog.events.FocusHandler', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent']);
  1798. goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.math.Size', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry']);
  1799. goog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']);
  1800. goog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.ui.Component']);
  1801. goog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.dom', 'goog.dom.classes', 'goog.events.EventTarget', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType']);
  1802. goog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.ViewportSizeMonitor', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.positioning', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.userAgent']);
  1803. goog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.DefaultToolbar'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.editor.Command', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.ControlContent', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages']);
  1804. goog.addDependency('ui/editor/linkdialog.js', ['goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.BeforeTestLinkEvent', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.classes', 'goog.dom.selection', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.focus', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.InputHandler.EventType', 'goog.string', 'goog.style', 'goog.ui.Button', 'goog.ui.LinkButtonRenderer', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType', 'goog.ui.editor.TabPane', 'goog.ui.editor.messages', 'goog.userAgent', 'goog.window']);
  1805. goog.addDependency('ui/editor/messages.js', ['goog.ui.editor.messages'], []);
  1806. goog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.dom.TagName', 'goog.events.EventHandler', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar']);
  1807. goog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field.EventType', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component.EventType']);
  1808. goog.addDependency('ui/editor/toolbarfactory.js', ['goog.ui.editor.ToolbarFactory'], ['goog.array', 'goog.dom', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Component.State', 'goog.ui.Container.Orientation', 'goog.ui.ControlContent', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarMenuButton', 'goog.ui.ToolbarRenderer', 'goog.ui.ToolbarSelect', 'goog.userAgent']);
  1809. goog.addDependency('ui/emoji/emoji.js', ['goog.ui.emoji.Emoji'], []);
  1810. goog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.Event', 'goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer']);
  1811. goog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.SpriteInfo']);
  1812. goog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.debug.Logger', 'goog.dom', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.TabPane.TabPage', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer']);
  1813. goog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.dom', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker']);
  1814. goog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.ui.emoji.EmojiPaletteRenderer']);
  1815. goog.addDependency('ui/emoji/spriteinfo.js', ['goog.ui.emoji.SpriteInfo'], []);
  1816. goog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.dom', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.string', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu']);
  1817. goog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.ControlContent', 'goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry']);
  1818. goog.addDependency('ui/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer']);
  1819. goog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.dom.classes', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']);
  1820. goog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.style', 'goog.ui.ControlContent', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry']);
  1821. goog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.TagName', 'goog.string', 'goog.string.StringBuffer', 'goog.ui.Component']);
  1822. goog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.dom', 'goog.dom.a11y', 'goog.fx.Animation', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.SolidFill', 'goog.ui.Component', 'goog.ui.GaugeTheme']);
  1823. goog.addDependency('ui/gaugetheme.js', ['goog.ui.GaugeTheme'], ['goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke']);
  1824. goog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.dom', 'goog.events', 'goog.ui.AdvancedTooltip']);
  1825. goog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color', 'goog.color.alpha', 'goog.ui.Component.EventType', 'goog.ui.HsvPalette']);
  1826. goog.addDependency('ui/hsvpalette.js', ['goog.ui.HsvPalette'], ['goog.color', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.userAgent']);
  1827. goog.addDependency('ui/idgenerator.js', ['goog.ui.IdGenerator'], []);
  1828. goog.addDependency('ui/idletimer.js', ['goog.ui.IdleTimer'], ['goog.Timer', 'goog.events', 'goog.events.EventTarget', 'goog.structs.Set', 'goog.ui.ActivityMonitor']);
  1829. goog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.style']);
  1830. goog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']);
  1831. goog.addDependency('ui/imagelessroundedcorner.js', ['goog.ui.AbstractImagelessRoundedCorner', 'goog.ui.CanvasRoundedCorner', 'goog.ui.ImagelessRoundedCorner', 'goog.ui.VmlRoundedCorner'], ['goog.dom.DomHelper', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.VmlGraphics', 'goog.userAgent']);
  1832. goog.addDependency('ui/inputdatepicker.js', ['goog.ui.InputDatePicker'], ['goog.date.DateTime', 'goog.dom', 'goog.i18n.DateTimeParse', 'goog.string', 'goog.ui.Component', 'goog.ui.PopupDatePicker']);
  1833. goog.addDependency('ui/itemevent.js', ['goog.ui.ItemEvent'], ['goog.events.Event']);
  1834. goog.addDependency('ui/keyboardshortcuthandler.js', ['goog.ui.KeyboardShortcutEvent', 'goog.ui.KeyboardShortcutHandler', 'goog.ui.KeyboardShortcutHandler.EventType'], ['goog.Timer', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.events.KeyNames', 'goog.object']);
  1835. goog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.ui.Component']);
  1836. goog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry']);
  1837. goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.debug.Logger', 'goog.events.EventHandler', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.userAgent', 'goog.userAgent.flash']);
  1838. goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']);
  1839. goog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.style', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlRenderer']);
  1840. goog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.Thumbnail'], []);
  1841. goog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer']);
  1842. goog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer']);
  1843. goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']);
  1844. goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']);
  1845. goog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.string', 'goog.ui.Component.Error', 'goog.ui.Component.State', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.Thumbnail', 'goog.ui.media.MediaRenderer']);
  1846. goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator']);
  1847. goog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.ui.Popup']);
  1848. goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler.EventType', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.style', 'goog.ui.Button', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']);
  1849. goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.userAgent']);
  1850. goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.MenuItemRenderer', 'goog.ui.registry']);
  1851. goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.classes', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']);
  1852. goog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State', 'goog.ui.ContainerRenderer', 'goog.ui.Separator']);
  1853. goog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry']);
  1854. goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.classes', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']);
  1855. goog.addDependency('ui/mockactivitymonitor.js', ['goog.ui.MockActivityMonitor'], ['goog.events.EventType', 'goog.ui.ActivityMonitor']);
  1856. goog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.dom.classes', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component.State']);
  1857. goog.addDependency('ui/offlineinstalldialog.js', ['goog.ui.OfflineInstallDialog', 'goog.ui.OfflineInstallDialog.ButtonKeyType', 'goog.ui.OfflineInstallDialog.EnableScreen', 'goog.ui.OfflineInstallDialog.InstallScreen', 'goog.ui.OfflineInstallDialog.InstallingGearsScreen', 'goog.ui.OfflineInstallDialog.ScreenType', 'goog.ui.OfflineInstallDialog.UpgradeScreen', 'goog.ui.OfflineInstallDialogScreen'], ['goog.Disposable', 'goog.dom.classes', 'goog.gears', 'goog.string', 'goog.string.StringBuffer', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.EventType', 'goog.window']);
  1858. goog.addDependency('ui/offlinestatuscard.js', ['goog.ui.OfflineStatusCard', 'goog.ui.OfflineStatusCard.EventType'], ['goog.dom', 'goog.events.EventType', 'goog.gears.StatusType', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.ProgressBar']);
  1859. goog.addDependency('ui/offlinestatuscomponent.js', ['goog.ui.OfflineStatusComponent', 'goog.ui.OfflineStatusComponent.StatusClassNames'], ['goog.dom.classes', 'goog.events.EventType', 'goog.gears.StatusType', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.ui.Component', 'goog.ui.Popup']);
  1860. goog.addDependency('ui/option.js', ['goog.ui.Option'], ['goog.ui.Component.EventType', 'goog.ui.ControlContent', 'goog.ui.MenuItem', 'goog.ui.registry']);
  1861. goog.addDependency('ui/palette.js', ['goog.ui.Palette'], ['goog.array', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Control', 'goog.ui.PaletteRenderer', 'goog.ui.SelectionModel']);
  1862. goog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.a11y', 'goog.dom.classes', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']);
  1863. goog.addDependency('ui/plaintextspellchecker.js', ['goog.ui.PlainTextSpellChecker'], ['goog.Timer', 'goog.dom', 'goog.dom.a11y', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult', 'goog.ui.Component.EventType', 'goog.userAgent']);
  1864. goog.addDependency('ui/popup.js', ['goog.ui.Popup', 'goog.ui.Popup.AbsolutePosition', 'goog.ui.Popup.AnchoredPosition', 'goog.ui.Popup.AnchoredViewPortPosition', 'goog.ui.Popup.ClientPosition', 'goog.ui.Popup.Corner', 'goog.ui.Popup.Overflow', 'goog.ui.Popup.ViewPortClientPosition', 'goog.ui.Popup.ViewPortPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportClientPosition', 'goog.positioning.ViewportPosition', 'goog.style', 'goog.ui.PopupBase']);
  1865. goog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.userAgent']);
  1866. goog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.dom.classes', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType', 'goog.ui.Component', 'goog.ui.Popup']);
  1867. goog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.Popup', 'goog.ui.PopupBase.EventType']);
  1868. goog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events.EventType', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.ViewportClientPosition', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Menu', 'goog.ui.PopupBase', 'goog.userAgent']);
  1869. goog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.RangeModel', 'goog.userAgent']);
  1870. goog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.ui.Component.Error', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.EventType', 'goog.userAgent']);
  1871. goog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component.EventType']);
  1872. goog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.dom.a11y', 'goog.dom.classes', 'goog.events.EventType', 'goog.ui.Component']);
  1873. goog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.dom.classes']);
  1874. goog.addDependency('ui/richtextspellchecker.js', ['goog.ui.RichTextSpellChecker'], ['goog.Timer', 'goog.dom', 'goog.dom.NodeType', 'goog.events', 'goog.events.EventType', 'goog.string.StringBuffer', 'goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult']);
  1875. goog.addDependency('ui/roundedcorners.js', ['goog.ui.RoundedCorners', 'goog.ui.RoundedCorners.Corners'], ['goog.Uri', 'goog.color', 'goog.dom', 'goog.math.Size', 'goog.string', 'goog.style', 'goog.userAgent']);
  1876. goog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.dom', 'goog.dom.classes', 'goog.graphics', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent']);
  1877. goog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.ui.Tab', 'goog.ui.TabBar.Location', 'goog.ui.TabRenderer', 'goog.ui.registry']);
  1878. goog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater'], ['goog.dom', 'goog.dom.classes', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.userAgent']);
  1879. goog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.events.EventType', 'goog.ui.Component.EventType', 'goog.ui.ControlContent', 'goog.ui.MenuButton', 'goog.ui.SelectionModel', 'goog.ui.registry']);
  1880. goog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.ui.Component.EventType', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem']);
  1881. goog.addDependency('ui/selectionmodel.js', ['goog.ui.SelectionModel'], ['goog.array', 'goog.events.EventTarget', 'goog.events.EventType']);
  1882. goog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.dom.a11y', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry']);
  1883. goog.addDependency('ui/serverchart.js', ['goog.ui.ServerChart', 'goog.ui.ServerChart.AxisDisplayType', 'goog.ui.ServerChart.ChartType', 'goog.ui.ServerChart.EncodingType', 'goog.ui.ServerChart.Event', 'goog.ui.ServerChart.LegendPosition', 'goog.ui.ServerChart.MaximumValue', 'goog.ui.ServerChart.MultiAxisAlignment', 'goog.ui.ServerChart.MultiAxisType', 'goog.ui.ServerChart.UriParam', 'goog.ui.ServerChart.UriTooLongEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.events.Event', 'goog.string', 'goog.ui.Component']);
  1884. goog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.ui.SliderBase', 'goog.ui.SliderBase.Orientation']);
  1885. goog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType', 'goog.fx.Animation.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.fx.dom.SlideFrom', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.RangeModel']);
  1886. goog.addDependency('ui/splitbehavior.js', ['goog.ui.SplitBehavior', 'goog.ui.SplitBehavior.DefaultHandlers'], ['goog.Disposable', 'goog.array', 'goog.dispose', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.classes', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.string', 'goog.ui.Button.Side', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.decorate', 'goog.ui.registry']);
  1887. goog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.dom', 'goog.dom.classes', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.userAgent']);
  1888. goog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']);
  1889. goog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.array', 'goog.dom', 'goog.dom.a11y.Role', 'goog.style', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer']);
  1890. goog.addDependency('ui/style/app/primaryactionbuttonrenderer.js', ['goog.ui.style.app.PrimaryActionButtonRenderer'], ['goog.ui.Button', 'goog.ui.registry', 'goog.ui.style.app.ButtonRenderer']);
  1891. goog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.dom', 'goog.dom.classes', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry']);
  1892. goog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.dom.classes', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer']);
  1893. goog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.TabRenderer', 'goog.ui.registry']);
  1894. goog.addDependency('ui/tabbar.js', ['goog.ui.TabBar', 'goog.ui.TabBar.Location'], ['goog.ui.Component.EventType', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.Tab', 'goog.ui.TabBarRenderer', 'goog.ui.registry']);
  1895. goog.addDependency('ui/tabbarrenderer.js', ['goog.ui.TabBarRenderer'], ['goog.dom.a11y.Role', 'goog.object', 'goog.ui.ContainerRenderer']);
  1896. goog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.ui.Component']);
  1897. goog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']);
  1898. goog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.dom.a11y.Role', 'goog.ui.Component.State', 'goog.ui.ControlRenderer']);
  1899. goog.addDependency('ui/textarea.js', ['goog.ui.Textarea'], ['goog.Timer', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent', 'goog.userAgent.product']);
  1900. goog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.ui.Component.State', 'goog.ui.ControlRenderer']);
  1901. goog.addDependency('ui/togglebutton.js', ['goog.ui.ToggleButton'], ['goog.ui.Button', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry']);
  1902. goog.addDependency('ui/toolbar.js', ['goog.ui.Toolbar'], ['goog.ui.Container', 'goog.ui.ToolbarRenderer']);
  1903. goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']);
  1904. goog.addDependency('ui/toolbarbuttonrenderer.js', ['goog.ui.ToolbarButtonRenderer'], ['goog.ui.CustomButtonRenderer']);
  1905. goog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ControlContent', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry']);
  1906. goog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.dom.classes', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer']);
  1907. goog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.ControlContent', 'goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']);
  1908. goog.addDependency('ui/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer']);
  1909. goog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.dom.a11y.Role', 'goog.ui.Container.Orientation', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer']);
  1910. goog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.ControlContent', 'goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']);
  1911. goog.addDependency('ui/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry']);
  1912. goog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.dom.classes', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer']);
  1913. goog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ControlContent', 'goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']);
  1914. goog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase']);
  1915. goog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.asserts', 'goog.dom.a11y', 'goog.events.KeyCodes', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component', 'goog.userAgent']);
  1916. goog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.debug.Logger', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent']);
  1917. goog.addDependency('ui/tree/treenode.js', ['goog.ui.tree.TreeNode'], ['goog.ui.tree.BaseNode']);
  1918. goog.addDependency('ui/tree/typeahead.js', ['goog.ui.tree.TypeAhead', 'goog.ui.tree.TypeAhead.Offset'], ['goog.array', 'goog.events.KeyCodes', 'goog.string', 'goog.structs.Trie']);
  1919. goog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classes', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry']);
  1920. goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.dom.classes', 'goog.ui.MenuItemRenderer']);
  1921. goog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.ui.SliderBase']);
  1922. goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.ZippyEvent'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']);
  1923. goog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex']);
  1924. goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex'], ['goog.asserts', 'goog.string']);
  1925. goog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent']);
  1926. goog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string']);
  1927. goog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent']);
  1928. goog.addDependency('useragent/jscript.js', ['goog.userAgent.jscript'], ['goog.string']);
  1929. goog.addDependency('useragent/picasa.js', ['goog.userAgent.picasa'], ['goog.string', 'goog.userAgent']);
  1930. goog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog.userAgent']);
  1931. goog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.userAgent']);
  1932. goog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.userAgent.product']);
  1933. goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.string']);
  1934. goog.addDependency('window/window.js', ['goog.window'], ['goog.string']);
  1935. goog.addDependency('../../third_party/closure/goog/caja/string/html/htmlparser.js', ['goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlParser.Entities', 'goog.string.html.HtmlSaxHandler'], []);
  1936. goog.addDependency('../../third_party/closure/goog/caja/string/html/htmlsanitizer.js', ['goog.string.html.HtmlSanitizer', 'goog.string.html.HtmlSanitizer.AttributeType', 'goog.string.html.HtmlSanitizer.Attributes', 'goog.string.html.htmlSanitize'], ['goog.string.StringBuffer', 'goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlSaxHandler']);
  1937. goog.addDependency('../../third_party/closure/goog/dojo/dom/query.js', ['goog.dom.query'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.string', 'goog.userAgent']);
  1938. goog.addDependency('../../third_party/closure/goog/jpeg_encoder/jpeg_encoder_basic.js', ['goog.crypt.JpegEncoder'], ['goog.crypt.base64']);
  1939. goog.addDependency('../../third_party/closure/goog/loremipsum/text/loremipsum.js', ['goog.text.LoremIpsum'], ['goog.array', 'goog.math', 'goog.string', 'goog.structs.Map', 'goog.structs.Set']);
  1940. goog.addDependency('../../third_party/closure/goog/mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CancelledError'], ['goog.Timer', 'goog.asserts', 'goog.debug.Error']);
  1941. goog.addDependency('../../third_party/closure/goog/mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.array', 'goog.async.Deferred']);
  1942. /**
  1943. * Base namespace for Skulpt. This is the only symbol that Skulpt adds to the
  1944. * global namespace. Other user accessible symbols are noted and described
  1945. * below.
  1946. */
  1947. var Sk = Sk || {};
  1948. /**
  1949. * Replacable output redirection (called from print, etc).
  1950. */
  1951. Sk.output = function(x) {};
  1952. goog.exportSymbol("Sk.output", Sk.output);
  1953. /**
  1954. * Replacable function to load modules with (called via import, etc.)
  1955. */
  1956. Sk.read = function(x) { throw "Sk.read has not been implemented"; };
  1957. goog.exportSymbol("Sk.read", Sk.read);
  1958. /**
  1959. * Setable to emulate arguments to the script. Should be array of JS strings.
  1960. */
  1961. Sk.sysargv = [];
  1962. goog.exportSymbol("Sk.sysargv", Sk.sysargv);
  1963. /**
  1964. * Setable to emulate PYTHONPATH environment variable (for finding modules).
  1965. * Should be an array of JS strings.
  1966. */
  1967. Sk.syspath = [];
  1968. goog.exportSymbol("Sk.syspath", Sk.syspath);
  1969. Sk.inBrowser = goog.global.document !== undefined;
  1970. /**
  1971. * Internal function used for debug output.
  1972. * @param {...} args
  1973. */
  1974. Sk.debugout = function(args) {};
  1975. goog.exportSymbol("Sk.debugout", Sk.debugout);
  1976. (function() {
  1977. // set up some sane defaults based on availability
  1978. if (goog.global.write !== undefined) Sk.output = goog.global.write;
  1979. else if (goog.global.console !== undefined && goog.global.console.log !== undefined) Sk.output = function (x) {goog.global.console.log(x);};
  1980. else if (goog.global.print !== undefined) Sk.output = goog.global.print;
  1981. if (goog.global.print !== undefined) Sk.debugout = goog.global.print;
  1982. // todo; this should be an async api
  1983. if (goog.global.read !== undefined) Sk.read = goog.global.read;
  1984. }());
  1985. // override for closure to load stuff from the command line.
  1986. if (!Sk.inBrowser)
  1987. {
  1988. goog.writeScriptTag_ = function(src)
  1989. {
  1990. if (!goog.dependencies_.written[src])
  1991. {
  1992. goog.dependencies_.written[src] = true;
  1993. goog.global.eval(goog.global.read("support/closure-library/closure/goog/" + src));
  1994. }
  1995. };
  1996. }
  1997. Sk.$ctorhack = {};
  1998. goog.require("goog.asserts");
  1999. // builtins are supposed to come from the __builtin__ module, but we don't do
  2000. // that yet.
  2001. Sk.builtin = {};
  2002. // todo; these should all be func objects too, otherwise str() of them won't
  2003. // work, etc.
  2004. Sk.builtin.range = function(start, stop, step)
  2005. {
  2006. var ret = [];
  2007. var s = new Sk.builtin.slice(start, stop, step);
  2008. s.sssiter$(0, function(i) { ret.push(i); });
  2009. return new Sk.builtin.list(ret);
  2010. };
  2011. goog.exportSymbol("Sk.builtin.range", Sk.builtin.range);
  2012. Sk.builtin.len = function(item)
  2013. {
  2014. if (item.sq$length)
  2015. return item.sq$length();
  2016. if (item.mp$length)
  2017. return item.mp$length();
  2018. throw new Sk.builtin.TypeError("object of type '" + item.tp$name + "' has no len()");
  2019. };
  2020. goog.exportSymbol("Sk.builtin.len", Sk.builtin.len);
  2021. Sk.builtin.min = function min()
  2022. {
  2023. // todo; throw if no args
  2024. var lowest = arguments[0];
  2025. for (var i = 1; i < arguments.length; ++i)
  2026. {
  2027. if (arguments[i] < lowest)
  2028. lowest = arguments[i];
  2029. }
  2030. return lowest;
  2031. };
  2032. goog.exportSymbol("Sk.builtin.min", Sk.builtin.min);
  2033. Sk.builtin.max = function max()
  2034. {
  2035. // todo; throw if no args
  2036. var highest = arguments[0];
  2037. for (var i = 1; i < arguments.length; ++i)
  2038. {
  2039. if (arguments[i] > highest)
  2040. highest = arguments[i];
  2041. }
  2042. return highest;
  2043. };
  2044. goog.exportSymbol("Sk.builtin.max", Sk.builtin.max);
  2045. Sk.builtin.abs = function abs(x)
  2046. {
  2047. return Math.abs(x);
  2048. };
  2049. goog.exportSymbol("Sk.builtin.abs", Sk.builtin.abs);
  2050. Sk.builtin.ord = function ord(x)
  2051. {
  2052. if (x.constructor !== Sk.builtin.str || x.v.length !== 1)
  2053. {
  2054. throw "ord() expected string of length 1";
  2055. }
  2056. return (x.v).charCodeAt(0);
  2057. };
  2058. goog.exportSymbol("Sk.builtin.ord", Sk.builtin.ord);
  2059. Sk.builtin.chr = function chr(x)
  2060. {
  2061. if (typeof x !== "number")
  2062. {
  2063. throw "TypeError: an integer is required";
  2064. }
  2065. return new Sk.builtin.str(String.fromCharCode(x));
  2066. };
  2067. goog.exportSymbol("Sk.builtin.chr", Sk.builtin.chr);
  2068. Sk.builtin.dir = function dir(x)
  2069. {
  2070. var names = [];
  2071. for (var k in x.constructor.prototype)
  2072. {
  2073. var s;
  2074. if (k.indexOf('$') !== -1)
  2075. s = Sk.builtin.dir.slotNameToRichName(k);
  2076. else if (k.charAt(k.length - 1) !== '_')
  2077. s = k;
  2078. if (s)
  2079. names.push(new Sk.builtin.str(s));
  2080. }
  2081. names.sort(function(a, b) { return (a.v > b.v) - (a.v < b.v); });
  2082. return new Sk.builtin.list(names);
  2083. };
  2084. goog.exportSymbol("Sk.builtin.dir", Sk.builtin.dir);
  2085. Sk.builtin.dir.slotNameToRichName = function(k)
  2086. {
  2087. // todo; map tp$xyz to __xyz__ properly
  2088. return undefined;
  2089. };
  2090. Sk.builtin.repr = function repr(x)
  2091. {
  2092. return Sk.misceval.objectRepr(x);
  2093. };
  2094. goog.exportSymbol("Sk.builtin.repr", Sk.builtin.repr);
  2095. Sk.builtin.open = function open(filename, mode, bufsize)
  2096. {
  2097. if (mode === undefined) mode = "r";
  2098. if (mode !== "r" && mode !== "rb") throw "todo; haven't implemented non-read opens";
  2099. return new Sk.builtin.file(filename, mode, bufsize);
  2100. };
  2101. goog.exportSymbol("Sk.builtin.open", Sk.builtin.open);
  2102. Sk.builtin.isinstance = function(obj, type)
  2103. {
  2104. if (obj.ob$type === type) return true;
  2105. if (type instanceof Sk.builtin.tuple)
  2106. {
  2107. for (var i = 0; i < type.v.length; ++i)
  2108. {
  2109. if (Sk.builtin.isinstance(obj, type.v[i]))
  2110. return true;
  2111. }
  2112. return false;
  2113. }
  2114. var issubclass = function(klass, base)
  2115. {
  2116. if (klass === base) return true;
  2117. if (klass.inst$dict === undefined) return false;
  2118. var bases = klass.inst$dict.mp$subscript(Sk.builtin.type.basesStr_);
  2119. for (var i = 0; i < bases.v.length; ++i)
  2120. {
  2121. if (issubclass(bases.v[i], base))
  2122. return true;
  2123. }
  2124. return false;
  2125. };
  2126. return issubclass(obj.ob$type, type);
  2127. };
  2128. goog.exportSymbol("Sk.builtin.isinstance", Sk.builtin.isinstance);
  2129. Sk.builtin.hashCount = 0;
  2130. Sk.builtin.hash = function hash(value)
  2131. {
  2132. if (value instanceof Object && value.tp$hash !== undefined)
  2133. {
  2134. if (value.$savedHash_) return value.$savedHash_;
  2135. value.$savedHash_ = 'custom ' + value.tp$hash();
  2136. return value.$savedHash_;
  2137. }
  2138. if (value instanceof Object)
  2139. {
  2140. if (value.__id === undefined)
  2141. {
  2142. Sk.builtin.hashCount += 1;
  2143. value.__id = 'object ' + Sk.builtin.hashCount;
  2144. }
  2145. return value.__id;
  2146. }
  2147. return (typeof value) + ' ' + String(value);
  2148. // todo; throw properly for unhashable types
  2149. };
  2150. goog.exportSymbol("Sk.builtin.hash", Sk.builtin.hash);
  2151. Sk.builtin.getattr = function(obj, name, default_)
  2152. {
  2153. // todo; try/catch is pretty awful. redo attr stuff to return undef and
  2154. // throw at an outer scope as necessary rather than calling tp$getattr
  2155. // directly.
  2156. try
  2157. {
  2158. return obj.tp$getattr(name.v, default_);
  2159. }
  2160. catch (e)
  2161. {
  2162. if (e instanceof Sk.builtin.AttributeError)
  2163. return default_;
  2164. throw e;
  2165. }
  2166. };
  2167. goog.exportSymbol("Sk.builtin.getattr", Sk.builtin.getattr);
  2168. /**
  2169. * @constructor
  2170. * @param {...*} args
  2171. */
  2172. Sk.builtin.Exception = function(args)
  2173. {
  2174. var args = Array.prototype.slice.call(arguments);
  2175. // hackage to allow shorter throws
  2176. for (var i = 0; i < args.length; ++i)
  2177. {
  2178. if (typeof args[i] === "string")
  2179. args[i] = new Sk.builtin.str(args[i]);
  2180. }
  2181. this.args = new Sk.builtin.tuple(args);
  2182. };
  2183. Sk.builtin.Exception.prototype.tp$name = "Exception";
  2184. Sk.builtin.Exception.prototype.tp$str = function()
  2185. {
  2186. var ret = "File \"" + this.args.v[1].v + "\", " + "line " + this.args.v[2] + "\n" +
  2187. this.args.v[4].v + "\n";
  2188. for (var i = 0; i < this.args.v[3]; ++i) ret += " ";
  2189. ret += "^\n";
  2190. ret += this.tp$name;
  2191. if (this.args)
  2192. ret += ": " + this.args.v[0].v + "\n";
  2193. return new Sk.builtin.str(ret);
  2194. };
  2195. Sk.builtin.Exception.prototype.toString = function()
  2196. {
  2197. return this.tp$str().v;
  2198. }
  2199. /**
  2200. * @constructor
  2201. * @extends Sk.builtin.Exception
  2202. * @param {...*} args
  2203. */
  2204. Sk.builtin.AssertionError = function(args) { Sk.builtin.Exception.apply(this, arguments); };
  2205. goog.inherits(Sk.builtin.AssertionError, Sk.builtin.Exception);
  2206. Sk.builtin.AssertionError.prototype.tp$name = "AssertionError";
  2207. /**
  2208. * @constructor
  2209. * @extends Sk.builtin.Exception
  2210. * @param {...*} args
  2211. */
  2212. Sk.builtin.AttributeError = function(args) { Sk.builtin.Exception.apply(this, arguments); };
  2213. goog.inherits(Sk.builtin.AttributeError, Sk.builtin.Exception);
  2214. Sk.builtin.AttributeError.prototype.tp$name = "AttributeError";
  2215. /**
  2216. * @constructor
  2217. * @extends Sk.builtin.Exception
  2218. * @param {...*} args
  2219. */
  2220. Sk.builtin.ImportError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2221. goog.inherits(Sk.builtin.ImportError, Sk.builtin.Exception);
  2222. Sk.builtin.ImportError.prototype.tp$name = "ImportError";
  2223. /**
  2224. * @constructor
  2225. * @extends Sk.builtin.Exception
  2226. * @param {...*} args
  2227. */
  2228. Sk.builtin.IndentationError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2229. goog.inherits(Sk.builtin.IndentationError, Sk.builtin.Exception);
  2230. Sk.builtin.IndentationError.prototype.tp$name = "IndentationError";
  2231. /**
  2232. * @constructor
  2233. * @extends Sk.builtin.Exception
  2234. * @param {...*} args
  2235. */
  2236. Sk.builtin.IndexError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2237. goog.inherits(Sk.builtin.IndexError, Sk.builtin.Exception);
  2238. Sk.builtin.IndexError.prototype.tp$name = "IndexError";
  2239. /**
  2240. * @constructor
  2241. * @extends Sk.builtin.Exception
  2242. * @param {...*} args
  2243. */
  2244. Sk.builtin.NameError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2245. goog.inherits(Sk.builtin.NameError, Sk.builtin.Exception);
  2246. Sk.builtin.NameError.prototype.tp$name = "NameError";
  2247. /**
  2248. * @constructor
  2249. * @extends Sk.builtin.Exception
  2250. * @param {...*} args
  2251. */
  2252. Sk.builtin.ParseError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2253. goog.inherits(Sk.builtin.ParseError, Sk.builtin.Exception);
  2254. Sk.builtin.ParseError.prototype.tp$name = "ParseError";
  2255. /**
  2256. * @constructor
  2257. * @extends Sk.builtin.Exception
  2258. * @param {...*} args
  2259. */
  2260. Sk.builtin.SyntaxError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2261. goog.inherits(Sk.builtin.SyntaxError, Sk.builtin.Exception);
  2262. Sk.builtin.SyntaxError.prototype.tp$name = "SyntaxError";
  2263. /**
  2264. * @constructor
  2265. * @extends Sk.builtin.Exception
  2266. * @param {...*} args
  2267. */
  2268. Sk.builtin.TokenError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2269. goog.inherits(Sk.builtin.TokenError, Sk.builtin.Exception);
  2270. Sk.builtin.TokenError.prototype.tp$name = "TokenError";
  2271. /**
  2272. * @constructor
  2273. * @extends Sk.builtin.Exception
  2274. * @param {...*} args
  2275. */
  2276. Sk.builtin.TypeError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2277. goog.inherits(Sk.builtin.TypeError, Sk.builtin.Exception);
  2278. Sk.builtin.TypeError.prototype.tp$name = "TypeError";
  2279. /**
  2280. * @constructor
  2281. * @extends Sk.builtin.Exception
  2282. * @param {...*} args
  2283. */
  2284. Sk.builtin.ValueError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2285. goog.inherits(Sk.builtin.ValueError, Sk.builtin.Exception);
  2286. Sk.builtin.ValueError.prototype.tp$name = "ValueError";
  2287. /**
  2288. * @constructor
  2289. * @extends Sk.builtin.Exception
  2290. * @param {...*} args
  2291. */
  2292. Sk.builtin.ZeroDivisionError = function(args) { Sk.builtin.Exception.apply(this, arguments); }
  2293. goog.inherits(Sk.builtin.ZeroDivisionError, Sk.builtin.Exception);
  2294. Sk.builtin.ZeroDivisionError.prototype.tp$name = "ZeroDivisionError";
  2295. /**
  2296. *
  2297. * @constructor
  2298. *
  2299. * @param {*} name name or object to get type of, if only one arg
  2300. *
  2301. * @param {Array.<Object>=} bases
  2302. *
  2303. * @param {Object=} dict
  2304. *
  2305. *
  2306. * This type represents the type of `type'. *Calling* an instance of
  2307. * this builtin type named "type" creates class objects. The resulting
  2308. * class objects will have various tp$xyz attributes on them that allow
  2309. * for the various operations on that object.
  2310. *
  2311. * calling the type or calling an instance of the type? or both?
  2312. */
  2313. Sk.builtin.type = function(name, bases, dict)
  2314. {
  2315. if (bases === undefined && dict === undefined)
  2316. {
  2317. // 1 arg version of type()
  2318. var obj = name;
  2319. if (obj === true || obj === false) return Sk.builtin.BoolObj.prototype.ob$type;
  2320. if (obj === null) return Sk.builtin.NoneObj.prototype.ob$type;
  2321. if (typeof obj === "number")
  2322. {
  2323. if (Math.floor(obj) === obj)
  2324. return Sk.builtin.IntObj.prototype.ob$type;
  2325. else
  2326. return Sk.builtin.FloatObj.prototype.ob$type;
  2327. }
  2328. return obj.ob$type;
  2329. }
  2330. else
  2331. {
  2332. // type building version of type
  2333. // dict is the result of running the classes code object
  2334. // (basically the dict of functions). those become the prototype
  2335. // object of the class).
  2336. /**
  2337. * @constructor
  2338. */
  2339. var klass = (function(args)
  2340. {
  2341. if (args === Sk.$ctorhack) return this;
  2342. if (!(this instanceof klass)) return new klass(Array.prototype.slice.call(arguments, 0));
  2343. args = args || [];
  2344. goog.asserts.assert(Sk.builtin.dict !== undefined);
  2345. this.inst$dict = new Sk.builtin.dict([]);
  2346. var init = Sk.builtin.type.typeLookup(this.ob$type, "__init__");
  2347. if (init !== undefined)
  2348. {
  2349. // return ignored I guess?
  2350. args.unshift(this);
  2351. Sk.misceval.apply(init, undefined, args);
  2352. }
  2353. return this;
  2354. });
  2355. //print("type(nbd):",name,JSON.stringify(dict, null,2));
  2356. for (var v in dict)
  2357. {
  2358. klass.prototype[v] = dict[v];
  2359. klass[v] = dict[v];
  2360. }
  2361. klass.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  2362. klass.prototype.tp$setattr = Sk.builtin.object.prototype.GenericSetAttr;
  2363. klass.prototype.tp$descr_get = function() { goog.asserts.fail("in type tp$descr_get"); };
  2364. klass.prototype.tp$repr = function()
  2365. {
  2366. // todo; these should probably call tp$getattr directly, and it should return undef if there's none.
  2367. var reprf = Sk.builtin.getattr(this, new Sk.builtin.str("__repr__"), undefined);
  2368. if (reprf !== undefined)
  2369. return Sk.misceval.apply(reprf, undefined, []);
  2370. var mod = dict.__module__;
  2371. var cname = "";
  2372. if (mod) cname = mod.v + ".";
  2373. return new Sk.builtin.str("<" + cname + name + " object>");
  2374. };
  2375. klass.prototype.tp$call = function(args, kw)
  2376. {
  2377. var callf = this.tp$getattr("__call__");
  2378. if (callf)
  2379. return Sk.misceval.apply(callf, kw, args);
  2380. throw new Sk.builtin.TypeError("'" + this.tp$name + "' object is not callable");
  2381. };
  2382. klass.prototype.tp$iter = function()
  2383. {
  2384. var iterf = this.tp$getattr("__iter__");
  2385. if (iterf)
  2386. {
  2387. var ret = Sk.misceval.call(iterf);
  2388. if (ret.tp$getattr("next") === undefined)
  2389. throw new Sk.builtin.TypeError("iter() return non-iterator of type '" + this.tp$name + "'");
  2390. return ret;
  2391. }
  2392. throw new Sk.builtin.TypeError("'" + this.tp$name + "' object is not iterable");
  2393. };
  2394. klass.prototype.tp$iternext = function()
  2395. {
  2396. var iternextf = this.tp$getattr("next");
  2397. goog.asserts.assert(iternextf !== undefined, "iter() should have caught this");
  2398. return Sk.misceval.call(iternextf);
  2399. };
  2400. klass.tp$name = name;
  2401. if (bases)
  2402. {
  2403. //print("building mro for", name);
  2404. //for (var i = 0; i < bases.length; ++i)
  2405. //print("base[" + i + "]=" + bases[i].tp$name);
  2406. klass.inst$dict = new Sk.builtin.dict([]);
  2407. klass.inst$dict.mp$ass_subscript(Sk.builtin.type.basesStr_, new Sk.builtin.tuple(bases));
  2408. var mro = Sk.builtin.type.buildMRO(klass);
  2409. klass.inst$dict.mp$ass_subscript(Sk.builtin.type.mroStr_, mro);
  2410. klass.tp$mro = mro;
  2411. //print("mro result", Sk.builtin.repr(mro).v);
  2412. }
  2413. // because we're not returning a new type() here, we have to manually
  2414. // add all the methods we want from the type class.
  2415. klass.tp$getattr = Sk.builtin.type.prototype.tp$getattr;
  2416. klass.ob$type = Sk.builtin.type;
  2417. klass.prototype.ob$type = klass;
  2418. Sk.builtin.type.makeIntoTypeObj(name, klass);
  2419. return klass;
  2420. }
  2421. };
  2422. /**
  2423. *
  2424. */
  2425. Sk.builtin.type.makeTypeObj = function(name, newedInstanceOfType)
  2426. {
  2427. var t = newedInstanceOfType;
  2428. Sk.builtin.type.makeIntoTypeObj(name, t);
  2429. return newedInstanceOfType;
  2430. };
  2431. Sk.builtin.type.makeIntoTypeObj = function(name, t)
  2432. {
  2433. goog.asserts.assert(name !== undefined);
  2434. goog.asserts.assert(t !== undefined);
  2435. t.ob$type = Sk.builtin.type;
  2436. t.tp$name = name;
  2437. t.tp$repr = function()
  2438. {
  2439. var mod = t.__module__;
  2440. var cname = "";
  2441. if (mod) cname = mod.v + ".";
  2442. return new Sk.builtin.str("<class '" + cname + t.tp$name + "'>");
  2443. };
  2444. t.tp$str = undefined;
  2445. t.tp$getattr = Sk.builtin.type.prototype.tp$getattr;
  2446. t.tp$setattr = Sk.builtin.type.prototype.tp$setattr;
  2447. return t;
  2448. };
  2449. Sk.builtin.type.ob$type = Sk.builtin.type;
  2450. Sk.builtin.type.tp$name = "type";
  2451. Sk.builtin.type.tp$repr = function() { return new Sk.builtin.str("<type 'type'>"); };
  2452. //Sk.builtin.type.prototype.tp$descr_get = function() { print("in type descr_get"); };
  2453. //Sk.builtin.type.prototype.tp$name = "type";
  2454. // basically the same as GenericGetAttr except looks in the proto instead
  2455. Sk.builtin.type.prototype.tp$getattr = function(name)
  2456. {
  2457. var tp = this;
  2458. var descr = Sk.builtin.type.typeLookup(tp, name);
  2459. var f;
  2460. //print("type.tpgetattr descr", descr, descr.tp$name, descr.func_code, name);
  2461. if (descr !== undefined && descr.ob$type !== undefined)
  2462. {
  2463. f = descr.ob$type.tp$descr_get;
  2464. // todo;if (f && descr.tp$descr_set) // is a data descriptor if it has a set
  2465. // return f.call(descr, this, this.ob$type);
  2466. }
  2467. if (this.inst$dict)
  2468. {
  2469. //print("hi");
  2470. var res = this.inst$dict.mp$subscript(new Sk.builtin.str(name));
  2471. //print(res);
  2472. if (res !== undefined)
  2473. return res;
  2474. }
  2475. if (f)
  2476. {
  2477. // non-data descriptor
  2478. return f.call(descr, null, tp);
  2479. }
  2480. if (descr)
  2481. {
  2482. return descr;
  2483. }
  2484. throw new Sk.builtin.AttributeError("type object '" + this.tp$name + "' has no attribute '" + name + "'");
  2485. };
  2486. Sk.builtin.type.typeLookup = function(type, name)
  2487. {
  2488. var mro = type.tp$mro;
  2489. // todo; probably should fix this, used for builtin types to get stuff
  2490. // from prototype
  2491. if (!mro)
  2492. return type.prototype[name];
  2493. for (var i = 0; i < mro.v.length; ++i)
  2494. {
  2495. var base = mro.v[i];
  2496. if (base.hasOwnProperty(name))
  2497. return base[name];
  2498. var res = base.inst$dict.mp$subscript(new Sk.builtin.str(name));
  2499. if (res !== undefined)
  2500. return res;
  2501. }
  2502. return undefined;
  2503. };
  2504. Sk.builtin.type.mroMerge_ = function(seqs)
  2505. {
  2506. /*
  2507. var tmp = [];
  2508. for (var i = 0; i < seqs.length; ++i)
  2509. {
  2510. tmp.push(new Sk.builtin.list(seqs[i]));
  2511. }
  2512. print(Sk.builtin.repr(new Sk.builtin.list(tmp)).v);
  2513. */
  2514. var res = [];
  2515. for (;;)
  2516. {
  2517. for (var i = 0; i < seqs.length; ++i)
  2518. {
  2519. var seq = seqs[i];
  2520. if (seq.length !== 0)
  2521. break;
  2522. }
  2523. if (i === seqs.length) // all empty
  2524. return res;
  2525. var cands = [];
  2526. for (var i = 0; i < seqs.length; ++i)
  2527. {
  2528. var seq = seqs[i];
  2529. //print("XXX", Sk.builtin.repr(new Sk.builtin.list(seq)).v);
  2530. if (seq.length !== 0)
  2531. {
  2532. var cand = seq[0];
  2533. //print("CAND", Sk.builtin.repr(cand).v);
  2534. OUTER:
  2535. for (var j = 0; j < seqs.length; ++j)
  2536. {
  2537. var sseq = seqs[j];
  2538. for (var k = 1; k < sseq.length; ++k)
  2539. if (sseq[k] === cand)
  2540. break OUTER;
  2541. }
  2542. // cand is not in any sequences' tail -> constraint-free
  2543. if (j === seqs.length)
  2544. cands.push(cand);
  2545. }
  2546. }
  2547. if (cands.length === 0)
  2548. throw new TypeError("Inconsistent precedences in type hierarchy");
  2549. var next = cands[0];
  2550. // append next to result and remove from sequences
  2551. res.push(next);
  2552. for (var i = 0; i < seqs.length; ++i)
  2553. {
  2554. var seq = seqs[i];
  2555. if (seq.length > 0 && seq[0] === next)
  2556. seq.splice(0, 1);
  2557. }
  2558. }
  2559. };
  2560. Sk.builtin.type.buildMRO_ = function(klass)
  2561. {
  2562. // MERGE(klass + mro(bases) + bases)
  2563. var all = [ [klass] ];
  2564. //print("buildMRO for", klass.tp$name);
  2565. var kbases = klass.inst$dict.mp$subscript(Sk.builtin.type.basesStr_);
  2566. for (var i = 0; i < kbases.v.length; ++i)
  2567. all.push(Sk.builtin.type.buildMRO_(kbases.v[i]));
  2568. var bases = [];
  2569. for (var i = 0; i < kbases.v.length; ++i)
  2570. bases.push(kbases.v[i]);
  2571. all.push(bases);
  2572. return Sk.builtin.type.mroMerge_(all);
  2573. };
  2574. /*
  2575. * C3 MRO (aka CPL) linearization. Figures out which order to search through
  2576. * base classes to determine what should override what. C3 does the "right
  2577. * thing", and it's what Python has used since 2.3.
  2578. *
  2579. * Kind of complicated to explain, but not really that complicated in
  2580. * implementation. Explanations:
  2581. *
  2582. * http://people.csail.mit.edu/jrb/goo/manual.43/goomanual_55.html
  2583. * http://www.python.org/download/releases/2.3/mro/
  2584. * http://192.220.96.201/dylan/linearization-oopsla96.html
  2585. *
  2586. * This implementation is based on a post by Samuele Pedroni on python-dev
  2587. * (http://mail.python.org/pipermail/python-dev/2002-October/029176.html) when
  2588. * discussing its addition to Python.
  2589. */
  2590. Sk.builtin.type.buildMRO = function(klass)
  2591. {
  2592. return new Sk.builtin.tuple(Sk.builtin.type.buildMRO_(klass));
  2593. };
  2594. /**
  2595. * @constructor
  2596. *
  2597. * @param {Function} code the javascript implementation of this function
  2598. * @param {Object=} globals the globals where this function was defined.
  2599. * Can be undefined (which will be stored as null) for builtins. (is
  2600. * that ok?)
  2601. * @param {Object=} closure dict of free variables
  2602. * @param {Object=} closure2 another dict of free variables that will be
  2603. * merged into 'closure'. there's 2 to simplify generated code (one is $free,
  2604. * the other is $cell)
  2605. *
  2606. * closure is the cell variables from the parent scope that we need to close
  2607. * over. closure2 is the free variables in the parent scope that we also might
  2608. * need to access.
  2609. *
  2610. * NOTE: co_varnames and co_name are defined by compiled code only, so we have
  2611. * to access them via dict-style lookup for closure.
  2612. *
  2613. */
  2614. Sk.builtin.func = function(code, globals, closure, closure2)
  2615. {
  2616. this.func_code = code;
  2617. this.func_globals = globals || null;
  2618. if (closure2 !== undefined)
  2619. {
  2620. // todo; confirm that modification here can't cause problems
  2621. for (var k in closure2)
  2622. closure[k] = closure2[k];
  2623. }
  2624. this.func_closure = closure;
  2625. return this;
  2626. };
  2627. Sk.builtin.func.prototype.tp$name = "function";
  2628. Sk.builtin.func.prototype.tp$descr_get = function(obj, objtype)
  2629. {
  2630. goog.asserts.assert(obj !== undefined && objtype !== undefined)
  2631. if (obj == null) return this;
  2632. return new Sk.builtin.method(this, obj);
  2633. };
  2634. Sk.builtin.func.prototype.tp$call = function(args, kw)
  2635. {
  2636. // note: functions expect 'this' to be globals to avoid having to
  2637. // slice/unshift onto the main args
  2638. if (this.func_closure)
  2639. {
  2640. // todo; OK to modify?
  2641. args.push(this.func_closure);
  2642. }
  2643. if (kw)
  2644. {
  2645. // bind the kw args
  2646. var kwlen = kw.length;
  2647. for (var i = 0; i < kwlen; i += 2)
  2648. {
  2649. // todo; make this a dict mapping name to offset
  2650. var varnames = this.func_code['co_varnames'];
  2651. var numvarnames = varnames.length;
  2652. for (var j = 0; j < numvarnames; ++j)
  2653. {
  2654. if (kw[i] === varnames[j])
  2655. break;
  2656. }
  2657. args[j] = kw[i+1];
  2658. }
  2659. }
  2660. return this.func_code.apply(this.func_globals, args);
  2661. };
  2662. Sk.builtin.func.prototype.ob$type = Sk.builtin.type.makeTypeObj('function', new Sk.builtin.func(null, null));
  2663. Sk.builtin.func.prototype.tp$repr = function()
  2664. {
  2665. var name = (this.func_code && this.func_code['co_name'] && this.func_code['co_name'].v) || '<native JS>';
  2666. return new Sk.builtin.str("<function " + name + ">");
  2667. };
  2668. /**
  2669. * @constructor
  2670. *
  2671. * co_varnames and co_name come from generated code, must access as dict.
  2672. */
  2673. Sk.builtin.method = function(func, self)
  2674. {
  2675. this.im_func = func;
  2676. this.im_self = self;
  2677. //print("constructing method", this.im_func.tp$name, this.im_self.tp$name);
  2678. };
  2679. Sk.builtin.method.prototype.tp$call = function(args, kw)
  2680. {
  2681. goog.asserts.assert(this.im_self, "should just be a function, not a method since there's no self?");
  2682. goog.asserts.assert(this.im_func instanceof Sk.builtin.func);
  2683. //print("calling method");
  2684. // todo; modification OK?
  2685. args.unshift(this.im_self);
  2686. if (kw)
  2687. {
  2688. // bind the kw args
  2689. var kwlen = kw.length;
  2690. for (var i = 0; i < kwlen; i += 2)
  2691. {
  2692. // todo; make this a dict mapping name to offset
  2693. var varnames = this.im_func.func_code['co_varnames'];
  2694. var numvarnames = varnames.length;
  2695. for (var j = 0; j < numvarnames; ++j)
  2696. {
  2697. if (kw[i] === varnames[j])
  2698. break;
  2699. }
  2700. args[j] = kw[i+1];
  2701. }
  2702. }
  2703. // note: functions expect globals to be their 'this'. see compile.js and function.js also
  2704. return this.im_func.func_code.apply(this.im_func.func_globals, args);
  2705. };
  2706. Sk.builtin.method.prototype.tp$repr = function()
  2707. {
  2708. return new Sk.builtin.str("<bound method " + this.im_self.ob$type.tp$name + "." + this.im_func.func_code['co_name'].v
  2709. + " of " + this.im_self.tp$repr().v + ">");
  2710. };
  2711. /**
  2712. * @constructor
  2713. */
  2714. Sk.builtin.object = function()
  2715. {
  2716. if (!(this instanceof Sk.builtin.object)) return new Sk.builtin.object();
  2717. this.inst$dict = new Sk.builtin.dict([]);
  2718. return this;
  2719. };
  2720. Sk.builtin.object.prototype.GenericGetAttr = function(name)
  2721. {
  2722. goog.asserts.assert(typeof name === "string");
  2723. var tp = this.ob$type;
  2724. goog.asserts.assert(tp !== undefined, "object has no ob$type!");
  2725. //print("getattr", tp.tp$name, name);
  2726. var descr = Sk.builtin.type.typeLookup(tp, name);
  2727. // otherwise, look in the type for a descr
  2728. var f;
  2729. //print("descr", descr);
  2730. if (descr !== undefined && descr.ob$type !== undefined)
  2731. {
  2732. f = descr.ob$type.tp$descr_get;
  2733. // todo;
  2734. //if (f && descr.tp$descr_set) // is a data descriptor if it has a set
  2735. //return f.call(descr, this, this.ob$type);
  2736. }
  2737. // todo; assert? force?
  2738. //print("getattr", name, this.inst$dict.tp$repr().v);
  2739. if (this.inst$dict)
  2740. {
  2741. var res;
  2742. if (this.inst$dict.mp$subscript)
  2743. res = this.inst$dict.mp$subscript(new Sk.builtin.str(name));
  2744. else if (typeof this.inst$dict === "object") // todo; definitely the wrong place for this. other custom tp$getattr won't work on object
  2745. res = this.inst$dict[name];
  2746. if (res !== undefined)
  2747. return res;
  2748. }
  2749. if (f)
  2750. {
  2751. // non-data descriptor
  2752. return f.call(descr, this, this.ob$type);
  2753. }
  2754. if (descr)
  2755. {
  2756. return descr;
  2757. }
  2758. throw new Sk.builtin.AttributeError("'" + this.tp$name + "' object has no attribute '" + name + "'");
  2759. };
  2760. Sk.builtin.object.prototype.GenericSetAttr = function(name, value)
  2761. {
  2762. goog.asserts.assert(typeof name === "string");
  2763. // todo; lots o' stuff
  2764. if (this.inst$dict.mp$ass_subscript)
  2765. this.inst$dict.mp$ass_subscript(new Sk.builtin.str(name), value);
  2766. else if (typeof this.inst$dict === "object")
  2767. this.inst$dict[name] = value;
  2768. };
  2769. Sk.builtin.object.prototype.HashNotImplemented = function()
  2770. {
  2771. throw new Sk.builtin.TypeError("unhashable type: '" + this.tp$name + "'");
  2772. };
  2773. Sk.builtin.object.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  2774. Sk.builtin.object.prototype.tp$setattr = Sk.builtin.object.prototype.GenericSetAttr;
  2775. Sk.builtin.type.makeIntoTypeObj('object', Sk.builtin.object);
  2776. Sk.builtin.BoolObj = function() {};
  2777. Sk.builtin.BoolObj.prototype.ob$type = Sk.builtin.type.makeTypeObj('Bool', new Sk.builtin.BoolObj());
  2778. Sk.builtin.IntObj = function() {};
  2779. Sk.builtin.IntObj.prototype.ob$type = Sk.builtin.type.makeTypeObj('int', new Sk.builtin.IntObj());
  2780. Sk.builtin.FloatObj = function() {};
  2781. Sk.builtin.FloatObj.prototype.ob$type = Sk.builtin.type.makeTypeObj('float', new Sk.builtin.FloatObj());
  2782. Sk.builtin.NoneObj = function() {};
  2783. Sk.builtin.NoneObj.prototype.ob$type = Sk.builtin.type.makeTypeObj('None', new Sk.builtin.NoneObj());
  2784. Sk.misceval = {};
  2785. Sk.misceval.isIndex = function(o)
  2786. {
  2787. return o === null || typeof o === "number" || o.constructor === Sk.builtin.lng || o.tp$index;
  2788. };
  2789. Sk.misceval.asIndex = function(o)
  2790. {
  2791. if (!Sk.misceval.isIndex(o)) return undefined;
  2792. if (o === null) return undefined;
  2793. if (typeof o === "number") return o;
  2794. goog.asserts.fail("todo;");
  2795. };
  2796. /**
  2797. * return u[v:w]
  2798. */
  2799. Sk.misceval.applySlice = function(u, v, w)
  2800. {
  2801. if (u.sq$slice && Sk.misceval.isIndex(v) && Sk.misceval.isIndex(w))
  2802. {
  2803. var ilow = Sk.misceval.asIndex(v);
  2804. if (ilow === undefined) ilow = 0;
  2805. var ihigh = Sk.misceval.asIndex(w);
  2806. if (ihigh === undefined) ihigh = 1e100;
  2807. return Sk.abstr.sequenceGetSlice(u, ilow, ihigh);
  2808. }
  2809. return Sk.abstr.objectGetItem(u, new Sk.builtin.slice(v, w, null));
  2810. };
  2811. /**
  2812. * u[v:w] = x
  2813. */
  2814. Sk.misceval.assignSlice = function(u, v, w, x)
  2815. {
  2816. if (u.sq$ass_slice && Sk.misceval.isIndex(v) && Sk.misceval.isIndex(w))
  2817. {
  2818. var ilow = Sk.misceval.asIndex(v) || 0;
  2819. var ihigh = Sk.misceval.asIndex(w) || 1e100;
  2820. if (x === null)
  2821. Sk.abstr.sequenceDelSlice(u, ilow, ihigh);
  2822. else
  2823. Sk.abstr.sequenceSetSlice(u, ilow, ihigh, x);
  2824. }
  2825. else
  2826. {
  2827. var slice = new Sk.builtin.slice(v, w);
  2828. if (x === null)
  2829. return Sk.abstr.objectDelItem(u, slice);
  2830. else
  2831. return Sk.abstr.objectSetItem(u, slice, x);
  2832. }
  2833. };
  2834. /**
  2835. * for reversed comparison: Eq -> NotEq, etc.
  2836. */
  2837. Sk.misceval.swappedOp_ = {
  2838. 'Eq': 'NotEq',
  2839. 'NotEq': 'Eq',
  2840. 'Lt': 'Gt',
  2841. 'LtE': 'GtE',
  2842. 'Gt': 'Lt',
  2843. 'GtE': 'LtE',
  2844. 'Is': 'IsNot',
  2845. 'IsNot': 'Is',
  2846. 'In_': 'NotIn',
  2847. 'NotIn': 'In_'
  2848. };
  2849. Sk.misceval.richCompareBool = function(v, w, op)
  2850. {
  2851. if (op === 'Is')
  2852. return v === w;
  2853. if (op === 'IsNot')
  2854. return v !== w;
  2855. if (v === w)
  2856. {
  2857. if (op === 'Eq')
  2858. return true;
  2859. else if (op === 'NotEq')
  2860. return false;
  2861. }
  2862. if (v instanceof Sk.builtin.str && w instanceof Sk.builtin.str)
  2863. {
  2864. if (op === 'Eq')
  2865. return v === w;
  2866. else if (op === 'NotEq')
  2867. return v !== w;
  2868. }
  2869. if (typeof v === "number" && typeof w === "number")
  2870. {
  2871. switch (op)
  2872. {
  2873. case 'Lt': return v < w;
  2874. case 'LtE': return v <= w;
  2875. case 'Gt': return v > w;
  2876. case 'GtE': return v >= w;
  2877. case 'NotEq': return v !== w;
  2878. case 'Eq': return v === w;
  2879. default: throw "assert";
  2880. }
  2881. }
  2882. else
  2883. {
  2884. if (op === "In") return Sk.abstr.sequenceContains(w, v);
  2885. if (op === "NotIn") return !Sk.abstr.sequenceContains(w, v);
  2886. if (v.tp$richcompare)
  2887. return v.tp$richcompare(w, op);
  2888. else if (w.tp$richcompare)
  2889. return w.tp$richcompare(v, Sk.misceval.swappedOp_[op]);
  2890. else
  2891. {
  2892. // depending on the op, try left:op:right, and if not, then
  2893. // right:reversed-top:left
  2894. // yeah, a macro or 3 would be nice...
  2895. if (op === 'Eq')
  2896. if (v.__eq__)
  2897. return Sk.misceval.call(v.__eq__, undefined, v, w);
  2898. else if (w.__ne__)
  2899. return Sk.misceval.call(w.__ne__, undefined, w, v);
  2900. else if (op === 'NotEq')
  2901. if (v.__ne__)
  2902. return Sk.misceval.call(v.__ne__, undefined, v, w);
  2903. else if (w.__eq__)
  2904. return Sk.misceval.call(w.__eq__, undefined, w, v);
  2905. else if (op === 'Gt')
  2906. if (v.__gt__)
  2907. return Sk.misceval.call(v.__gt__, undefined, v, w);
  2908. else if (w.__lt__)
  2909. return Sk.misceval.call(w.__lt__, undefined, w, v);
  2910. else if (op === 'Lt')
  2911. if (v.__lt__)
  2912. return Sk.misceval.call(v.__lt__, undefined, v, w);
  2913. else if (w.__gt__)
  2914. return Sk.misceval.call(w.__gt__, undefined, w, v);
  2915. else if (op === 'GtE')
  2916. if (v.__ge__)
  2917. return Sk.misceval.call(v.__ge__, undefined, v, w);
  2918. else if (w.__le__)
  2919. return Sk.misceval.call(w.__le__, undefined, w, v);
  2920. else if (op === 'LtE')
  2921. if (v.__le__)
  2922. return Sk.misceval.call(v.__le__, undefined, v, w);
  2923. else if (w.__ge__)
  2924. return Sk.misceval.call(w.__ge__, undefined, w, v);
  2925. // if those aren't defined, fallback on the __cmp__ method if it
  2926. // exists
  2927. if (v.__cmp__)
  2928. {
  2929. var ret = Sk.misceval.call(v.__cmp__, undefined, v, w);
  2930. if (op === 'Eq') return ret === 0;
  2931. else if (op === 'NotEq') return ret !== 0;
  2932. else if (op === 'Lt') return ret < 0;
  2933. else if (op === 'Gt') return ret > 0;
  2934. else if (op === 'LtE') return ret <= 0;
  2935. else if (op === 'GtE') return ret >= 0;
  2936. }
  2937. else if (w.__cmp__)
  2938. {
  2939. // note, flipped on return value and call
  2940. var ret = Sk.misceval.call(w.__cmp__, undefined, w, v);
  2941. if (op === 'Eq') return ret === 0;
  2942. else if (op === 'NotEq') return ret !== 0;
  2943. else if (op === 'Lt') return ret > 0;
  2944. else if (op === 'Gt') return ret < 0;
  2945. else if (op === 'LtE') return ret >= 0;
  2946. else if (op === 'GtE') return ret <= 0;
  2947. }
  2948. }
  2949. }
  2950. // todo; some defaults, mostly to handle diff types -> false. are these ok?
  2951. if (op === 'Eq') return v === w;
  2952. if (op === 'NotEq') return v !== w;
  2953. throw new Sk.builtin.ValueError("don't know how to compare '" + v.tp$name + "' and '" + w.tp$name + "'");
  2954. };
  2955. Sk.misceval.objectRepr = function(v)
  2956. {
  2957. goog.asserts.assert(v !== undefined, "trying to repr undefined");
  2958. if (v === null)
  2959. return new Sk.builtin.str("None"); // todo; these should be consts
  2960. else if (v === true)
  2961. return new Sk.builtin.str("True");
  2962. else if (v === false)
  2963. return new Sk.builtin.str("False");
  2964. else if (typeof v === "number")
  2965. return new Sk.builtin.str("" + v);
  2966. else if (!v.tp$repr)
  2967. return new Sk.builtin.str("<" + v.tp$name + " object>");
  2968. else
  2969. return v.tp$repr();
  2970. };
  2971. Sk.misceval.isTrue = function(x)
  2972. {
  2973. if (x === true) return true;
  2974. if (x === false) return false;
  2975. if (x === null) return false;
  2976. if (typeof x === "number") return x !== 0;
  2977. // todo; map len, seq len == 0
  2978. return true;
  2979. };
  2980. Sk.misceval.softspace_ = false;
  2981. Sk.misceval.print_ = function print(x)
  2982. {
  2983. if (Sk.misceval.softspace_)
  2984. {
  2985. if (x !== "\n") Sk.output(' ');
  2986. Sk.misceval.softspace_ = false;
  2987. }
  2988. var s = new Sk.builtin.str(x);
  2989. Sk.output(s.v);
  2990. var isspace = function(c)
  2991. {
  2992. return c === '\n' || c === '\t' || c === '\r';
  2993. };
  2994. if (s.v.length === 0 || !isspace(s.v[s.v.length - 1]) || s.v[s.v.length - 1] === ' ')
  2995. Sk.misceval.softspace_ = true;
  2996. };
  2997. /**
  2998. * @param {string} name
  2999. * @param {Object=} other generally globals
  3000. */
  3001. Sk.misceval.loadname = function(name, other)
  3002. {
  3003. var v = other[name];
  3004. if (v !== undefined) return v;
  3005. var bi = Sk.builtin[name];
  3006. if (bi !== undefined) return bi;
  3007. throw new Sk.builtin.NameError("name '" + name + "' is not defined");
  3008. };
  3009. /**
  3010. *
  3011. * Notes on necessity for 'call()':
  3012. *
  3013. * Classes are callable in python to create an instance of the class. If
  3014. * we're calling "C()" we cannot tell at the call site whether we're
  3015. * calling a standard function, or instantiating a class.
  3016. *
  3017. * JS does not support user-level callables. So, we can't use the normal
  3018. * prototype hierarchy to make the class inherit from a 'class' type
  3019. * where the various tp$getattr, etc. methods would live.
  3020. *
  3021. * Instead, we must copy all the methods from the prototype of our class
  3022. * type onto every instance of the class constructor function object.
  3023. * That way, both "C()" and "C.tp$getattr(...)" can still work. This is
  3024. * of course quite expensive.
  3025. *
  3026. * The alternative would be to indirect all calls (whether classes or
  3027. * regular functions) through something like C.$call(...). In the case
  3028. * of class construction, $call could then call the constructor after
  3029. * munging arguments to pass them on. This would impose a penalty on
  3030. * regular function calls unfortunately, as they would have to do the
  3031. * same thing.
  3032. *
  3033. * Note that the same problem exists for function objects too (a "def"
  3034. * creates a function object that also has properties). It just happens
  3035. * that attributes on classes in python are much more useful and common
  3036. * that the attributes on functions.
  3037. *
  3038. * Also note, that for full python compatibility we have to do the $call
  3039. * method because any python object could have a __call__ method which
  3040. * makes the python object callable too. So, unless we were to make
  3041. * *all* objects simply (function(){...}) and use the dict to create
  3042. * hierarchy, there would be no way to call that python user function. I
  3043. * think I'm prepared to sacrifice __call__ support, or only support it
  3044. * post-ECMA5 or something.
  3045. *
  3046. * Is using (function(){...}) as the only object type too crazy?
  3047. * Probably. Better or worse than having two levels of function
  3048. * invocation for every function call?
  3049. *
  3050. * For a class `C' with instance `inst' we have the following cases:
  3051. *
  3052. * 1. C.attr
  3053. *
  3054. * 2. C.staticmeth()
  3055. *
  3056. * 3. x = C.staticmeth; x()
  3057. *
  3058. * 4. inst = C()
  3059. *
  3060. * 5. inst.attr
  3061. *
  3062. * 6. inst.meth()
  3063. *
  3064. * 7. x = inst.meth; x()
  3065. *
  3066. * 8. inst(), where C defines a __call__
  3067. *
  3068. * Because in general these are accomplished by a helper function
  3069. * (tp$getattr/setattr/slice/ass_slice/etc.) it seems appropriate to add
  3070. * a call that generally just calls through, but sometimes handles the
  3071. * unusual cases. Once ECMA-5 is more broadly supported we can revisit
  3072. * and hopefully optimize.
  3073. *
  3074. * @param {Object} func the thing to call
  3075. * @param {Object=} kw keyword args or undef
  3076. * @param {...*} args stuff to pass it
  3077. */
  3078. Sk.misceval.call = function(func, kw, args)
  3079. {
  3080. var args = Array.prototype.slice.call(arguments, 2);
  3081. // todo; possibly inline apply to avoid extra stack frame creation
  3082. return Sk.misceval.apply(func, kw, args);
  3083. };
  3084. /**
  3085. * same as Sk.misceval.call except args is an actual array, rather than
  3086. * varargs.
  3087. */
  3088. Sk.misceval.apply = function(func, kw, args)
  3089. {
  3090. if (typeof func === "function")
  3091. {
  3092. // todo; i believe the only time this happens is the wrapper
  3093. // function around generators (that creates the iterator).
  3094. // should just make that a real function object and get rid
  3095. // of this case.
  3096. goog.asserts.assert(kw === undefined);
  3097. /*
  3098. if (func.$isnative) // a closure function
  3099. {
  3100. // todo; for now, lame attempt to 'marshal' between python and js
  3101. //debugger;
  3102. for (var i = 0; i < args.length; ++i)
  3103. {
  3104. if (args[i].constructor === Sk.builtin.str)
  3105. args[i] = args[i].v;
  3106. else if (args[i].constructor === Sk.builtin.wrappedObject)
  3107. args[i] = args[i].inst$dict;
  3108. }
  3109. var ret;
  3110. // closure ctors don't return this, so we have to do magic to have
  3111. // them return the right thing.
  3112. if (func.$isctor)
  3113. {
  3114. // have i mentioned in the last 15 minutes how non-orthogonal
  3115. // and ugly javascript is? raaaar
  3116. if (args.length === 0)
  3117. ret = new func();
  3118. else if (args.length === 1)
  3119. ret = new func(args[0]);
  3120. else if (args.length === 2)
  3121. ret = new func(args[0], args[1]);
  3122. else if (args.length === 3)
  3123. ret = new func(args[0], args[1], args[2]);
  3124. else if (args.length === 4)
  3125. ret = new func(args[0], args[1], args[2], args[3]);
  3126. else if (args.length === 5)
  3127. ret = new func(args[0], args[1], args[2], args[3], args[4]);
  3128. else if (args.length === 6)
  3129. ret = new func(args[0], args[1], args[2], args[3], args[4], args[5]);
  3130. else if (args.length === 7)
  3131. ret = new func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
  3132. else
  3133. goog.asserts.assert("no constructor apply");
  3134. }
  3135. else
  3136. {
  3137. ret = func.apply(null, args);
  3138. }
  3139. // if it's native, we want to return something that has a
  3140. // tp$getattr. todo; need to do this for typeof ret === object,
  3141. // but callables need to be functions
  3142. return new Sk.builtin.wrappedObject(ret);
  3143. }
  3144. else
  3145. */
  3146. {
  3147. //debugger;
  3148. return func.apply(null, args);
  3149. }
  3150. }
  3151. else
  3152. {
  3153. var fcall = func.tp$call;
  3154. if (fcall !== undefined)
  3155. {
  3156. return fcall.call(func, args, kw);
  3157. }
  3158. // todo; can we push this into a tp$call somewhere so there's
  3159. // not redundant checks everywhere for all of these __x__ ones?
  3160. fcall = func.__call__;
  3161. if (fcall !== undefined)
  3162. {
  3163. // func is actually the object here because we got __call__
  3164. // from it. todo; should probably use descr_get here
  3165. args.unshift(func);
  3166. return Sk.misceval.apply(fcall, kw, args);
  3167. }
  3168. throw new TypeError("'" + func.tp$name + "' object is not callable");
  3169. }
  3170. }
  3171. /**
  3172. * Constructs a class object given a code object representing the body
  3173. * of the class, the name of the class, and the list of bases.
  3174. *
  3175. * There are no "old-style" classes in Skulpt, so use the user-specified
  3176. * metaclass (todo;) if there is one, the type of the 0th base class if
  3177. * there's bases, or otherwise the 'type' type.
  3178. *
  3179. * The func code object is passed a (js) dict for its locals which it
  3180. * stores everything into.
  3181. *
  3182. * The metaclass is then called as metaclass(name, bases, locals) and
  3183. * should return a newly constructed class object.
  3184. *
  3185. */
  3186. Sk.misceval.buildClass = function(globals, func, name, bases)
  3187. {
  3188. // todo; metaclass
  3189. var meta = Sk.builtin.type;
  3190. var locals = {};
  3191. // init the dict for the class
  3192. //print("CALLING", func);
  3193. func(globals, locals);
  3194. // file's __name__ is class's __module__
  3195. locals.__module__ = globals.__name__;
  3196. var klass = Sk.misceval.call(meta, undefined, name, bases, locals);
  3197. //print("class", klass, JSON.stringify(klass.prototype));
  3198. return klass;
  3199. };
  3200. Sk.abstr = {};
  3201. //
  3202. //
  3203. //
  3204. //
  3205. // Number
  3206. //
  3207. //
  3208. //
  3209. //
  3210. Sk.abstr.binop_type_error = function(v, w, name)
  3211. {
  3212. throw new TypeError("unsupported operand type(s) for " + name + ": '"
  3213. + v.tp$name + "' and '" + w.tp$name + "'");
  3214. };
  3215. // this can't be a table for closure
  3216. Sk.abstr.boNameToSlotFunc_ = function(obj, name)
  3217. {
  3218. switch (name)
  3219. {
  3220. case "Add": return obj.nb$add;
  3221. case "Sub": return obj.nb$subtract;
  3222. case "Mult": return obj.nb$multiply;
  3223. //case "Div": return obj.nb$divide;
  3224. //case "FloorDiv": return obj.nb$floor_divide;
  3225. case "Mod": return obj.nb$remainder;
  3226. case "Pow": return obj.nb$power;
  3227. //case "LShift": return obj.nb$lshift;
  3228. //case "RShift": return obj.nb$rshift;
  3229. //case "BitAnd": return obj.nb$and;
  3230. //case "BitOr": return obj.nb$or;
  3231. //case "BitXor": return obj.nb$xor;
  3232. }
  3233. };
  3234. Sk.abstr.iboNameToSlotFunc_ = function(obj, name)
  3235. {
  3236. switch (name)
  3237. {
  3238. case "Add": return obj.nb$inplace_add;
  3239. //case "Sub": return obj.nb$inplace_subtract;
  3240. //case "Mult": return obj.nb$inplace_multiply;
  3241. //case "Div": return obj.nb$divide;
  3242. //case "FloorDiv": return obj.nb$floor_divide;
  3243. //case "Mod": return obj.nb$inplace_remainder;
  3244. //case "Pow": return obj.nb$inplace_power;
  3245. //case "LShift": return obj.nb$lshift;
  3246. //case "RShift": return obj.nb$rshift;
  3247. //case "BitAnd": return obj.nb$and;
  3248. //case "BitOr": return obj.nb$or;
  3249. //case "BitXor": return obj.nb$xor;
  3250. }
  3251. };
  3252. Sk.abstr.binary_op_ = function(v, w, opname)
  3253. {
  3254. var ret;
  3255. var vop = Sk.abstr.boNameToSlotFunc_(v, opname);
  3256. if (vop !== undefined)
  3257. {
  3258. ret = vop.call(v, w);
  3259. if (ret !== undefined) return ret;
  3260. }
  3261. var wop = Sk.abstr.boNameToSlotFunc_(w, opname);
  3262. if (wop !== undefined)
  3263. {
  3264. ret = wop.call(w, v);
  3265. if (ret !== undefined) return ret;
  3266. }
  3267. if (opname === "Add" && v.sq$concat)
  3268. return v.sq$concat(w);
  3269. else if (opname === "Mult" && v.sq$repeat)
  3270. return Sk.abstr.sequenceRepeat(v.sq$repeat, v, w);
  3271. else if (opname === "Mult" && w.sq$repeat)
  3272. return Sk.abstr.sequenceRepeat(w.sq$repeat, w, v);
  3273. Sk.abstr.binop_type_error(v, w, opname);
  3274. };
  3275. Sk.abstr.binary_iop_ = function(v, w, opname)
  3276. {
  3277. var ret;
  3278. var vop = Sk.abstr.iboNameToSlotFunc_(v, opname);
  3279. if (vop !== undefined)
  3280. {
  3281. ret = vop.call(v, w);
  3282. if (ret !== undefined) return ret;
  3283. }
  3284. var wop = Sk.abstr.iboNameToSlotFunc_(w, opname);
  3285. if (wop !== undefined)
  3286. {
  3287. ret = wop.call(w, v);
  3288. if (ret !== undefined) return ret;
  3289. }
  3290. if (opname === "Add")
  3291. {
  3292. if (v.sq$inplace_concat)
  3293. return v.sq$inplace_concat(w);
  3294. else if (v.sq$concat)
  3295. return v.sq$concat(w);
  3296. }
  3297. else if (opname === "Mult")
  3298. {
  3299. if (v.sq$inplace_repeat)
  3300. return Sk.abstr.sequenceRepeat(v.sq$inplace_repeat, v, w);
  3301. else if (v.sq$repeat)
  3302. return Sk.abstr.sequenceRepeat(v.sq$repeat, v, w);
  3303. // note, don't use w inplace_repeat because we don't want to mutate rhs
  3304. else if (w.sq$repeat)
  3305. return Sk.abstr.sequenceRepeat(w.sq$repeat, w, v);
  3306. }
  3307. Sk.abstr.binop_type_error(v, w, opname);
  3308. };
  3309. //
  3310. // handle upconverting a/b from number to long if op causes too big/small a
  3311. // result, or if either of the ops are already longs
  3312. Sk.abstr.numOpAndPromote = function(a, b, opfn)
  3313. {
  3314. if (typeof a === "number" && typeof b === "number")
  3315. {
  3316. var ans = opfn(a, b);
  3317. // todo; handle float
  3318. if (ans > Sk.builtin.lng.threshold$ || ans < -Sk.builtin.lng.threshold$)
  3319. return [Sk.builtin.lng.fromInt$(a), Sk.builtin.lng.fromInt$(b)];
  3320. else
  3321. return ans;
  3322. }
  3323. else if (a.constructor === Sk.builtin.lng && typeof b === "number")
  3324. return [a, Sk.builtin.lng.fromInt$(b)];
  3325. else if (b.constructor === Sk.builtin.lng && typeof a === "number")
  3326. return [Sk.builtin.lng.fromInt$(a), b];
  3327. return undefined;
  3328. };
  3329. Sk.abstr.boNumPromote_ = {
  3330. "Add": function(a, b) { return a + b; },
  3331. "Sub": function(a, b) { return a - b; },
  3332. "Mult": function(a, b) { return a * b; },
  3333. "Mod": function(a, b) { return a % b; },
  3334. "Div": function(a, b) {
  3335. if (b === 0)
  3336. throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");
  3337. else
  3338. return a / b;
  3339. },
  3340. "FloorDiv": function(a, b) { return Math.floor(a / b); }, // todo; wrong? neg?
  3341. "Pow": Math.pow,
  3342. "BitAnd": function(a, b) { return a & b; },
  3343. "BitOr": function(a, b) { return a | b; },
  3344. "BitXor": function(a, b) { return a ^ b; },
  3345. "LShift": function(a, b) { return a << b; },
  3346. "RShift": function(a, b) { return a >> b; }
  3347. };
  3348. Sk.abstr.numberBinOp = function(v, w, op)
  3349. {
  3350. var numPromoteFunc = Sk.abstr.boNumPromote_[op];
  3351. if (numPromoteFunc !== undefined)
  3352. {
  3353. var tmp = Sk.abstr.numOpAndPromote(v, w, numPromoteFunc);
  3354. if (typeof tmp === "number")
  3355. {
  3356. return tmp;
  3357. }
  3358. else if (tmp !== undefined)
  3359. {
  3360. v = tmp[0];
  3361. w = tmp[1];
  3362. }
  3363. }
  3364. return Sk.abstr.binary_op_(v, w, op);
  3365. };
  3366. Sk.abstr.numberInplaceBinOp = function(v, w, op)
  3367. {
  3368. var numPromoteFunc = Sk.abstr.boNumPromote_[op];
  3369. if (numPromoteFunc !== undefined)
  3370. {
  3371. var tmp = Sk.abstr.numOpAndPromote(v, w, numPromoteFunc);
  3372. if (typeof tmp === "number")
  3373. {
  3374. return tmp;
  3375. }
  3376. else if (tmp !== undefined)
  3377. {
  3378. v = tmp[0];
  3379. w = tmp[1];
  3380. }
  3381. }
  3382. return Sk.abstr.binary_iop_(v, w, op);
  3383. };
  3384. Sk.abstr.numberUnaryOp = function(v, op)
  3385. {
  3386. if (op === "Not") return Sk.misceval.isTrue(v) ? false : true;
  3387. else if (typeof v === "number")
  3388. {
  3389. if (op === "USub") return -v;
  3390. if (op === "UAdd") return v;
  3391. if (op === "Invert") return ~v;
  3392. }
  3393. else
  3394. {
  3395. if (op === "USub" && v.nb$negative) return v.nb$negative();
  3396. if (op === "UAdd" && v.nb$positive) return v.nb$positive();
  3397. //todo; if (op === "Invert" && v.nb$positive) return v.nb$invert();
  3398. }
  3399. throw new TypeError("unsupported operand type for " + op + " '" + v.tp$name + "'");
  3400. };
  3401. //
  3402. //
  3403. //
  3404. //
  3405. // Sequence
  3406. //
  3407. //
  3408. //
  3409. //
  3410. Sk.abstr.fixSeqIndex_ = function(seq, i)
  3411. {
  3412. if (i < 0 && seq.sq$length)
  3413. i += seq.sq$length();
  3414. return i;
  3415. };
  3416. Sk.abstr.sequenceContains = function(seq, ob)
  3417. {
  3418. if (seq.sq$contains) return seq.sq$contains(ob);
  3419. if (!seq.tp$iter) throw new TypeError("argument of type '" + seq.tp$name + "' is not iterable");
  3420. for (var it = seq.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  3421. {
  3422. if (Sk.misceval.richCompareBool(i, ob, "Eq"))
  3423. return true;
  3424. }
  3425. return false;
  3426. };
  3427. Sk.abstr.sequenceGetItem = function(seq, i)
  3428. {
  3429. goog.asserts.fail();
  3430. };
  3431. Sk.abstr.sequenceSetItem = function(seq, i, x)
  3432. {
  3433. goog.asserts.fail();
  3434. };
  3435. Sk.abstr.sequenceDelItem = function(seq, i)
  3436. {
  3437. if (seq.sq$ass_item)
  3438. {
  3439. i = Sk.abstr.fixSeqIndex_(seq, i);
  3440. return seq.sq$ass_item(i, null);
  3441. }
  3442. throw new TypeError("'" + seq.tp$name + "' object does not support item deletion");
  3443. };
  3444. Sk.abstr.sequenceRepeat = function(f, seq, n)
  3445. {
  3446. var count = Sk.misceval.asIndex(n);
  3447. if (count === undefined)
  3448. {
  3449. throw new TypeError("can't multiply sequence by non-int of type '" + n.tp$name + "'");
  3450. }
  3451. return f.call(seq, n);
  3452. };
  3453. Sk.abstr.sequenceGetSlice = function(seq, i1, i2)
  3454. {
  3455. if (seq.sq$slice)
  3456. {
  3457. i1 = Sk.abstr.fixSeqIndex_(seq, i1);
  3458. i2 = Sk.abstr.fixSeqIndex_(seq, i2);
  3459. return seq.sq$slice(i1, i2);
  3460. }
  3461. else if (seq.mp$subscript)
  3462. {
  3463. return seq.mp$subscript(new Sk.builtin.slice(i1, i2));
  3464. }
  3465. throw new TypeError("'" + seq.tp$name + "' object is unsliceable");
  3466. };
  3467. Sk.abstr.sequenceDelSlice = function(seq, i1, i2)
  3468. {
  3469. if (seq.sq$ass_slice)
  3470. {
  3471. i1 = Sk.abstr.fixSeqIndex_(seq, i1);
  3472. i2 = Sk.abstr.fixSeqIndex_(seq, i2);
  3473. return seq.sq$ass_slice(i1, i2, null);
  3474. }
  3475. throw new TypeError("'" + seq.tp$name + "' doesn't support slice deletion");
  3476. };
  3477. Sk.abstr.sequenceSetSlice = function(seq, i1, i2, x)
  3478. {
  3479. if (seq.sq$ass_slice)
  3480. {
  3481. i1 = Sk.abstr.fixSeqIndex_(seq, i1);
  3482. i2 = Sk.abstr.fixSeqIndex_(seq, i2);
  3483. seq.sq$ass_slice(i1, i2, x);
  3484. }
  3485. else if (seq.mp$ass_subscript)
  3486. {
  3487. seq.mp$ass_subscript(new Sk.builtin.slice(i1, i2), x);
  3488. }
  3489. else
  3490. {
  3491. throw new TypeError("'" + seq.tp$name + "' object doesn't support slice assignment");
  3492. }
  3493. };
  3494. //
  3495. //
  3496. //
  3497. //
  3498. // Object
  3499. //
  3500. //
  3501. //
  3502. //
  3503. Sk.abstr.objectDelItem = function(o, key)
  3504. {
  3505. if (o.mp$ass_subscript)
  3506. return o.mp$ass_subscript(key, null);
  3507. if (o.sq$ass_item)
  3508. {
  3509. var keyValue = Sk.misceval.asIndex(key);
  3510. if (keyValue === undefined)
  3511. throw new TypeError("sequence index must be integer, not '" + key.tp$name + "'");
  3512. return Sk.abstr.sequenceDelItem(o, keyValue);
  3513. }
  3514. throw new TypeError("'" + o.tp$name + "' object does not support item deletion");
  3515. };
  3516. Sk.abstr.objectGetItem = function(o, key)
  3517. {
  3518. if (o.mp$subscript)
  3519. return o.mp$subscript(key);
  3520. else if (Sk.misceval.isIndex(key) && o.sq$item)
  3521. return Sk.abstr.sequenceGetItem(o, Sk.misceval.asIndex(key));
  3522. throw new TypeError("'" + o.tp$name + "' does not support indexing");
  3523. };
  3524. Sk.abstr.objectSetItem = function(o, key, v)
  3525. {
  3526. if (o.mp$ass_subscript)
  3527. return o.mp$ass_subscript(key, v);
  3528. else if (Sk.misceval.isIndex(key) && o.sq$ass_item)
  3529. return Sk.abstr.sequenceSetItem(o, Sk.misceval.asIndex(key), v);
  3530. throw new TypeError("'" + o.tp$name + "' does not support item assignment");
  3531. };
  3532. /**
  3533. * @constructor
  3534. * @param {Array.<Object>} L
  3535. * @extends Sk.builtin.object
  3536. */
  3537. Sk.builtin.list = function(L)
  3538. {
  3539. if (L instanceof Sk.builtin.list) return L;
  3540. if (!(this instanceof Sk.builtin.list)) return new Sk.builtin.list(L);
  3541. if (Object.prototype.toString.apply(L) === '[object Array]')
  3542. {
  3543. this.v = L;
  3544. }
  3545. else
  3546. {
  3547. if (L.tp$iter)
  3548. {
  3549. this.v = [];
  3550. for (var it = L.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  3551. this.v.push(i);
  3552. }
  3553. else
  3554. throw new Sk.builtin.ValueError("expecting Array or iterable");
  3555. }
  3556. return this;
  3557. };
  3558. Sk.builtin.list.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('list', Sk.builtin.list);
  3559. Sk.builtin.list.prototype.list_iter_ = function()
  3560. {
  3561. var ret =
  3562. {
  3563. tp$iter: function() { return ret; },
  3564. $obj: this,
  3565. $index: 0,
  3566. tp$iternext: function()
  3567. {
  3568. // todo; StopIteration
  3569. if (ret.$index >= ret.$obj.v.length) return undefined;
  3570. return ret.$obj.v[ret.$index++];
  3571. }
  3572. };
  3573. return ret;
  3574. };
  3575. Sk.builtin.list.prototype.list_concat_ = function(other)
  3576. {
  3577. var ret = this.v.slice();
  3578. for (var i = 0; i < other.v.length; ++i)
  3579. {
  3580. ret.push(other.v[i]);
  3581. }
  3582. return new Sk.builtin.list(ret);
  3583. }
  3584. Sk.builtin.list.prototype.list_ass_item_ = function(i, v)
  3585. {
  3586. if (i < 0 || i >= this.v.length)
  3587. throw new Sk.builtin.IndexError("list assignment index out of range");
  3588. if (v === null)
  3589. return Sk.builtin.list.prototype.list_ass_slice_.call(this, i, i+1, v);
  3590. this.v[i] = v;
  3591. };
  3592. Sk.builtin.list.prototype.list_ass_slice_ = function(ilow, ihigh, v)
  3593. {
  3594. // todo; item rather list/null
  3595. var args = v === null ? [] : v.v.slice(0);
  3596. args.unshift(ihigh - ilow);
  3597. args.unshift(ilow);
  3598. this.v.splice.apply(this.v, args);
  3599. };
  3600. Sk.builtin.list.prototype.tp$name = "list";
  3601. Sk.builtin.list.prototype.tp$repr = function()
  3602. {
  3603. var ret = [];
  3604. for (var it = this.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  3605. ret.push(Sk.misceval.objectRepr(i).v);
  3606. return new Sk.builtin.str("[" + ret.join(", ") + "]");
  3607. };
  3608. Sk.builtin.list.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  3609. Sk.builtin.list.prototype.tp$hash = Sk.builtin.object.prototype.HashNotImplemented;
  3610. Sk.builtin.list.prototype.tp$richcompare = function(w, op)
  3611. {
  3612. // todo; NotImplemented if either isn't a list
  3613. // todo; can't figure out where cpy handles this silly case (test/run/t96.py)
  3614. // perhaps by trapping a stack overflow? otherwise i'm not sure for more
  3615. // complicated cases. bleh
  3616. if (this === w) return op === 'Eq';
  3617. var v = this.v;
  3618. var w = w.v;
  3619. var vl = v.length;
  3620. var wl = w.length;
  3621. var i;
  3622. for (i = 0; i < vl && i < wl; ++i)
  3623. {
  3624. var k = Sk.misceval.richCompareBool(v[i], w[i], 'Eq');
  3625. if (!k) break;
  3626. }
  3627. if (i >= vl || i >= wl)
  3628. {
  3629. // no more items to compare, compare sizes
  3630. switch (op)
  3631. {
  3632. case 'Lt': return vl < wl;
  3633. case 'LtE': return vl <= wl;
  3634. case 'Eq': return vl === wl;
  3635. case 'NotEq': return vl !== wl;
  3636. case 'Gt': return vl > wl;
  3637. case 'GtE': return vl >= wl;
  3638. default: goog.asserts.fail();
  3639. }
  3640. }
  3641. // we have an item that's different
  3642. // shortcuts for eq/not
  3643. if (op === 'Eq') return false;
  3644. if (op === 'NotEq') return true;
  3645. // or, compare the differing element using the proper operator
  3646. return Sk.misceval.richCompareBool(v[i], w[i], op);
  3647. };
  3648. Sk.builtin.list.prototype.tp$iter = Sk.builtin.list.prototype.list_iter_;
  3649. Sk.builtin.list.prototype.sq$length = function() { return this.v.length; };
  3650. Sk.builtin.list.prototype.sq$concat = Sk.builtin.list.prototype.list_concat_;
  3651. Sk.builtin.list.prototype.sq$repeat = function(n)
  3652. {
  3653. var ret = [];
  3654. for (var i = 0; i < n; ++i)
  3655. for (var j = 0; j < this.v.length; ++j)
  3656. ret.push(this.v[j]);
  3657. return new Sk.builtin.list(ret);
  3658. };
  3659. /*
  3660. Sk.builtin.list.prototype.sq$item = list_item;
  3661. Sk.builtin.list.prototype.sq$slice = list_slice;
  3662. */
  3663. Sk.builtin.list.prototype.sq$ass_item = Sk.builtin.list.prototype.list_ass_item_;
  3664. Sk.builtin.list.prototype.sq$ass_slice = Sk.builtin.list.prototype.list_ass_slice_;
  3665. //Sk.builtin.list.prototype.sq$contains // iter version is fine
  3666. /*
  3667. Sk.builtin.list.prototype.sq$inplace_concat = list_inplace_concat;
  3668. Sk.builtin.list.prototype.sq$inplace_repeat = list_inplace_repeat;
  3669. */
  3670. Sk.builtin.list.prototype.list_subscript_ = function(index)
  3671. {
  3672. if (typeof index === "number")
  3673. {
  3674. if (index < 0) index = this.v.length + index;
  3675. if (index < 0 || index >= this.v.length) throw new Sk.builtin.IndexError("list index out of range");
  3676. return this.v[index];
  3677. }
  3678. else if (index instanceof Sk.builtin.slice)
  3679. {
  3680. var ret = [];
  3681. index.sssiter$(this, function(i, wrt)
  3682. {
  3683. ret.push(wrt.v[i]);
  3684. });
  3685. return new Sk.builtin.list(ret);
  3686. }
  3687. else
  3688. throw new TypeError("list indices must be integers, not " + typeof index);
  3689. };
  3690. Sk.builtin.list.prototype.list_ass_item_ = function(i, value)
  3691. {
  3692. if (i < 0 || i >= this.v.length) throw new Sk.builtin.IndexError("list index out of range");
  3693. if (value === null)
  3694. this.list_ass_slice_(i, i+1, value);
  3695. else
  3696. this.v[i] = value;
  3697. };
  3698. Sk.builtin.list.prototype.list_ass_subscript_ = function(index, value)
  3699. {
  3700. if (Sk.misceval.isIndex(index))
  3701. {
  3702. var i = Sk.misceval.asIndex(index);
  3703. if (i < 0) i = this.v.length + i;
  3704. this.list_ass_item_(i, value);
  3705. }
  3706. else if (index instanceof Sk.builtin.slice)
  3707. {
  3708. if (index.step === 1)
  3709. this.list_ass_slice_(index.start, index.stop, value);
  3710. else
  3711. {
  3712. if (value === null)
  3713. {
  3714. var self = this;
  3715. var dec = 0; // offset of removal for next index (because we'll have removed, but the iterator is giving orig indices)
  3716. var offdir = index.step > 0 ? 1 : 0;
  3717. index.sssiter$(this, function(i, wrt)
  3718. {
  3719. self.v.splice(i - dec, 1);
  3720. dec += offdir;
  3721. });
  3722. }
  3723. else
  3724. {
  3725. var tosub = [];
  3726. index.sssiter$(this, function(i, wrt) { tosub.push(i); });
  3727. var j = 0;
  3728. if (tosub.length !== value.v.length) throw new Sk.builtin.ValueError("attempt to assign sequence of size " + value.v.length + " to extended slice of size " + tosub.length);
  3729. for (var i = 0; i < tosub.length; ++i)
  3730. {
  3731. this.v.splice(tosub[i], 1, value.v[j]);
  3732. j += 1;
  3733. }
  3734. }
  3735. }
  3736. }
  3737. else
  3738. throw new TypeError("list indices must be integers, not " + typeof index);
  3739. };
  3740. Sk.builtin.list.prototype.mp$subscript = Sk.builtin.list.prototype.list_subscript_;
  3741. Sk.builtin.list.prototype.mp$ass_subscript = Sk.builtin.list.prototype.list_ass_subscript_;
  3742. Sk.builtin.list.prototype.__getitem__ = new Sk.builtin.func(function(self, index)
  3743. {
  3744. return Sk.builtin.list.prototype.list_subscript_.call(self, index);
  3745. });
  3746. //Sk.builtin.list.prototype.__reversed__ = todo;
  3747. Sk.builtin.list.prototype.append = new Sk.builtin.func(function(self, item)
  3748. {
  3749. self.v.push(item);
  3750. return null;
  3751. });
  3752. Sk.builtin.list.prototype.insert = new Sk.builtin.func(function(self, i, x)
  3753. {
  3754. if (i < 0) i = 0;
  3755. else if (i > self.v.length) i = self.v.length - 1;
  3756. self.v.splice(i, 0, x);
  3757. });
  3758. Sk.builtin.list.prototype.extend = new Sk.builtin.func(function(self, b)
  3759. {
  3760. for (var it = b.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  3761. self.v.push(i);
  3762. return null;
  3763. });
  3764. Sk.builtin.list.prototype.pop = new Sk.builtin.func(function(self, i)
  3765. {
  3766. if (i === undefined) i = self.v.length - 1;
  3767. var ret = self.v[i];
  3768. self.v.splice(i, 1);
  3769. return ret;
  3770. });
  3771. //Sk.builtin.list.prototype.remove = todo;
  3772. Sk.builtin.list.prototype.index = new Sk.builtin.func(function(self, item)
  3773. {
  3774. var len = self.v.length;
  3775. var obj = self.v;
  3776. for (var i = 0; i < len; ++i)
  3777. {
  3778. if (Sk.misceval.richCompareBool(obj[i], item, "Eq"))
  3779. return i;
  3780. }
  3781. throw new Sk.builtin.ValueError("list.index(x): x not in list");
  3782. });
  3783. //Sk.builtin.list.prototype.count = todo;
  3784. //Sk.builtin.list.prototype.reverse = todo;
  3785. Sk.builtin.list.prototype.sort = new Sk.builtin.func(function(self)
  3786. {
  3787. // todo; cmp, key, rev
  3788. // todo; totally wrong except for numbers
  3789. self.v.sort();
  3790. return null;
  3791. });
  3792. var interned = {};
  3793. /**
  3794. * @constructor
  3795. * @param {*} x
  3796. * @param {boolean=} $ctorhack
  3797. * @extends Sk.builtin.object
  3798. */
  3799. Sk.builtin.str = function(x, $ctorhack)
  3800. {
  3801. if ($ctorhack) return this;
  3802. if (x === undefined) throw "error: trying to str() undefined (should be at least null)";
  3803. if (x instanceof Sk.builtin.str && x !== Sk.builtin.str.prototype.ob$type) return x;
  3804. if (!(this instanceof Sk.builtin.str)) return new Sk.builtin.str(x);
  3805. // convert to js string
  3806. var ret;
  3807. if (x === true) ret = "True";
  3808. else if (x === false) ret = "False";
  3809. else if (x === null) ret = "None";
  3810. else if (typeof x === "number")
  3811. ret = x.toString();
  3812. else if (typeof x === "string")
  3813. ret = x;
  3814. else if (x.tp$str !== undefined)
  3815. {
  3816. ret = x.tp$str();
  3817. if (!(ret instanceof Sk.builtin.str)) throw new Sk.builtin.ValueError("__str__ didn't return a str");
  3818. return ret;
  3819. }
  3820. else
  3821. return Sk.misceval.objectRepr(x);
  3822. // interning required for strings in py
  3823. if (interned.hasOwnProperty(ret))
  3824. {
  3825. return interned[ret];
  3826. }
  3827. this.__class__ = this.nativeclass$ = Sk.builtin.str;
  3828. this.v = ret;
  3829. interned[ret] = this;
  3830. return this;
  3831. };
  3832. goog.exportSymbol("Sk.builtin.str", Sk.builtin.str);
  3833. Sk.builtin.str.prototype.mp$subscript = function(index)
  3834. {
  3835. if (typeof index === "number" && Math.floor(index) === index /* not a float*/ )
  3836. {
  3837. if (index < 0) index = this.v.length + index;
  3838. if (index < 0 || index >= this.v.length) throw new Sk.builtin.IndexError("string index out of range");
  3839. return new Sk.builtin.str(this.v.charAt(index));
  3840. }
  3841. else if (index instanceof Sk.builtin.slice)
  3842. {
  3843. var ret = '';
  3844. index.sssiter$(this, function(i, wrt) {
  3845. if (i >= 0 && i < wrt.v.length)
  3846. ret += wrt.v.charAt(i);
  3847. });
  3848. return new Sk.builtin.str(ret);
  3849. }
  3850. else
  3851. throw new TypeError("string indices must be numbers, not " + typeof index);
  3852. };
  3853. Sk.builtin.str.prototype.sq$length = function()
  3854. {
  3855. return this.v.length;
  3856. };
  3857. Sk.builtin.str.prototype.sq$concat = function(other) { return new Sk.builtin.str(this.v + other.v); };
  3858. Sk.builtin.str.prototype.sq$repeat = function(n)
  3859. {
  3860. var ret = "";
  3861. for (var i = 0; i < n; ++i)
  3862. ret += this.v;
  3863. return new Sk.builtin.str(ret);
  3864. };
  3865. Sk.builtin.str.prototype.sq$item = function() { goog.asserts.fail(); };
  3866. Sk.builtin.str.prototype.sq$slice = function(i1, i2)
  3867. {
  3868. return new Sk.builtin.str(this.v.substr(i1, i2 - i1));
  3869. };
  3870. // Sk.builtin.str.prototype.sq$contains // iter version is fine
  3871. Sk.builtin.str.prototype.tp$name = "str";
  3872. Sk.builtin.str.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  3873. Sk.builtin.str.prototype.tp$iter = function()
  3874. {
  3875. var ret =
  3876. {
  3877. tp$iter: function() { return ret; },
  3878. $obj: this,
  3879. $index: 0,
  3880. tp$iternext: function()
  3881. {
  3882. // todo; StopIteration
  3883. if (ret.$index >= ret.$obj.v.length) return undefined;
  3884. return new Sk.builtin.str(ret.$obj.v.substr(ret.$index++, 1));
  3885. }
  3886. };
  3887. return ret;
  3888. };
  3889. Sk.builtin.str.prototype.tp$repr = function()
  3890. {
  3891. // single is preferred
  3892. var quote = "'";
  3893. if (this.v.indexOf("'") !== -1 && this.v.indexOf('"') === -1)
  3894. {
  3895. quote = '"';
  3896. }
  3897. var len = this.v.length;
  3898. var ret = quote;
  3899. for (var i = 0; i < len; ++i)
  3900. {
  3901. var c = this.v.charAt(i);
  3902. if (c === quote || c === '\\')
  3903. ret += '\\' + c;
  3904. else if (c === '\t')
  3905. ret += '\\t';
  3906. else if (c === '\n')
  3907. ret += '\\n';
  3908. else if (c === '\r')
  3909. ret += '\\r';
  3910. else if (c < ' ' || c >= 0x7f)
  3911. {
  3912. var ashex = c.charCodeAt(0).toString(16);
  3913. if (ashex.length < 2) ashex = "0" + ashex;
  3914. ret += "\\x" + ashex;
  3915. }
  3916. else
  3917. ret += c;
  3918. }
  3919. ret += quote;
  3920. return new Sk.builtin.str(ret);
  3921. };
  3922. Sk.builtin.str.alphanum_ = {};
  3923. (function() {
  3924. var i;
  3925. for (i = 'a'; i <= 'z'; ++i) Sk.builtin.str.alphanum_[i] = 1;
  3926. for (i = 'A'; i <= 'Z'; ++i) Sk.builtin.str.alphanum_[i] = 1;
  3927. for (i = '0'; i <= '9'; ++i) Sk.builtin.str.alphanum_[i] = 1;
  3928. }());
  3929. Sk.builtin.str.re_escape_ = function(s)
  3930. {
  3931. var ret = [];
  3932. for (var i = 0; i < s.length; ++i)
  3933. {
  3934. var c = s.charAt(i);
  3935. if (Sk.builtin.str.alphanum_[c])
  3936. {
  3937. ret.push(c);
  3938. }
  3939. else
  3940. {
  3941. if (c === "\\000")
  3942. ret.push("\\000");
  3943. else
  3944. ret.push("\\" + c);
  3945. }
  3946. }
  3947. return ret.join('');
  3948. };
  3949. Sk.builtin.str.prototype.join = new Sk.builtin.func(function(self, seq)
  3950. {
  3951. var arrOfStrs = [];
  3952. for (var it = seq.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  3953. {
  3954. if (i.constructor !== Sk.builtin.str) throw "TypeError: sequence item " + arrOfStrs.length + ": expected string, " + typeof i + " found";
  3955. arrOfStrs.push(i.v);
  3956. }
  3957. return new Sk.builtin.str(arrOfStrs.join(self.v));
  3958. });
  3959. Sk.builtin.str.prototype.split = new Sk.builtin.func(function(self, on, howmany)
  3960. {
  3961. var res = self.v.split(new Sk.builtin.str(on).v, howmany);
  3962. var tmp = [];
  3963. for (var i = 0; i < res.length; ++i)
  3964. {
  3965. tmp.push(new Sk.builtin.str(res[i]));
  3966. }
  3967. return new Sk.builtin.list(tmp);
  3968. });
  3969. Sk.builtin.str.prototype.replace = new Sk.builtin.func(function(self, oldS, newS, count)
  3970. {
  3971. if (oldS.constructor !== Sk.builtin.str || newS.constructor !== Sk.builtin.str)
  3972. throw new Sk.builtin.TypeError("expecting a string");
  3973. goog.asserts.assert(count === undefined, "todo; replace() with could not implemented");
  3974. var patt = new RegExp(Sk.builtin.str.re_escape_(oldS.v), "g");
  3975. return new Sk.builtin.str(self.v.replace(patt, newS.v));
  3976. });
  3977. Sk.builtin.str.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('str', Sk.builtin.str);
  3978. Sk.builtin.str.prototype.nb$remainder = function(rhs)
  3979. {
  3980. // % format op. rhs can be a value, a tuple, or something with __getitem__ (dict)
  3981. // From http://docs.python.org/library/stdtypes.html#string-formatting the
  3982. // format looks like:
  3983. // 1. The '%' character, which marks the start of the specifier.
  3984. // 2. Mapping key (optional), consisting of a parenthesised sequence of characters (for example, (somename)).
  3985. // 3. Conversion flags (optional), which affect the result of some conversion types.
  3986. // 4. Minimum field width (optional). If specified as an '*' (asterisk), the actual width is read from the next element of the tuple in values, and the object to convert comes after the minimum field width and optional precision.
  3987. // 5. Precision (optional), given as a '.' (dot) followed by the precision. If specified as '*' (an asterisk), the actual width is read from the next element of the tuple in values, and the value to convert comes after the precision.
  3988. // 6. Length modifier (optional).
  3989. // 7. Conversion type.
  3990. //
  3991. // length modifier is ignored
  3992. if (rhs.constructor !== Sk.builtin.tuple && (rhs.mp$subscript === undefined || rhs.constructor === Sk.builtin.str)) rhs = new Sk.builtin.tuple([rhs]);
  3993. // general approach is to use a regex that matches the format above, and
  3994. // do an re.sub with a function as replacement to make the subs.
  3995. // 1 2222222222222222 33333333 444444444 5555555555555 66666 777777777777777777
  3996. var regex = /%(\([a-zA-Z0-9]+\))?([#0 +\-]+)?(\*|[0-9]+)?(\.(\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrs%])/g;
  3997. var index = 0;
  3998. var replFunc = function(substring, mappingKey, conversionFlags, fieldWidth, precision, precbody, conversionType)
  3999. {
  4000. var i;
  4001. if (mappingKey === undefined || mappingKey === "" ) i = index++; // ff passes '' not undef for some reason
  4002. var zeroPad = false;
  4003. var leftAdjust = false;
  4004. var blankBeforePositive = false;
  4005. var precedeWithSign = false;
  4006. var alternateForm = false;
  4007. if (conversionFlags)
  4008. {
  4009. if (conversionFlags.indexOf("-") !== -1) leftAdjust = true;
  4010. else if (conversionFlags.indexOf("0") !== -1) zeroPad = true;
  4011. if (conversionFlags.indexOf("+") !== -1) precedeWithSign = true;
  4012. else if (conversionFlags.indexOf(" ") !== -1) blankBeforePositive = true;
  4013. alternateForm = conversionFlags.indexOf("#") !== -1;
  4014. }
  4015. if (precision)
  4016. {
  4017. precision = parseInt(precision.substr(1), 10);
  4018. }
  4019. var formatNumber = function(n, base)
  4020. {
  4021. var j;
  4022. var r;
  4023. var neg = false;
  4024. var didSign = false;
  4025. if (typeof n === "number")
  4026. {
  4027. if (n < 0)
  4028. {
  4029. n = -n;
  4030. neg = true;
  4031. }
  4032. r = n.toString(base);
  4033. }
  4034. else if (n instanceof Sk.builtin.lng)
  4035. {
  4036. r = n.str$(base, false);
  4037. neg = n.size$ < 0;
  4038. }
  4039. goog.asserts.assert(r !== undefined, "unhandled number format");
  4040. var precZeroPadded = false;
  4041. if (precision)
  4042. {
  4043. //print("r.length",r.length,"precision",precision);
  4044. for (j = r.length; j < precision; ++j)
  4045. {
  4046. r = '0' + r;
  4047. precZeroPadded = true;
  4048. }
  4049. }
  4050. var prefix = '';
  4051. if (neg) prefix = "-";
  4052. else if (precedeWithSign) prefix = "+" + prefix;
  4053. else if (blankBeforePositive) prefix = " " + prefix;
  4054. if (alternateForm)
  4055. {
  4056. if (base === 16) prefix += '0x';
  4057. else if (base === 8 && !precZeroPadded && r !== "0") prefix += '0';
  4058. }
  4059. return [prefix, r];
  4060. };
  4061. var handleWidth = function(args)
  4062. {
  4063. var prefix = args[0];
  4064. var r = args[1];
  4065. var j;
  4066. if (fieldWidth)
  4067. {
  4068. fieldWidth = parseInt(fieldWidth, 10);
  4069. var totLen = r.length + prefix.length;
  4070. if (zeroPad)
  4071. for (j = totLen; j < fieldWidth; ++j)
  4072. r = '0' + r;
  4073. else if (leftAdjust)
  4074. for (j = totLen; j < fieldWidth; ++j)
  4075. r = r + ' ';
  4076. else
  4077. for (j = totLen; j < fieldWidth; ++j)
  4078. prefix = ' ' + prefix;
  4079. }
  4080. return prefix + r;
  4081. };
  4082. var value;
  4083. //print("Rhs:",rhs, "ctor", rhs.constructor);
  4084. if (rhs.constructor === Sk.builtin.tuple)
  4085. {
  4086. value = rhs.v[i];
  4087. }
  4088. else if (rhs.mp$subscript !== undefined)
  4089. {
  4090. var mk = mappingKey.substring(1, mappingKey.length - 1);
  4091. //print("mk",mk);
  4092. value = rhs.mp$subscript(new Sk.builtin.str(mk));
  4093. }
  4094. else throw new Sk.builtin.AttributeError(rhs.tp$name + " instance has no attribute 'mp$subscript'");
  4095. var r;
  4096. var base = 10;
  4097. switch (conversionType)
  4098. {
  4099. case 'd':
  4100. case 'i':
  4101. return handleWidth(formatNumber(value, 10));
  4102. case 'o':
  4103. return handleWidth(formatNumber(value, 8));
  4104. case 'x':
  4105. return handleWidth(formatNumber(value, 16));
  4106. case 'X':
  4107. return handleWidth(formatNumber(value, 16)).toUpperCase();
  4108. case 'e':
  4109. case 'E':
  4110. case 'f':
  4111. case 'F':
  4112. case 'g':
  4113. case 'G':
  4114. var convName = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(conversionType.toLowerCase())];
  4115. var result = (value)[convName](precision);
  4116. if ('EFG'.indexOf(conversionType) !== -1) result = result.toUpperCase();
  4117. // todo; signs etc.
  4118. return handleWidth(['', result]);
  4119. case 'c':
  4120. if (typeof value === "number")
  4121. return String.fromCharCode(value);
  4122. else if (value instanceof Sk.builtin.lng)
  4123. return String.fromCharCode(value.digit$[0] & 255);
  4124. else if (value.constructor === Sk.builtin.str)
  4125. return value.v.substr(0, 1);
  4126. else
  4127. throw new TypeError("an integer is required");
  4128. break; // stupid lint
  4129. case 'r':
  4130. r = Sk.builtin.repr(value);
  4131. if (precision) return r.v.substr(0, precision);
  4132. return r.v;
  4133. case 's':
  4134. //print("value",value);
  4135. //print("replace:");
  4136. //print(" index", index);
  4137. //print(" substring", substring);
  4138. //print(" mappingKey", mappingKey);
  4139. //print(" conversionFlags", conversionFlags);
  4140. //print(" fieldWidth", fieldWidth);
  4141. //print(" precision", precision);
  4142. //print(" conversionType", conversionType);
  4143. r = new Sk.builtin.str(value);
  4144. if (precision) return r.v.substr(0, precision);
  4145. return r.v;
  4146. case '%':
  4147. return '%';
  4148. }
  4149. };
  4150. var ret = this.v.replace(regex, replFunc);
  4151. return new Sk.builtin.str(ret);
  4152. };
  4153. /*
  4154. $.prototype.__getitem__ = function(index)
  4155. {
  4156. if (typeof index === "number")
  4157. {
  4158. if (index < 0) index = this.v.length + index;
  4159. if (index < 0 || index >= this.v.length) throw new Sk.builtin.IndexError("string index out of range");
  4160. return new $(this.v.charAt(index));
  4161. }
  4162. else if (index instanceof Sk.builtin.slice)
  4163. {
  4164. var ret = '';
  4165. index.sssiter$(this, function(i, wrt) {
  4166. if (i >= 0 && i < wrt.v.length)
  4167. ret += wrt.v.charAt(i);
  4168. });
  4169. return new $(ret);
  4170. }
  4171. else
  4172. throw new TypeError("string indices must be numbers, not " + typeof index);
  4173. };
  4174. $.prototype.__add__ = function(other)
  4175. {
  4176. return new $(this.v + other.v);
  4177. };
  4178. $.__repr__ = function()
  4179. {
  4180. return new $("<type 'str'>");
  4181. };
  4182. $.prototype.__str__ = function()
  4183. {
  4184. // todo; this is probably a bad thing? should return a py obj
  4185. return this.v;
  4186. };
  4187. $.prototype.richcmp$ = function(rhs, op)
  4188. {
  4189. if (rhs.constructor !== $) return false;
  4190. if (this === rhs)
  4191. {
  4192. switch (op)
  4193. {
  4194. case '<': case '>': case '!=': return false;
  4195. case '<=': case '>=': case '==': return true;
  4196. }
  4197. }
  4198. else
  4199. {
  4200. // currently, all strings are intern'd
  4201. return false;
  4202. }
  4203. };
  4204. //$.prototype.__class__ = new Type$('str', [Sk.types.object], {});
  4205. $.capitalize = function() { throw "todo; capitalize"; };
  4206. $.center = function() { throw "todo; center"; };
  4207. $.count = function() { throw "todo; count"; };
  4208. $.decode = function() { throw "todo; decode"; };
  4209. $.encode = function() { throw "todo; encode"; };
  4210. $.endswith = function() { throw "todo; endswith"; };
  4211. $.expandtabs = function() { throw "todo; expandtabs"; };
  4212. $.find = function() { throw "todo; find"; };
  4213. $.format = function() { throw "todo; format"; };
  4214. $.index = function() { throw "todo; index"; };
  4215. $.isalnum = function() { throw "todo; isalnum"; };
  4216. $.isalpha = function() { throw "todo; isalpha"; };
  4217. $.isdigit = function() { throw "todo; isdigit"; };
  4218. $.islower = function() { throw "todo; islower"; };
  4219. $.isspace = function() { throw "todo; isspace"; };
  4220. $.istitle = function() { throw "todo; istitle"; };
  4221. $.isupper = function() { throw "todo; isupper"; };
  4222. $.join = function(self, seq)
  4223. {
  4224. var arrOfStrs = [];
  4225. for (var it = seq.__iter__(), i = it.next(); i !== undefined; i = it.next())
  4226. {
  4227. if (i.constructor !== $) throw "TypeError: sequence item " + arrOfStrs.length + ": expected string, " + typeof i + " found";
  4228. arrOfStrs.push(i.v);
  4229. }
  4230. return arrOfStrs.join(self.v);
  4231. };
  4232. $.ljust = function() { throw "todo; ljust"; };
  4233. $.lower = function() { return new $(this.v.toLowerCase()); };
  4234. $.lstrip = function() { throw "todo; lstrip"; };
  4235. $.partition = function() { throw "todo; partition"; };
  4236. $.replace = function(self, oldS, newS, count)
  4237. {
  4238. if (oldS.constructor !== $ || newS.constructor !== $)
  4239. throw "TypeError: expecting a string";
  4240. if (count !== undefined)
  4241. throw "todo; replace() with count not implemented";
  4242. var patt = new RegExp(re_escape(oldS.v), "g");
  4243. return new $(self.v.replace(patt, newS.v));
  4244. };
  4245. $.rfind = function() { throw "todo; rfind"; };
  4246. $.rindex = function() { throw "todo; rindex"; };
  4247. $.rjust = function() { throw "todo; rjust"; };
  4248. $.rpartition = function() { throw "todo; rpartition"; };
  4249. $.rsplit = function() { throw "todo; rsplit"; };
  4250. $.rstrip = function() { throw "todo; rstrip"; };
  4251. $.split = function(self, on, howmany)
  4252. {
  4253. var res = self.v.split(new $(on).v, howmany);
  4254. var tmp = [];
  4255. for (var i = 0; i < res.length; ++i)
  4256. {
  4257. tmp.push(new $(res[i]));
  4258. }
  4259. return new Sk.builtin.list(tmp);
  4260. };
  4261. $.splitlines = function() { throw "todo; splitlines"; };
  4262. $.startswith = function() { throw "todo; startswith"; };
  4263. $.strip = function() { throw "todo; strip"; };
  4264. $.swapcase = function() { throw "todo; swapcase"; };
  4265. $.title = function() { throw "todo; title"; };
  4266. $.translate = function() { throw "todo; translate"; };
  4267. $.upper = function(self) { return new $(self.v.toUpperCase()); };
  4268. $.zfill = function() { throw "todo; zfill"; };
  4269. */
  4270. /**
  4271. * @constructor
  4272. * @param {Array.<Object>|Object} L
  4273. */
  4274. Sk.builtin.tuple = function(L)
  4275. {
  4276. if (L instanceof Sk.builtin.tuple) return;
  4277. if (!(this instanceof Sk.builtin.tuple)) return new Sk.builtin.tuple(L);
  4278. if (Object.prototype.toString.apply(L) === '[object Array]')
  4279. this.v = L;
  4280. else
  4281. this.v = L.v;
  4282. this.__class__ = this.nativeclass$ = Sk.builtin.tuple;
  4283. return this;
  4284. };
  4285. Sk.builtin.tuple.prototype.tp$repr = function()
  4286. {
  4287. if (this.v.length === 0) return new Sk.builtin.str("()");
  4288. var bits = [];
  4289. for (var i = 0; i < this.v.length; ++i)
  4290. {
  4291. bits[i] = Sk.misceval.objectRepr(this.v[i]).v;
  4292. }
  4293. var ret = bits.join(', ');
  4294. if (this.v.length === 1) ret += ",";
  4295. return new Sk.builtin.str("(" + ret + ")");
  4296. };
  4297. Sk.builtin.tuple.prototype.mp$subscript = function(index)
  4298. {
  4299. if (typeof index === "number")
  4300. {
  4301. if (index < 0) index = this.v.length + index;
  4302. if (index < 0 || index >= this.v.length) throw new Sk.builtin.IndexError("tuple index out of range");
  4303. return this.v[index];
  4304. }
  4305. else if (index instanceof Sk.builtin.slice)
  4306. {
  4307. var ret = [];
  4308. index.sssiter$(this, function(i, wrt)
  4309. {
  4310. ret.push(wrt.v[i]);
  4311. });
  4312. return new Sk.builtin.tuple(ret);
  4313. }
  4314. else
  4315. throw new TypeError("tuple indices must be integers, not " + typeof index);
  4316. };
  4317. // todo; the numbers and order are taken from python, but the answer's
  4318. // obviously not the same because there's no int wrapping. shouldn't matter,
  4319. // but would be nice to make the hash() values the same if it's not too
  4320. // expensive to simplify tests.
  4321. Sk.builtin.tuple.prototype.tp$hash = function()
  4322. {
  4323. var mult = 1000003;
  4324. var x = 0x345678;
  4325. var len = this.v.length;
  4326. for (var i = 0; i < len; ++i)
  4327. {
  4328. var y = Sk.builtin.hash(this.v[i]);
  4329. if (y === -1) return -1;
  4330. x = (x ^ y) * mult;
  4331. mult += 82520 + len + len;
  4332. }
  4333. x += 97531;
  4334. if (x === -1) x = -2;
  4335. return x;
  4336. };
  4337. Sk.builtin.tuple.prototype.sq$repeat = function(n)
  4338. {
  4339. var ret = [];
  4340. for (var i = 0; i < n; ++i)
  4341. for (var j = 0; j < this.v.length; ++ j)
  4342. ret.push(this.v[j]);
  4343. return new Sk.builtin.tuple(ret);
  4344. };
  4345. Sk.builtin.tuple.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('tuple', Sk.builtin.tuple);
  4346. Sk.builtin.tuple.prototype.tp$iter = function()
  4347. {
  4348. var ret =
  4349. {
  4350. tp$iter: function() { return ret; },
  4351. $obj: this,
  4352. $index: 0,
  4353. tp$iternext: function()
  4354. {
  4355. // todo; StopIteration
  4356. if (ret.$index >= ret.$obj.v.length) return undefined;
  4357. return ret.$obj.v[ret.$index++];
  4358. }
  4359. };
  4360. return ret;
  4361. };
  4362. Sk.builtin.tuple.prototype.tp$richcompare = function(w, op)
  4363. {
  4364. // todo; NotImplemented if either isn't a tuple
  4365. var v = this.v;
  4366. var w = w.v;
  4367. var vl = v.length;
  4368. var wl = w.length;
  4369. var i;
  4370. for (i = 0; i < vl && i < wl; ++i)
  4371. {
  4372. var k = Sk.misceval.richCompareBool(v[i], w[i], 'Eq');
  4373. if (!k) break;
  4374. }
  4375. if (i >= vl || i >= wl)
  4376. {
  4377. // no more items to compare, compare sizes
  4378. switch (op)
  4379. {
  4380. case 'Lt': return vl < wl;
  4381. case 'LtE': return vl <= wl;
  4382. case 'Eq': return vl === wl;
  4383. case 'NotEq': return vl !== wl;
  4384. case 'Gt': return vl > wl;
  4385. case 'GtE': return vl >= wl;
  4386. default: goog.asserts.fail();
  4387. }
  4388. }
  4389. // we have an item that's different
  4390. // shortcuts for eq/not
  4391. if (op === 'Eq') return false;
  4392. if (op === 'NotEq') return true;
  4393. // or, compare the differing element using the proper operator
  4394. return Sk.misceval.richCompareBool(v[i], w[i], op);
  4395. };
  4396. Sk.builtin.tuple.prototype.sq$concat = function(other)
  4397. {
  4398. return new Sk.builtin.tuple(this.v.concat(other.v));
  4399. };
  4400. Sk.builtin.tuple.prototype.sq$length = function() { return this.v.length; };
  4401. /**
  4402. * @constructor
  4403. * @param {Array.<Object>} L
  4404. */
  4405. Sk.builtin.dict = function dict(L)
  4406. {
  4407. if (!(this instanceof Sk.builtin.dict)) return new Sk.builtin.dict(L);
  4408. this.size = 0;
  4409. for (var i = 0; i < L.length; i += 2)
  4410. {
  4411. this.mp$ass_subscript(L[i], L[i+1]);
  4412. }
  4413. this.__class__ = this.nativeclass$ = Sk.builtin.dict;
  4414. return this;
  4415. };
  4416. goog.exportSymbol("Sk.builtin.dict", Sk.builtin.dict);
  4417. Sk.builtin.dict.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('dict', Sk.builtin.dict);
  4418. var kf = Sk.builtin.hash;
  4419. Sk.builtin.dict.prototype.mp$subscript = function(key)
  4420. {
  4421. var entry = this[kf(key)];
  4422. // todo; does this need to go through mp$ma_lookup
  4423. return entry === undefined ? undefined : entry.rhs;
  4424. };
  4425. Sk.builtin.dict.prototype.mp$ass_subscript = function(key, w)
  4426. {
  4427. var k = kf(key);
  4428. if (w === null)
  4429. {
  4430. if (this[k] !== undefined)
  4431. {
  4432. this.size -=1;
  4433. delete this[k];
  4434. }
  4435. else
  4436. {
  4437. // todo; throw?
  4438. }
  4439. }
  4440. else
  4441. {
  4442. this[k] = { lhs: key, rhs: w };
  4443. this.size += 1;
  4444. }
  4445. };
  4446. Sk.builtin.dict.prototype.tp$iter = function()
  4447. {
  4448. var allkeys = [];
  4449. for (var k in this)
  4450. {
  4451. if (this.hasOwnProperty(k))
  4452. {
  4453. var i = this[k];
  4454. if (i && i.hasOwnProperty('lhs')) // skip internal stuff. todo; merge pyobj and this
  4455. {
  4456. allkeys.push(k);
  4457. }
  4458. }
  4459. }
  4460. //print(allkeys);
  4461. var ret =
  4462. {
  4463. tp$iter: function() { return ret; },
  4464. $obj: this,
  4465. $index: 0,
  4466. $keys: allkeys,
  4467. tp$iternext: function()
  4468. {
  4469. // todo; StopIteration
  4470. if (ret.$index >= ret.$keys.length) return undefined;
  4471. return ret.$obj[ret.$keys[ret.$index++]].lhs;
  4472. }
  4473. };
  4474. return ret;
  4475. };
  4476. Sk.builtin.dict.prototype.tp$repr = function()
  4477. {
  4478. var ret = [];
  4479. for (var iter = this.tp$iter(), k = iter.tp$iternext();
  4480. k !== undefined;
  4481. k = iter.tp$iternext())
  4482. {
  4483. var v = this.mp$subscript(k);
  4484. if (v === undefined)
  4485. {
  4486. //print(k, "had undefined v");
  4487. v = null;
  4488. }
  4489. ret.push(Sk.misceval.objectRepr(k).v + ": " + Sk.misceval.objectRepr(v).v);
  4490. }
  4491. return new Sk.builtin.str("{" + ret.join(", ") + "}");
  4492. };
  4493. Sk.builtin.dict.prototype.mp$length = function() { return this.size; };
  4494. Sk.builtin.dict.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  4495. Sk.builtin.dict.prototype.get = new Sk.builtin.func(function(self, k, d)
  4496. {
  4497. var ret = self.mp$subscript(k);
  4498. if (ret !== undefined) return ret;
  4499. return d;
  4500. });
  4501. /*
  4502. $.prototype.clear = function() { throw "todo; dict.clear"; };
  4503. $.prototype.copy = function() { throw "todo; dict.copy"; };
  4504. $.prototype.fromkeys = function() { throw "todo; dict.fromkeys"; };
  4505. $.prototype.get = function() { throw "todo; dict.get"; };
  4506. $.prototype.has_key = function(key)
  4507. {
  4508. return this.hasOwnProperty(kf(key));
  4509. };
  4510. $.prototype.items = function() { throw "todo; dict.items"; };
  4511. $.prototype.iteritems = function() { throw "todo; dict.iteritems"; };
  4512. $.prototype.iterkeys = function() { throw "todo; dict.iterkeys"; };
  4513. $.prototype.itervalues = function() { throw "todo; dict.itervalues"; };
  4514. $.prototype.keys = function() { throw "todo; dict.keys"; };
  4515. $.prototype.pop = function() { throw "todo; dict.pop"; };
  4516. $.prototype.popitem = function() { throw "todo; dict.popitem"; };
  4517. $.prototype.setdefault = function() { throw "todo; dict.setdefault"; };
  4518. $.prototype.update = function() { throw "todo; dict.update"; };
  4519. $.prototype.values = function() { throw "todo; dict.values"; };
  4520. $.prototype.__getitem__ = function(key)
  4521. {
  4522. var entry = this[kf(key)];
  4523. return typeof entry === 'undefined' ? undefined : entry.rhs;
  4524. };
  4525. $.prototype.__delitem__ = function(key)
  4526. {
  4527. var k = kf(key);
  4528. if (this.hasOwnProperty(k))
  4529. {
  4530. this.size -= 1;
  4531. delete this[k];
  4532. }
  4533. return this;
  4534. };
  4535. $.prototype.__class__ = new Sk.builtin.type('dict', [Sk.types.object], {});
  4536. $.prototype.__iter__ = function()
  4537. {
  4538. var allkeys = [];
  4539. for (var k in this)
  4540. {
  4541. if (this.hasOwnProperty(k))
  4542. {
  4543. var i = this[k];
  4544. if (i && i.hasOwnProperty('lhs')) // skip internal stuff. todo; merge pyobj and this
  4545. {
  4546. allkeys.push(k);
  4547. }
  4548. }
  4549. }
  4550. //print(allkeys);
  4551. var ret =
  4552. {
  4553. __iter__: function() { return ret; },
  4554. $obj: this,
  4555. $index: 0,
  4556. $keys: allkeys,
  4557. next: function()
  4558. {
  4559. // todo; StopIteration
  4560. if (ret.$index >= ret.$keys.length) return undefined;
  4561. return ret.$obj[ret.$keys[ret.$index++]].lhs;
  4562. }
  4563. };
  4564. return ret;
  4565. };
  4566. */
  4567. // long aka "bigint" implementation
  4568. //
  4569. // the representation used is similar to python 2.6's:
  4570. //
  4571. // - each 'digit' of the long is 15 bits, which gives enough space in each to
  4572. // perform a multiplication without losing precision in the mantissa of
  4573. // javascript's number representation (a double).
  4574. //
  4575. // - the numbers are stored as the absolute value of the number, with an
  4576. // additional size field that's the number of digits in the long. if size < 0,
  4577. // the number is negative, and it's 0 if the long is 0.
  4578. //
  4579. // some of the implementation is also ported from longobject.c in python2.6.
  4580. //
  4581. // it's better not to think about how many processor-level instructions this
  4582. // is causing!
  4583. /**
  4584. * @constructor
  4585. * @param {number} size number of digits
  4586. */
  4587. Sk.builtin.lng = function(size) /* long is a reserved word */
  4588. {
  4589. if (!(this instanceof Sk.builtin.lng)) return new Sk.builtin.lng(size);
  4590. this.digit$ = new Array(Math.abs(size));
  4591. this.size$ = size;
  4592. return this;
  4593. };
  4594. Sk.builtin.lng.tp$index = function()
  4595. {
  4596. goog.asserts.fail("todo;");
  4597. };
  4598. Sk.builtin.lng.prototype.tp$name = "long";
  4599. Sk.builtin.lng.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('long', Sk.builtin.lng);
  4600. Sk.builtin.lng.SHIFT$ = 15;
  4601. Sk.builtin.lng.BASE$ = 1 << Sk.builtin.lng.SHIFT$;
  4602. Sk.builtin.lng.MASK$ = Sk.builtin.lng.BASE$ - 1;
  4603. Sk.builtin.lng.threshold$ = Math.pow(2, 30);
  4604. Sk.builtin.lng.fromInt$ = function(ival)
  4605. {
  4606. var negative = false;
  4607. if (ival < 0)
  4608. {
  4609. ival = -ival;
  4610. negative = true;
  4611. }
  4612. var t = ival;
  4613. var ndigits = 0;
  4614. while (t)
  4615. {
  4616. ndigits += 1;
  4617. t >>= Sk.builtin.lng.SHIFT$;
  4618. }
  4619. var ret = new Sk.builtin.lng(ndigits);
  4620. if (negative) ret.size$ = -ret.size$;
  4621. t = ival;
  4622. var i = 0;
  4623. while (t)
  4624. {
  4625. ret.digit$[i] = t & Sk.builtin.lng.MASK$;
  4626. t >>= Sk.builtin.lng.SHIFT$;
  4627. i += 1;
  4628. }
  4629. return ret;
  4630. };
  4631. // mul by single digit, ignoring sign
  4632. Sk.builtin.lng.mulInt$ = function(a, n)
  4633. {
  4634. var size_a = Math.abs(a.size$);
  4635. var z = new Sk.builtin.lng(size_a + 1);
  4636. var carry = 0;
  4637. var i;
  4638. for (i = 0; i < size_a; ++i)
  4639. {
  4640. carry += a.digit$[i] * n;
  4641. z.digit$[i] = carry & Sk.builtin.lng.MASK$;
  4642. carry >>= Sk.builtin.lng.SHIFT$;
  4643. }
  4644. z.digit$[i] = carry;
  4645. return Sk.builtin.lng.normalize$(z);
  4646. };
  4647. // js string (not Sk.builtin.str) -> long. used to create longs in transformer, respects
  4648. // 0x, 0o, 0b, etc.
  4649. Sk.longFromStr = function(s)
  4650. {
  4651. goog.asserts.assert(s.charAt(s.length - 1) !== "L" && s.charAt(s.length - 1) !== 'l', "L suffix should be removed before here");
  4652. //print("initial fromJsStr:",s);
  4653. var neg = false;
  4654. if (s.substr(0, 1) === "-")
  4655. {
  4656. s = s.substr(1);
  4657. neg = true;
  4658. }
  4659. var base = 10;
  4660. if (s.substr(0, 2) === "0x" || s.substr(0, 2) === "0X")
  4661. {
  4662. s = s.substr(2);
  4663. base = 16;
  4664. }
  4665. else if (s.substr(0, 2) === "0o")
  4666. {
  4667. s = s.substr(2);
  4668. base = 8;
  4669. }
  4670. else if (s.substr(0, 1) === "0")
  4671. {
  4672. s = s.substr(1);
  4673. base = 8;
  4674. }
  4675. else if (s.substr(0, 2) === "0b")
  4676. {
  4677. s = s.substr(2);
  4678. base = 2;
  4679. }
  4680. //print("base:",base, "rest:",s);
  4681. var ret = Sk.builtin.lng.fromInt$(0);
  4682. var col = Sk.builtin.lng.fromInt$(1);
  4683. var add;
  4684. for (var i = s.length - 1; i >= 0; --i)
  4685. {
  4686. add = Sk.builtin.lng.mulInt$(col, parseInt(s.substr(i, 1), 16));
  4687. ret = ret.nb$add(add);
  4688. col = Sk.builtin.lng.mulInt$(col, base);
  4689. //print("i", i, "ret", ret.digit$, ret.size$, "col", col.digit$, col.size$, ":",s.substr(i, 1), ":",parseInt(s.substr(i, 1), 10));
  4690. }
  4691. if (neg) ret.size$ = -ret.size$;
  4692. return ret;
  4693. };
  4694. Sk.builtin.lng.prototype.clone = function()
  4695. {
  4696. var ret = new Sk.builtin.lng(this.size$);
  4697. ret.digit$ = this.digit$.slice(0);
  4698. return ret;
  4699. };
  4700. Sk.builtin.lng.prototype.nb$add = function(other)
  4701. {
  4702. // todo; upconvert other to long
  4703. var z;
  4704. if (this.size$ < 0)
  4705. {
  4706. if (other.size$ < 0)
  4707. {
  4708. z = Sk.builtin.lng.add$(this, other);
  4709. z.size$ = -z.size$;
  4710. }
  4711. else
  4712. {
  4713. z = Sk.builtin.lng.sub$(other, this);
  4714. }
  4715. }
  4716. else
  4717. {
  4718. if (other.size$ < 0)
  4719. z = Sk.builtin.lng.sub$(this, other);
  4720. else
  4721. z = Sk.builtin.lng.add$(this, other);
  4722. }
  4723. return z;
  4724. };
  4725. Sk.builtin.lng.prototype.nb$inplace_add = Sk.builtin.lng.prototype.nb$add;
  4726. Sk.builtin.lng.prototype.nb$subtract = function(other)
  4727. {
  4728. // todo; upconvert other
  4729. var z;
  4730. if (this.size$ < 0)
  4731. {
  4732. if (other.size$ < 0)
  4733. z = Sk.builtin.lng.sub$(this, other);
  4734. else
  4735. z = Sk.builtin.lng.add$(this, other);
  4736. z.size$ = -z.size$;
  4737. }
  4738. else
  4739. {
  4740. if (other.size < 0)
  4741. z = Sk.builtin.lng.add$(this, other);
  4742. else
  4743. z = Sk.builtin.lng.sub$(this, other);
  4744. }
  4745. return z;
  4746. };
  4747. Sk.builtin.lng.prototype.nb$multiply = function(other)
  4748. {
  4749. // todo; upconvert
  4750. var z = Sk.builtin.lng.mul$(this, other);
  4751. if (this.size$ * other.size$ < 0)
  4752. z.size$ = -z.size$;
  4753. return z;
  4754. };
  4755. Sk.builtin.lng.prototype.nb$power = function(n)
  4756. {
  4757. // todo; upconvert n
  4758. var ret = Sk.builtin.lng.fromInt$(1);
  4759. var x = this.clone();
  4760. while (n.size$ > 0)
  4761. {
  4762. if (n.digit$[0] % 2 !== 0) // odd
  4763. {
  4764. ret = Sk.builtin.lng.mul$(ret, x);
  4765. n.digit$[0] &= ~1;
  4766. }
  4767. x = Sk.builtin.lng.mul$(x, x);
  4768. n.divremInt$(2);
  4769. }
  4770. if (this.size$ < 0) ret.size$ = -ret.size$;
  4771. return ret;
  4772. };
  4773. Sk.builtin.lng.prototype.nb$negative = function()
  4774. {
  4775. var ret = this.clone();
  4776. ret.size$ = -ret.size$;
  4777. return ret;
  4778. };
  4779. Sk.builtin.lng.prototype.nb$positive = function() { return this; };
  4780. Sk.builtin.lng.prototype.divrem$ = function(other)
  4781. {
  4782. var size_a = Math.abs(this.size$);
  4783. var size_b = Math.abs(other.size$);
  4784. var z;
  4785. var rem;
  4786. if (other.size$ === 0)
  4787. throw new Sk.builtin.ZeroDivisionError("long division or modulo by zero");
  4788. if (size_a < size_b ||
  4789. this.digit$[size_a - 1] < other.digit$[size_b - 1])
  4790. {
  4791. // |this| < |other|
  4792. return [0, this];
  4793. }
  4794. if (size_b === 1)
  4795. {
  4796. z = this.clone();
  4797. var remi = z.divremInt$(other.digit$[0]);
  4798. rem = new Sk.builtin.lng(1);
  4799. rem.digit$[0] = remi;
  4800. }
  4801. else
  4802. {
  4803. var tmp = Sk.builtin.lng.divremFull$(this, other);
  4804. z = tmp[0];
  4805. rem = tmp[1];
  4806. }
  4807. // z has sign of this*other, remainder has sign of a so that this=other*z+r
  4808. if ((this.size$ < 0) !== (other.size$ < 0))
  4809. z.size$ = -z.size$;
  4810. if (this.size$ < 0 && rem.size$ !== 0)
  4811. rem.size$ = -rem.size$;
  4812. return [z, rem];
  4813. };
  4814. Sk.builtin.lng.divremFull$ = function(v1, w1)
  4815. {
  4816. throw "todo;";
  4817. /*
  4818. var size_v = Math.abs(v1.size$);
  4819. var size_w = Math.abs(w1.size$);
  4820. var d = Sk.builtin.lng.BASE$ / (w1.digit[size_w - 1] + 1);
  4821. var v = Sk.builtin.lng.mulInt$(v1, d);
  4822. var w = Sk.builtin.lng.mulInt$(w1, d);
  4823. */
  4824. };
  4825. Sk.builtin.lng.normalize$ = function(v)
  4826. {
  4827. var j = Math.abs(v.size$);
  4828. var i = j;
  4829. while (i > 0 && v.digit$[i - 1] === 0)
  4830. --i;
  4831. if (i !== j)
  4832. v.size$ = v.size$ < 0 ? -i : i;
  4833. return v;
  4834. };
  4835. // Add the absolute values of two longs
  4836. Sk.builtin.lng.add$ = function(a, b)
  4837. {
  4838. var size_a = Math.abs(a.size$);
  4839. var size_b = Math.abs(b.size$);
  4840. var z;
  4841. var i;
  4842. var carry = 0;
  4843. // ensure a is the larger of the two
  4844. if (size_a < size_b)
  4845. {
  4846. var tmp = a; a = b; b = tmp;
  4847. tmp = size_a; size_a = size_b; size_b = tmp;
  4848. }
  4849. z = new Sk.builtin.lng(size_a + 1);
  4850. for (i = 0; i < size_b; ++i)
  4851. {
  4852. carry += a.digit$[i] + b.digit$[i];
  4853. z.digit$[i] = carry & Sk.builtin.lng.MASK$;
  4854. carry >>= Sk.builtin.lng.SHIFT$;
  4855. }
  4856. for (; i < size_a; ++i)
  4857. {
  4858. carry += a.digit$[i];
  4859. z.digit$[i] = carry & Sk.builtin.lng.MASK$;
  4860. carry >>= Sk.builtin.lng.SHIFT$;
  4861. }
  4862. z.digit$[i] = carry;
  4863. return Sk.builtin.lng.normalize$(z);
  4864. };
  4865. // Subtract the absolute values of two longs
  4866. Sk.builtin.lng.sub$ = function(a, b)
  4867. {
  4868. var size_a = Math.abs(a.size$);
  4869. var size_b = Math.abs(b.size$);
  4870. var z;
  4871. var i;
  4872. var sign = 1;
  4873. var borrow = 0;
  4874. var tmp;
  4875. // Ensure a is the larger of the two
  4876. if (size_a < size_b)
  4877. {
  4878. sign = -1;
  4879. tmp = a; a = b; b = tmp;
  4880. tmp = size_a; size_a = size_b; size_b = tmp;
  4881. }
  4882. else if (size_a === size_b)
  4883. {
  4884. // Find highest digit where a and b differ
  4885. i = size_a;
  4886. while (--i >= 0 && a.digit$[i] === b.digit$[i])
  4887. {
  4888. // nothing
  4889. }
  4890. if (i < 0) return new Sk.builtin.lng(0);
  4891. if (a.digit$[i] < b.digit$[i])
  4892. {
  4893. sign = -1;
  4894. tmp = a; a = b; b = tmp;
  4895. }
  4896. size_a = size_b = i + 1;
  4897. }
  4898. z = new Sk.builtin.lng(size_a);
  4899. for (i = 0; i < size_b; ++i)
  4900. {
  4901. // todo; this isn't true in js i don't think
  4902. // The following assumes unsigned arithmetic
  4903. // works modulo 2**N for some N>SHIFT
  4904. borrow = a.digit$[i] - b.digit$[i] - borrow;
  4905. z.digit$[i] = borrow & Sk.builtin.lng.MASK$;
  4906. borrow >>= Sk.builtin.lng.SHIFT$;
  4907. borrow &= 1; // Keep only one sign bit
  4908. }
  4909. for (; i < size_a; ++i)
  4910. {
  4911. borrow = a.digit$[i] - borrow;
  4912. z.digit$[i] = borrow & Sk.builtin.lng.MASK$;
  4913. borrow >>= Sk.builtin.lng.SHIFT$;
  4914. borrow &= 1; // Keep only one sign bit
  4915. }
  4916. goog.asserts.assert(borrow === 0);
  4917. if (sign < 0)
  4918. z.size$ = -z.size$;
  4919. return Sk.builtin.lng.normalize$(z);
  4920. };
  4921. // "grade school" multiplication, ignoring the signs.
  4922. // returns abs of product.
  4923. // todo; karatsuba is O better after a few 100 digits long, but more
  4924. // complicated for now.
  4925. Sk.builtin.lng.mul$ = function(a, b)
  4926. {
  4927. var size_a = Math.abs(a.size$);
  4928. var size_b = Math.abs(b.size$);
  4929. var z = new Sk.builtin.lng(size_a + size_b);
  4930. var i;
  4931. for (i = 0; i < size_a + size_b; ++i) z.digit$[i] = 0;
  4932. //print("size_a",size_a,"size_b",size_b,"tot", size_a+size_b);
  4933. for (i = 0; i < size_a; ++i)
  4934. {
  4935. var carry = 0;
  4936. var k = i;
  4937. var f = a.digit$[i];
  4938. for (var j = 0; j < size_b; ++j)
  4939. {
  4940. carry += z.digit$[k] + b.digit$[j] * f;
  4941. //print("@",k,j,carry);
  4942. z.digit$[k++] = carry & Sk.builtin.lng.MASK$;
  4943. //print("stored:",z.digit$[i]);
  4944. carry >>= Sk.builtin.lng.SHIFT$;
  4945. //print("carry shifted to:",carry);
  4946. goog.asserts.assert(carry <= Sk.builtin.lng.MASK$);
  4947. }
  4948. if (carry)
  4949. z.digit$[k++] += carry & Sk.builtin.lng.MASK$;
  4950. }
  4951. Sk.builtin.lng.normalize$(z);
  4952. return z;
  4953. };
  4954. Sk.builtin.lng.prototype.nb$nonzero = function()
  4955. {
  4956. return this.size$ !== 0;
  4957. };
  4958. // divide this by non-zero digit n (inplace). return remainder.
  4959. Sk.builtin.lng.prototype.divremInt$ = function(n)
  4960. {
  4961. var rem;
  4962. var cur = Math.abs(this.size$);
  4963. while (--cur >= 0)
  4964. {
  4965. var hi;
  4966. rem = (rem << Sk.builtin.lng.SHIFT$) + this.digit$[cur];
  4967. this.digit$[cur] = hi = Math.floor(rem / n);
  4968. rem -= hi * n;
  4969. }
  4970. Sk.builtin.lng.normalize$(this);
  4971. return rem;
  4972. };
  4973. Sk.builtin.lng.prototype.tp$repr = function()
  4974. {
  4975. return new Sk.builtin.str(this.str$(10, true) + "L");
  4976. };
  4977. Sk.builtin.lng.prototype.tp$str = function()
  4978. {
  4979. return new Sk.builtin.str(this.str$(10, true));
  4980. };
  4981. Sk.builtin.lng.prototype.str$ = function(base, sign)
  4982. {
  4983. if (this.size$ === 0) return "0";
  4984. if (base === undefined) base = 10;
  4985. if (sign === undefined) sign = true;
  4986. var ret = "";
  4987. var tmp = this.clone();
  4988. while (tmp.nb$nonzero())
  4989. {
  4990. //print("before d:",tmp.digit$, "s:",tmp.size$);
  4991. var t = tmp.divremInt$(base);
  4992. //print("after d:",tmp.digit$, "s:",tmp.size$);
  4993. //print("t:",t);
  4994. ret = "0123456789abcdef".substring(t, t + 1) + ret;
  4995. }
  4996. return (sign && this.size$ < 0 ? "-" : "") + ret;
  4997. };
  4998. /**
  4999. * @constructor
  5000. * @param {number} start
  5001. * @param {number=} stop
  5002. * @param {null|number=} step
  5003. */
  5004. Sk.builtin.slice = function slice(start, stop, step)
  5005. {
  5006. if (!(this instanceof Sk.builtin.slice)) return new Sk.builtin.slice(start, stop, step);
  5007. if (stop === undefined && step === undefined)
  5008. {
  5009. stop = start;
  5010. start = null;
  5011. }
  5012. if (!start) start = null;
  5013. if (stop === undefined) stop = null;
  5014. if (step === undefined) step = null;
  5015. this.start = start;
  5016. this.stop = stop;
  5017. this.step = step;
  5018. return this;
  5019. };
  5020. Sk.builtin.slice.prototype.tp$str = function()
  5021. {
  5022. var a = Sk.builtin.repr(this.start).v;
  5023. var b = Sk.builtin.repr(this.stop).v;
  5024. var c = Sk.builtin.repr(this.step).v;
  5025. return new Sk.builtin.str("slice(" + a + ", " + b + ", " + c + ")");
  5026. };
  5027. Sk.builtin.slice.prototype.indices = function(length)
  5028. {
  5029. // this seems ugly, better way?
  5030. var start = this.start, stop = this.stop, step = this.step, i;
  5031. if (step === null) step = 1;
  5032. if (step > 0)
  5033. {
  5034. if (start === null) start = 0;
  5035. if (stop === null) stop = length;
  5036. if (start < 0) start = length + start;
  5037. if (stop < 0) stop = length + stop;
  5038. }
  5039. else
  5040. {
  5041. if (start === null) start = length - 1;
  5042. else if (start < 0) start = length + start;
  5043. if (stop === null) stop = -1;
  5044. else if (stop < 0) stop = length + stop;
  5045. }
  5046. return [start, stop, step];
  5047. };
  5048. Sk.builtin.slice.prototype.sssiter$ = function(wrt, f)
  5049. {
  5050. var sss = this.indices(typeof wrt === "number" ? wrt : wrt.v.length);
  5051. if (sss[2] > 0)
  5052. {
  5053. var i;
  5054. for (i = sss[0]; i < sss[1]; i += sss[2])
  5055. if (f(i, wrt) === false) return;
  5056. }
  5057. else
  5058. {
  5059. for (i = sss[0]; i > sss[1]; i += sss[2])
  5060. if (f(i, wrt) === false) return;
  5061. }
  5062. };
  5063. /**
  5064. * @constructor
  5065. */
  5066. Sk.builtin.module = function()
  5067. {
  5068. };
  5069. Sk.builtin.module.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('module', Sk.builtin.module);
  5070. Sk.builtin.module.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  5071. Sk.builtin.module.prototype.tp$setattr = Sk.builtin.object.prototype.GenericSetAttr;
  5072. /**
  5073. * @constructor
  5074. * @param {Function} code javascript code object for the function
  5075. * @param {Object} globals where this function was defined
  5076. * @param {Object} args arguments to the original call (stored into locals for
  5077. * the generator to reenter)
  5078. * @param {Object=} closure dict of free variables
  5079. * @param {Object=} closure2 another dict of free variables that will be
  5080. * merged into 'closure'. there's 2 to simplify generated code (one is $free,
  5081. * the other is $cell)
  5082. *
  5083. * co_varnames and co_name come from generated code, must access as dict.
  5084. */
  5085. Sk.builtin.generator = function(code, globals, args, closure, closure2)
  5086. {
  5087. if (!code) return; // ctor hack
  5088. this.func_code = code;
  5089. this.func_globals = globals || null;
  5090. this.gi$running = false;
  5091. this.gi$resumeat = 0;
  5092. this.gi$locals = {};
  5093. if (args.length > 0)
  5094. {
  5095. // store arguments into locals because they have to be maintained
  5096. // too. 'fast' var lookups are locals in generator functions.
  5097. for (var i = 0; i < code['co_varnames'].length; ++i)
  5098. this.gi$locals[code['co_varnames'][i]] = args[i];
  5099. }
  5100. if (closure2 !== undefined)
  5101. {
  5102. // todo; confirm that modification here can't cause problems
  5103. for (var k in closure2)
  5104. closure[k] = closure2[k];
  5105. }
  5106. //print(JSON.stringify(closure));
  5107. this.func_closure = closure;
  5108. return this;
  5109. };
  5110. Sk.builtin.generator.prototype.tp$getattr = Sk.builtin.object.prototype.GenericGetAttr;
  5111. Sk.builtin.generator.prototype.tp$iter = function()
  5112. {
  5113. return this;
  5114. };
  5115. Sk.builtin.generator.prototype.tp$iternext = function()
  5116. {
  5117. this.gi$running = true;
  5118. // note: functions expect 'this' to be globals to avoid having to
  5119. // slice/unshift onto the main args
  5120. var args = [ this ];
  5121. if (this.func_closure)
  5122. args.push(this.func_closure);
  5123. var ret = this.func_code.apply(this.func_globals, args);
  5124. //print("ret", JSON.stringify(ret));
  5125. this.gi$running = false;
  5126. goog.asserts.assert(ret !== undefined);
  5127. if (ret !== null)
  5128. {
  5129. // returns a pair: resume target and yielded value
  5130. this.gi$resumeat = ret[0];
  5131. ret = ret[1];
  5132. }
  5133. else
  5134. {
  5135. // todo; StopIteration
  5136. return undefined;
  5137. }
  5138. //print("returning:", JSON.stringify(ret));
  5139. return ret;
  5140. };
  5141. Sk.builtin.generator.prototype.next = new Sk.builtin.func(function(self)
  5142. {
  5143. return self.tp$iternext();
  5144. });
  5145. Sk.builtin.generator.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj('generator', Sk.builtin.generator);
  5146. Sk.builtin.generator.prototype.tp$repr = function()
  5147. {
  5148. return new Sk.builtin.str("<generator object " + this.func_code['co_name'].v + ">");
  5149. };
  5150. /**
  5151. * @constructor
  5152. * @param {Sk.builtin.str} name
  5153. * @param {Sk.builtin.str} mode
  5154. * @param {Object} buffering
  5155. */
  5156. Sk.builtin.file = function(name, mode, buffering)
  5157. {
  5158. this.mode = mode;
  5159. this.name = name;
  5160. this.closed = false;
  5161. this.data$ = Sk.read(name.v);
  5162. this.pos$ = 0;
  5163. return this;
  5164. };
  5165. Sk.builtin.file.prototype.tp$repr = function()
  5166. {
  5167. return new Sk.builtin.str("<"
  5168. + (this.closed ? "closed" : "open")
  5169. + "file '"
  5170. + this.name
  5171. + "', mode '"
  5172. + this.mode
  5173. + "'>");
  5174. };
  5175. Sk.builtin.file.close = function(self)
  5176. {
  5177. self.closed = true;
  5178. };
  5179. Sk.builtin.file.flush = function(self) {};
  5180. Sk.builtin.file.fileno = function(self) { return 10; }; // > 0, not 1/2/3
  5181. Sk.builtin.file.isatty = function(self) { return false; };
  5182. Sk.builtin.file.next = function(self) { throw "todo; file.next"; };
  5183. Sk.builtin.file.read = function(self, size)
  5184. {
  5185. if (self.closed) throw new Sk.builtin.ValueError("I/O operation on closed file");
  5186. var len = self.data$.length;
  5187. if (size === undefined) size = len;
  5188. var ret = new Sk.builtin.str(self.data$.substr(self.pos$, size));
  5189. self.pos$ += size;
  5190. if (self.pos$ >= len) self.pos$ = len;
  5191. return ret;
  5192. };
  5193. Sk.builtin.file.readline = function(self, size)
  5194. {
  5195. goog.asserts.fail();
  5196. };
  5197. Sk.builtin.file.readlines = function(self, sizehint)
  5198. {
  5199. goog.asserts.fail();
  5200. };
  5201. Sk.builtin.file.seek = function(self, offset, whence)
  5202. {
  5203. goog.asserts.fail();
  5204. };
  5205. Sk.builtin.file.tell = function(self)
  5206. {
  5207. goog.asserts.fail();
  5208. };
  5209. Sk.builtin.file.truncate = function(self, size)
  5210. {
  5211. goog.asserts.fail();
  5212. };
  5213. Sk.builtin.file.write = function(self, str)
  5214. {
  5215. goog.asserts.fail();
  5216. };
  5217. Sk.builtin.file.writelines = function(self, sequence)
  5218. {
  5219. goog.asserts.fail();
  5220. };
  5221. Sk.ffi = Sk.ffi || {};
  5222. /**
  5223. * maps from Javascript Object/Array/string to Python dict/list/str.
  5224. *
  5225. * only works on basic objects that are being used as storage, doesn't handle
  5226. * functions, etc.
  5227. */
  5228. Sk.ffi.remapToPy = function(obj)
  5229. {
  5230. if (Object.prototype.toString.call(obj) === "[object Array]")
  5231. {
  5232. var arr = [];
  5233. for (var i = 0; i < obj.length; ++i)
  5234. arr.push(Sk.ffi.remapToPy(obj[i]));
  5235. return new Sk.builtin.list(arr);
  5236. }
  5237. else if (typeof obj === "object")
  5238. {
  5239. var kvs = [];
  5240. for (var k in obj)
  5241. {
  5242. kvs.push(Sk.ffi.remapToPy(k));
  5243. kvs.push(Sk.ffi.remapToPy(obj[k]));
  5244. }
  5245. return new Sk.builtin.dict(kvs);
  5246. }
  5247. else if (typeof obj === "string")
  5248. return new Sk.builtin.str(obj);
  5249. else if (typeof obj === "number" || typeof obj === "boolean")
  5250. return obj;
  5251. goog.asserts.fail("unhandled remap type");
  5252. };
  5253. /**
  5254. * maps from Python dict/list/str to Javascript Object/Array/string.
  5255. */
  5256. Sk.ffi.remapToJs = function(obj)
  5257. {
  5258. if (obj instanceof Sk.builtin.dict)
  5259. {
  5260. var ret = {};
  5261. for (var iter = obj.tp$iter(), k = iter.tp$iternext();
  5262. k !== undefined;
  5263. k = iter.tp$iternext())
  5264. {
  5265. var v = obj.mp$subscript(k);
  5266. if (v === undefined)
  5267. v = null;
  5268. var kAsJs = Sk.ffi.remapToJs(k);
  5269. // todo; assert that this is a reasonble lhs?
  5270. ret[kAsJs] = Sk.ffi.remapToJs(v);
  5271. }
  5272. return ret;
  5273. }
  5274. else if (obj instanceof Sk.builtin.list)
  5275. {
  5276. var ret = [];
  5277. for (var i = 0; i < obj.v.length; ++i)
  5278. ret.push(Sk.ffi.remapToJs(obj.v[i]));
  5279. return ret;
  5280. }
  5281. else if (obj instanceof Sk.builtin.str)
  5282. return obj.v;
  5283. else if (typeof obj === "number" || typeof obj === "boolean")
  5284. return obj;
  5285. goog.asserts.fail("unhandled remap type");
  5286. };
  5287. Sk.ffi.callback = function(fn)
  5288. {
  5289. if (fn === undefined) return fn;
  5290. return function() {
  5291. return Sk.misceval.apply(fn, undefined, Array.prototype.slice.call(arguments, 0));
  5292. };
  5293. };
  5294. Sk.ffi.stdwrap = function(type, towrap)
  5295. {
  5296. var inst = new type();
  5297. inst.v = towrap;
  5298. return inst;
  5299. };
  5300. /**
  5301. * for when the return type might be one of a variety of basic types.
  5302. * number|string, etc.
  5303. */
  5304. Sk.ffi.basicwrap = function(obj)
  5305. {
  5306. if (typeof obj === "number" || typeof obj === "boolean")
  5307. return obj;
  5308. if (typeof obj === "string")
  5309. return new Sk.builtin.str(obj);
  5310. goog.asserts.fail("unexpected type for basicwrap");
  5311. };
  5312. Sk.ffi.unwrapo = function(obj)
  5313. {
  5314. if (obj === undefined) return undefined;
  5315. return obj.v;
  5316. };
  5317. Sk.ffi.unwrapn = function(obj)
  5318. {
  5319. if (obj === null) return null;
  5320. return obj.v;
  5321. };
  5322. /*
  5323. * This is a port of tokenize.py by Ka-Ping Yee.
  5324. *
  5325. * each call to readline should return one line of input as a string, or
  5326. * undefined if it's finished.
  5327. *
  5328. * callback is called for each token with 5 args:
  5329. * 1. the token type
  5330. * 2. the token string
  5331. * 3. [ start_row, start_col ]
  5332. * 4. [ end_row, end_col ]
  5333. * 5. logical line where the token was found, including continuation lines
  5334. *
  5335. * callback can return true to abort.
  5336. *
  5337. */
  5338. /**
  5339. * @constructor
  5340. */
  5341. Sk.Tokenizer = function (filename, interactive, callback)
  5342. {
  5343. this.filename = filename;
  5344. this.callback = callback;
  5345. this.lnum = 0;
  5346. this.parenlev = 0;
  5347. this.continued = false;
  5348. this.namechars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_';
  5349. this.numchars = '0123456789';
  5350. this.contstr = '';
  5351. this.needcont = false;
  5352. this.contline = undefined;
  5353. this.indents = [0];
  5354. this.endprog = /.*/;
  5355. this.strstart = [-1,-1];
  5356. this.interactive = interactive;
  5357. this.doneFunc = function()
  5358. {
  5359. for (var i = 1; i < this.indents.length; ++i) // pop remaining indent levels
  5360. {
  5361. if (this.callback(Sk.Tokenizer.T_DEDENT, '', [this.lnum, 0], [this.lnum, 0], '')) return 'done';
  5362. }
  5363. if (this.callback(Sk.Tokenizer.T_ENDMARKER, '', [this.lnum, 0], [this.lnum, 0], '')) return 'done';
  5364. return 'failed';
  5365. };
  5366. };
  5367. Sk.Tokenizer.T_ENDMARKER = 0;
  5368. Sk.Tokenizer.T_NAME = 1;
  5369. Sk.Tokenizer.T_NUMBER = 2;
  5370. Sk.Tokenizer.T_STRING = 3;
  5371. Sk.Tokenizer.T_NEWLINE = 4;
  5372. Sk.Tokenizer.T_INDENT = 5;
  5373. Sk.Tokenizer.T_DEDENT = 6;
  5374. Sk.Tokenizer.T_LPAR = 7;
  5375. Sk.Tokenizer.T_RPAR = 8;
  5376. Sk.Tokenizer.T_LSQB = 9;
  5377. Sk.Tokenizer.T_RSQB = 10;
  5378. Sk.Tokenizer.T_COLON = 11;
  5379. Sk.Tokenizer.T_COMMA = 12;
  5380. Sk.Tokenizer.T_SEMI = 13;
  5381. Sk.Tokenizer.T_PLUS = 14;
  5382. Sk.Tokenizer.T_MINUS = 15;
  5383. Sk.Tokenizer.T_STAR = 16;
  5384. Sk.Tokenizer.T_SLASH = 17;
  5385. Sk.Tokenizer.T_VBAR = 18;
  5386. Sk.Tokenizer.T_AMPER = 19;
  5387. Sk.Tokenizer.T_LESS = 20;
  5388. Sk.Tokenizer.T_GREATER = 21;
  5389. Sk.Tokenizer.T_EQUAL = 22;
  5390. Sk.Tokenizer.T_DOT = 23;
  5391. Sk.Tokenizer.T_PERCENT = 24;
  5392. Sk.Tokenizer.T_BACKQUOTE = 25;
  5393. Sk.Tokenizer.T_LBRACE = 26;
  5394. Sk.Tokenizer.T_RBRACE = 27;
  5395. Sk.Tokenizer.T_EQEQUAL = 28;
  5396. Sk.Tokenizer.T_NOTEQUAL = 29;
  5397. Sk.Tokenizer.T_LESSEQUAL = 30;
  5398. Sk.Tokenizer.T_GREATEREQUAL = 31;
  5399. Sk.Tokenizer.T_TILDE = 32;
  5400. Sk.Tokenizer.T_CIRCUMFLEX = 33;
  5401. Sk.Tokenizer.T_LEFTSHIFT = 34;
  5402. Sk.Tokenizer.T_RIGHTSHIFT = 35;
  5403. Sk.Tokenizer.T_DOUBLESTAR = 36;
  5404. Sk.Tokenizer.T_PLUSEQUAL = 37;
  5405. Sk.Tokenizer.T_MINEQUAL = 38;
  5406. Sk.Tokenizer.T_STAREQUAL = 39
  5407. Sk.Tokenizer.T_SLASHEQUAL = 40;
  5408. Sk.Tokenizer.T_PERCENTEQUAL = 41;
  5409. Sk.Tokenizer.T_AMPEREQUAL = 42;
  5410. Sk.Tokenizer.T_VBAREQUAL = 43;
  5411. Sk.Tokenizer.T_CIRCUMFLEXEQUAL = 44;
  5412. Sk.Tokenizer.T_LEFTSHIFTEQUAL = 45;
  5413. Sk.Tokenizer.T_RIGHTSHIFTEQUAL = 46;
  5414. Sk.Tokenizer.T_DOUBLESTAREQUAL = 47;
  5415. Sk.Tokenizer.T_DOUBLESLASH = 48;
  5416. Sk.Tokenizer.T_DOUBLESLASHEQUAL = 49;
  5417. Sk.Tokenizer.T_AT = 50;
  5418. Sk.Tokenizer.T_OP = 51;
  5419. Sk.Tokenizer.T_COMMENT = 52;
  5420. Sk.Tokenizer.T_NL = 53;
  5421. Sk.Tokenizer.T_RARROW = 54;
  5422. Sk.Tokenizer.T_ERRORTOKEN = 55;
  5423. Sk.Tokenizer.T_N_TOKENS = 56;
  5424. Sk.Tokenizer.T_NT_OFFSET = 256;
  5425. /** @param {...*} x */
  5426. function group(x)
  5427. {
  5428. var args = Array.prototype.slice.call(arguments);
  5429. return '(' + args.join('|') + ')';
  5430. }
  5431. /** @param {...*} x */
  5432. function any(x) { return group.apply(null, arguments) + "*"; }
  5433. /** @param {...*} x */
  5434. function maybe(x) { return group.apply(null, arguments) + "?"; }
  5435. /* we have to use string and ctor to be able to build patterns up. + on /.../
  5436. * does something strange. */
  5437. var Whitespace = "[ \\f\\t]*";
  5438. var Comment_ = "#[^\\r\\n]*";
  5439. var Ident = "[a-zA-Z_]\\w*";
  5440. var Binnumber = '0[bB][01]*';
  5441. var Hexnumber = '0[xX][\\da-fA-F]*[lL]?';
  5442. var Octnumber = '0[oO]?[0-7]*[lL]?';
  5443. var Decnumber = '[1-9]\\d*[lL]?';
  5444. var Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber);
  5445. var Exponent = "[eE][-+]?\\d+";
  5446. var Pointfloat = group("\\d+\\.\\d*", "\\.\\d+") + maybe(Exponent);
  5447. var Expfloat = '\\d+' + Exponent;
  5448. var Floatnumber = group(Pointfloat, Expfloat);
  5449. var Imagnumber = group("\\d+[jJ]", Floatnumber + "[jJ]");
  5450. var Number_ = group(Imagnumber, Floatnumber, Intnumber);
  5451. // tail end of ' string
  5452. var Single = "[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
  5453. // tail end of " string
  5454. var Double_= '[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
  5455. // tail end of ''' string
  5456. var Single3 = "[^'\\\\]*(?:(?:\\\\.|'(?!''))[^'\\\\]*)*'''";
  5457. // tail end of """ string
  5458. var Double3 = '[^"\\\\]*(?:(?:\\\\.|"(?!""))[^"\\\\]*)*"""';
  5459. var Triple = group("[ubUB]?[rR]?'''", '[ubUB]?[rR]?"""');
  5460. var String_ = group("[uU]?[rR]?'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*'",
  5461. '[uU]?[rR]?"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*"');
  5462. // Because of leftmost-then-longest match semantics, be sure to put the
  5463. // longest operators first (e.g., if = came before ==, == would get
  5464. // recognized as two instances of =).
  5465. var Operator = group("\\*\\*=?", ">>=?", "<<=?", "<>", "!=",
  5466. "//=?", "->",
  5467. "[+\\-*/%&|^=<>]=?",
  5468. "~");
  5469. var Bracket = '[\\][(){}]';
  5470. var Special = group('\\r?\\n', '[:;.,`@]');
  5471. var Funny = group(Operator, Bracket, Special);
  5472. var ContStr = group("[uUbB]?[rR]?'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*" +
  5473. group("'", '\\\\\\r?\\n'),
  5474. '[uUbB]?[rR]?"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*' +
  5475. group('"', '\\\\\\r?\\n'));
  5476. var PseudoExtras = group('\\\\\\r?\\n', Comment_, Triple);
  5477. var PseudoToken = group(PseudoExtras, Number_, Funny, ContStr, Ident);
  5478. var pseudoprog = new RegExp(PseudoToken);
  5479. var single3prog = new RegExp(Single3, "g");
  5480. var double3prog = new RegExp(Double3, "g");
  5481. var endprogs = {
  5482. "'": new RegExp(Single, "g"), '"': new RegExp(Double_, "g"),
  5483. "'''": single3prog, '"""': double3prog,
  5484. "r'''": single3prog, 'r"""': double3prog,
  5485. "u'''": single3prog, 'u"""': double3prog,
  5486. "b'''": single3prog, 'b"""': double3prog,
  5487. "ur'''": single3prog, 'ur"""': double3prog,
  5488. "br'''": single3prog, 'br"""': double3prog,
  5489. "R'''": single3prog, 'R"""': double3prog,
  5490. "U'''": single3prog, 'U"""': double3prog,
  5491. "B'''": single3prog, 'B"""': double3prog,
  5492. "uR'''": single3prog, 'uR"""': double3prog,
  5493. "Ur'''": single3prog, 'Ur"""': double3prog,
  5494. "UR'''": single3prog, 'UR"""': double3prog,
  5495. "bR'''": single3prog, 'bR"""': double3prog,
  5496. "Br'''": single3prog, 'Br"""': double3prog,
  5497. "BR'''": single3prog, 'BR"""': double3prog,
  5498. 'r': null, 'R': null,
  5499. 'u': null, 'U': null,
  5500. 'b': null, 'B': null
  5501. };
  5502. var triple_quoted = {
  5503. "'''": true, '"""': true,
  5504. "r'''": true, 'r"""': true, "R'''": true, 'R"""': true,
  5505. "u'''": true, 'u"""': true, "U'''": true, 'U"""': true,
  5506. "b'''": true, 'b"""': true, "B'''": true, 'B"""': true,
  5507. "ur'''": true, 'ur"""': true, "Ur'''": true, 'Ur"""': true,
  5508. "uR'''": true, 'uR"""': true, "UR'''": true, 'UR"""': true,
  5509. "br'''": true, 'br"""': true, "Br'''": true, 'Br"""': true,
  5510. "bR'''": true, 'bR"""': true, "BR'''": true, 'BR"""': true
  5511. };
  5512. var single_quoted = {
  5513. "'": true, '"': true,
  5514. "r'": true, 'r"': true, "R'": true, 'R"': true,
  5515. "u'": true, 'u"': true, "U'": true, 'U"': true,
  5516. "b'": true, 'b"': true, "B'": true, 'B"': true,
  5517. "ur'": true, 'ur"': true, "Ur'": true, 'Ur"': true,
  5518. "uR'": true, 'uR"': true, "UR'": true, 'UR"': true,
  5519. "br'": true, 'br"': true, "Br'": true, 'Br"': true,
  5520. "bR'": true, 'bR"': true, "BR'": true, 'BR"': true
  5521. };
  5522. var tabsize = 8;
  5523. function contains(a, obj)
  5524. {
  5525. var i = a.length;
  5526. while (i--)
  5527. {
  5528. if (a[i] === obj)
  5529. {
  5530. return true;
  5531. }
  5532. }
  5533. return false;
  5534. }
  5535. function rstrip(input, what)
  5536. {
  5537. for (var i = input.length; i > 0; --i)
  5538. {
  5539. if (what.indexOf(input.charAt(i - 1)) === -1) break;
  5540. }
  5541. return input.substring(0, i);
  5542. }
  5543. Sk.Tokenizer.prototype.generateTokens = function(line)
  5544. {
  5545. var endmatch, pos, column, end, max;
  5546. if (!line) line = '';
  5547. //print("LINE:'"+line+"'");
  5548. this.lnum += 1;
  5549. pos = 0;
  5550. max = line.length;
  5551. if (this.contstr.length > 0)
  5552. {
  5553. if (!line)
  5554. {
  5555. throw new Sk.builtin.TokenError("EOF in multi-line string", this.filename, this.strstart[0], this.strstart[1], this.contline);
  5556. }
  5557. endmatch = this.endprog.test(line);
  5558. if (endmatch)
  5559. {
  5560. pos = end = this.endprog.lastIndex;
  5561. if (this.callback(Sk.Tokenizer.T_STRING, this.contstr + line.substring(0,end),
  5562. this.strstart, [this.lnum, end], this.contline + line))
  5563. return 'done';
  5564. this.contstr = '';
  5565. this.needcont = false;
  5566. this.contline = undefined;
  5567. }
  5568. else if (this.needcont && line.substring(line.length - 2) !== "\\\n" && line.substring(line.length - 3) !== "\\\r\n")
  5569. {
  5570. if (this.callback(Sk.Tokenizer.T_ERRORTOKEN, this.contstr + line,
  5571. this.strstart, [this.lnum, line.length], this.contline))
  5572. return 'done';
  5573. this.contstr = '';
  5574. this.contline = undefined;
  5575. return false;
  5576. }
  5577. else
  5578. {
  5579. this.contstr += line;
  5580. this.contline = this.contline + line;
  5581. return false;
  5582. }
  5583. }
  5584. else if (this.parenlev === 0 && !this.continued)
  5585. {
  5586. if (!line) return this.doneFunc();
  5587. column = 0;
  5588. while (pos < max)
  5589. {
  5590. if (line.charAt(pos) === ' ') column += 1;
  5591. else if (line.charAt(pos) === '\t') column = (column/tabsize + 1)*tabsize;
  5592. else if (line.charAt(pos) === '\f') column = 0;
  5593. else break;
  5594. pos = pos + 1;
  5595. }
  5596. if (pos === max) return this.doneFunc();
  5597. if ("#\r\n".indexOf(line.charAt(pos)) !== -1) // skip comments or blank lines
  5598. {
  5599. if (line.charAt(pos) === '#')
  5600. {
  5601. var comment_token = rstrip(line.substring(pos), '\r\n');
  5602. var nl_pos = pos + comment_token.length;
  5603. if (this.callback(Sk.Tokenizer.T_COMMENT, comment_token,
  5604. [this.lnum, pos], [this.lnum, pos + comment_token.length], line))
  5605. return 'done';
  5606. //print("HERE:1");
  5607. if (this.callback(Sk.Tokenizer.T_NL, line.substring(nl_pos),
  5608. [this.lnum, nl_pos], [this.lnum, line.length], line))
  5609. return 'done';
  5610. return false;
  5611. }
  5612. else
  5613. {
  5614. //print("HERE:2");
  5615. if (this.callback(Sk.Tokenizer.T_NL, line.substring(pos),
  5616. [this.lnum, pos], [this.lnum, line.length], line))
  5617. return 'done';
  5618. if (!this.interactive) return false;
  5619. }
  5620. }
  5621. if (column > this.indents[this.indents.length - 1]) // count indents or dedents
  5622. {
  5623. this.indents.push(column);
  5624. if (this.callback(Sk.Tokenizer.T_INDENT, line.substring(0, pos), [this.lnum, 0], [this.lnum, pos], line))
  5625. return 'done';
  5626. }
  5627. while (column < this.indents[this.indents.length - 1])
  5628. {
  5629. if (!contains(this.indents, column))
  5630. {
  5631. throw new Sk.builtin.IndentationError("unindent does not match any outer indentation level",
  5632. this.filename, this.lnum, pos, line);
  5633. }
  5634. this.indents.splice(this.indents.length - 1, 1);
  5635. //print("dedent here");
  5636. if (this.callback(Sk.Tokenizer.T_DEDENT, '', [this.lnum, pos], [this.lnum, pos], line))
  5637. return 'done';
  5638. }
  5639. }
  5640. else // continued statement
  5641. {
  5642. if (!line)
  5643. {
  5644. throw new Sk.builtin.TokenError("EOF in multi-line statement", this.filename, this.lnum, 0, line);
  5645. }
  5646. this.continued = false;
  5647. }
  5648. while (pos < max)
  5649. {
  5650. //print("pos:"+pos+":"+max);
  5651. // js regexes don't return any info about matches, other than the
  5652. // content. we'd like to put a \w+ before pseudomatch, but then we
  5653. // can't get any data
  5654. while (line.charAt(pos) === ' ' || line.charAt(pos) === '\f' || line.charAt(pos) === '\t')
  5655. {
  5656. pos += 1;
  5657. }
  5658. var pseudomatch = pseudoprog.exec(line.substring(pos));
  5659. if (pseudomatch)
  5660. {
  5661. var start = pos;
  5662. end = start + pseudomatch[1].length;
  5663. var spos = [this.lnum, start];
  5664. var epos = [this.lnum, end];
  5665. pos = end;
  5666. var token = line.substring(start, end);
  5667. var initial = line.charAt(start);
  5668. //print("initial:'" +initial +"'", token);
  5669. if (this.numchars.indexOf(initial) !== -1 || (initial === '.' && token !== '.'))
  5670. {
  5671. if (this.callback(Sk.Tokenizer.T_NUMBER, token, spos, epos, line)) return 'done';
  5672. }
  5673. else if (initial === '\r' || initial === '\n')
  5674. {
  5675. var newl = Sk.Tokenizer.T_NEWLINE;
  5676. //print("HERE:3");
  5677. if (this.parenlev > 0) newl = Sk.Tokenizer.T_NL;
  5678. if (this.callback(newl, token, spos, epos, line)) return 'done';
  5679. }
  5680. else if (initial === '#')
  5681. {
  5682. if (this.callback(Sk.Tokenizer.T_COMMENT, token, spos, epos, line)) return 'done';
  5683. }
  5684. else if (triple_quoted.hasOwnProperty(token))
  5685. {
  5686. this.endprog = endprogs[token];
  5687. endmatch = this.endprog.test(line.substring(pos));
  5688. if (endmatch)
  5689. {
  5690. pos = this.endprog.lastIndex + pos;
  5691. token = line.substring(start, pos);
  5692. if (this.callback(Sk.Tokenizer.T_STRING, token, spos, [this.lnum, pos], line)) return 'done';
  5693. }
  5694. else
  5695. {
  5696. this.strstart = [this.lnum, start];
  5697. this.contstr = line.substring(start);
  5698. this.contline = line;
  5699. return false;
  5700. }
  5701. }
  5702. else if (single_quoted.hasOwnProperty(initial) ||
  5703. single_quoted.hasOwnProperty(token.substring(0, 2)) ||
  5704. single_quoted.hasOwnProperty(token.substring(0, 3)))
  5705. {
  5706. if (token[token.length - 1] === '\n')
  5707. {
  5708. this.strstart = [this.lnum, start];
  5709. this.endprog = endprogs[initial] || endprogs[token[1]] || endprogs[token[2]];
  5710. this.contstr = line.substring(start);
  5711. this.needcont = true;
  5712. this.contline = line;
  5713. return false;
  5714. }
  5715. else
  5716. {
  5717. if (this.callback(Sk.Tokenizer.T_STRING, token, spos, epos, line)) return 'done';
  5718. }
  5719. }
  5720. else if (this.namechars.indexOf(initial) !== -1)
  5721. {
  5722. if (this.callback(Sk.Tokenizer.T_NAME, token, spos, epos, line)) return 'done';
  5723. }
  5724. else if (initial === '\\')
  5725. {
  5726. //print("HERE:4");
  5727. if (this.callback(Sk.Tokenizer.T_NL, token, spos, [this.lnum, pos], line)) return 'done';
  5728. this.continued = true;
  5729. }
  5730. else
  5731. {
  5732. if ('([{'.indexOf(initial) !== -1) this.parenlev += 1;
  5733. else if (')]}'.indexOf(initial) !== -1) this.parenlev -= 1;
  5734. if (this.callback(Sk.Tokenizer.T_OP, token, spos, epos, line)) return 'done';
  5735. }
  5736. }
  5737. else
  5738. {
  5739. if (this.callback(Sk.Tokenizer.T_ERRORTOKEN, line.charAt(pos),
  5740. [this.lnum, pos], [this.lnum, pos+1], line))
  5741. return 'done';
  5742. pos += 1;
  5743. }
  5744. }
  5745. return false;
  5746. };
  5747. Sk.Tokenizer.tokenNames = {
  5748. 0: 'T_ENDMARKER', 1: 'T_NAME', 2: 'T_NUMBER', 3: 'T_STRING', 4: 'T_NEWLINE',
  5749. 5: 'T_INDENT', 6: 'T_DEDENT', 7: 'T_LPAR', 8: 'T_RPAR', 9: 'T_LSQB',
  5750. 10: 'T_RSQB', 11: 'T_COLON', 12: 'T_COMMA', 13: 'T_SEMI', 14: 'T_PLUS',
  5751. 15: 'T_MINUS', 16: 'T_STAR', 17: 'T_SLASH', 18: 'T_VBAR', 19: 'T_AMPER',
  5752. 20: 'T_LESS', 21: 'T_GREATER', 22: 'T_EQUAL', 23: 'T_DOT', 24: 'T_PERCENT',
  5753. 25: 'T_BACKQUOTE', 26: 'T_LBRACE', 27: 'T_RBRACE', 28: 'T_EQEQUAL', 29: 'T_NOTEQUAL',
  5754. 30: 'T_LESSEQUAL', 31: 'T_GREATEREQUAL', 32: 'T_TILDE', 33: 'T_CIRCUMFLEX', 34: 'T_LEFTSHIFT',
  5755. 35: 'T_RIGHTSHIFT', 36: 'T_DOUBLESTAR', 37: 'T_PLUSEQUAL', 38: 'T_MINEQUAL', 39: 'T_STAREQUAL',
  5756. 40: 'T_SLASHEQUAL', 41: 'T_PERCENTEQUAL', 42: 'T_AMPEREQUAL', 43: 'T_VBAREQUAL', 44: 'T_CIRCUMFLEXEQUAL',
  5757. 45: 'T_LEFTSHIFTEQUAL', 46: 'T_RIGHTSHIFTEQUAL', 47: 'T_DOUBLESTAREQUAL', 48: 'T_DOUBLESLASH', 49: 'T_DOUBLESLASHEQUAL',
  5758. 50: 'T_AT', 51: 'T_OP', 52: 'T_COMMENT', 53: 'T_NL', 54: 'T_RARROW',
  5759. 55: 'T_ERRORTOKEN', 56: 'T_N_TOKENS',
  5760. 256: 'T_NT_OFFSET'
  5761. };
  5762. //goog.exportSymbol("Sk.Tokenizer", Sk.Tokenizer);
  5763. //goog.exportSymbol("Sk.Tokenizer.prototype.generateTokens", Sk.Tokenizer.prototype.generateTokens);
  5764. //goog.exportSymbol("Sk.Tokenizer.tokenNames", Sk.Tokenizer.tokenNames);
  5765. // generated by pgen/main.py
  5766. Sk.OpMap = {
  5767. "(": Sk.Tokenizer.T_LPAR,
  5768. ")": Sk.Tokenizer.T_RPAR,
  5769. "[": Sk.Tokenizer.T_LSQB,
  5770. "]": Sk.Tokenizer.T_RSQB,
  5771. ":": Sk.Tokenizer.T_COLON,
  5772. ",": Sk.Tokenizer.T_COMMA,
  5773. ";": Sk.Tokenizer.T_SEMI,
  5774. "+": Sk.Tokenizer.T_PLUS,
  5775. "-": Sk.Tokenizer.T_MINUS,
  5776. "*": Sk.Tokenizer.T_STAR,
  5777. "/": Sk.Tokenizer.T_SLASH,
  5778. "|": Sk.Tokenizer.T_VBAR,
  5779. "&": Sk.Tokenizer.T_AMPER,
  5780. "<": Sk.Tokenizer.T_LESS,
  5781. ">": Sk.Tokenizer.T_GREATER,
  5782. "=": Sk.Tokenizer.T_EQUAL,
  5783. ".": Sk.Tokenizer.T_DOT,
  5784. "%": Sk.Tokenizer.T_PERCENT,
  5785. "`": Sk.Tokenizer.T_BACKQUOTE,
  5786. "{": Sk.Tokenizer.T_LBRACE,
  5787. "}": Sk.Tokenizer.T_RBRACE,
  5788. "@": Sk.Tokenizer.T_AT,
  5789. "==": Sk.Tokenizer.T_EQEQUAL,
  5790. "!=": Sk.Tokenizer.T_NOTEQUAL,
  5791. "<>": Sk.Tokenizer.T_NOTEQUAL,
  5792. "<=": Sk.Tokenizer.T_LESSEQUAL,
  5793. ">=": Sk.Tokenizer.T_GREATEREQUAL,
  5794. "~": Sk.Tokenizer.T_TILDE,
  5795. "^": Sk.Tokenizer.T_CIRCUMFLEX,
  5796. "<<": Sk.Tokenizer.T_LEFTSHIFT,
  5797. ">>": Sk.Tokenizer.T_RIGHTSHIFT,
  5798. "**": Sk.Tokenizer.T_DOUBLESTAR,
  5799. "+=": Sk.Tokenizer.T_PLUSEQUAL,
  5800. "-=": Sk.Tokenizer.T_MINEQUAL,
  5801. "*=": Sk.Tokenizer.T_STAREQUAL,
  5802. "/=": Sk.Tokenizer.T_SLASHEQUAL,
  5803. "%=": Sk.Tokenizer.T_PERCENTEQUAL,
  5804. "&=": Sk.Tokenizer.T_AMPEREQUAL,
  5805. "|=": Sk.Tokenizer.T_VBAREQUAL,
  5806. "^=": Sk.Tokenizer.T_CIRCUMFLEXEQUAL,
  5807. "<<=": Sk.Tokenizer.T_LEFTSHIFTEQUAL,
  5808. ">>=": Sk.Tokenizer.T_RIGHTSHIFTEQUAL,
  5809. "**=": Sk.Tokenizer.T_DOUBLESTAREQUAL,
  5810. "//": Sk.Tokenizer.T_DOUBLESLASH,
  5811. "//=": Sk.Tokenizer.T_DOUBLESLASHEQUAL,
  5812. "->": Sk.Tokenizer.T_RARROW
  5813. };
  5814. Sk.ParseTables = {
  5815. sym:
  5816. {and_expr: 257,
  5817. and_test: 258,
  5818. arglist: 259,
  5819. argument: 260,
  5820. arith_expr: 261,
  5821. assert_stmt: 262,
  5822. atom: 263,
  5823. augassign: 264,
  5824. break_stmt: 265,
  5825. classdef: 266,
  5826. comp_op: 267,
  5827. comparison: 268,
  5828. compound_stmt: 269,
  5829. continue_stmt: 270,
  5830. decorated: 271,
  5831. decorator: 272,
  5832. decorators: 273,
  5833. del_stmt: 274,
  5834. dictmaker: 275,
  5835. dotted_as_name: 276,
  5836. dotted_as_names: 277,
  5837. dotted_name: 278,
  5838. encoding_decl: 279,
  5839. eval_input: 280,
  5840. except_clause: 281,
  5841. exec_stmt: 282,
  5842. expr: 283,
  5843. expr_stmt: 284,
  5844. exprlist: 285,
  5845. factor: 286,
  5846. file_input: 287,
  5847. flow_stmt: 288,
  5848. for_stmt: 289,
  5849. fpdef: 290,
  5850. fplist: 291,
  5851. funcdef: 292,
  5852. gen_for: 293,
  5853. gen_if: 294,
  5854. gen_iter: 295,
  5855. global_stmt: 296,
  5856. if_stmt: 297,
  5857. import_as_name: 298,
  5858. import_as_names: 299,
  5859. import_from: 300,
  5860. import_name: 301,
  5861. import_stmt: 302,
  5862. lambdef: 303,
  5863. list_for: 304,
  5864. list_if: 305,
  5865. list_iter: 306,
  5866. listmaker: 307,
  5867. not_test: 308,
  5868. old_lambdef: 309,
  5869. old_test: 310,
  5870. or_test: 311,
  5871. parameters: 312,
  5872. pass_stmt: 313,
  5873. power: 314,
  5874. print_stmt: 315,
  5875. raise_stmt: 316,
  5876. return_stmt: 317,
  5877. shift_expr: 318,
  5878. simple_stmt: 319,
  5879. single_input: 256,
  5880. sliceop: 320,
  5881. small_stmt: 321,
  5882. stmt: 322,
  5883. subscript: 323,
  5884. subscriptlist: 324,
  5885. suite: 325,
  5886. term: 326,
  5887. test: 327,
  5888. testlist: 328,
  5889. testlist1: 329,
  5890. testlist_gexp: 330,
  5891. testlist_safe: 331,
  5892. trailer: 332,
  5893. try_stmt: 333,
  5894. varargslist: 334,
  5895. while_stmt: 335,
  5896. with_stmt: 336,
  5897. with_var: 337,
  5898. xor_expr: 338,
  5899. yield_expr: 339,
  5900. yield_stmt: 340},
  5901. number2symbol:
  5902. {256: 'single_input',
  5903. 257: 'and_expr',
  5904. 258: 'and_test',
  5905. 259: 'arglist',
  5906. 260: 'argument',
  5907. 261: 'arith_expr',
  5908. 262: 'assert_stmt',
  5909. 263: 'atom',
  5910. 264: 'augassign',
  5911. 265: 'break_stmt',
  5912. 266: 'classdef',
  5913. 267: 'comp_op',
  5914. 268: 'comparison',
  5915. 269: 'compound_stmt',
  5916. 270: 'continue_stmt',
  5917. 271: 'decorated',
  5918. 272: 'decorator',
  5919. 273: 'decorators',
  5920. 274: 'del_stmt',
  5921. 275: 'dictmaker',
  5922. 276: 'dotted_as_name',
  5923. 277: 'dotted_as_names',
  5924. 278: 'dotted_name',
  5925. 279: 'encoding_decl',
  5926. 280: 'eval_input',
  5927. 281: 'except_clause',
  5928. 282: 'exec_stmt',
  5929. 283: 'expr',
  5930. 284: 'expr_stmt',
  5931. 285: 'exprlist',
  5932. 286: 'factor',
  5933. 287: 'file_input',
  5934. 288: 'flow_stmt',
  5935. 289: 'for_stmt',
  5936. 290: 'fpdef',
  5937. 291: 'fplist',
  5938. 292: 'funcdef',
  5939. 293: 'gen_for',
  5940. 294: 'gen_if',
  5941. 295: 'gen_iter',
  5942. 296: 'global_stmt',
  5943. 297: 'if_stmt',
  5944. 298: 'import_as_name',
  5945. 299: 'import_as_names',
  5946. 300: 'import_from',
  5947. 301: 'import_name',
  5948. 302: 'import_stmt',
  5949. 303: 'lambdef',
  5950. 304: 'list_for',
  5951. 305: 'list_if',
  5952. 306: 'list_iter',
  5953. 307: 'listmaker',
  5954. 308: 'not_test',
  5955. 309: 'old_lambdef',
  5956. 310: 'old_test',
  5957. 311: 'or_test',
  5958. 312: 'parameters',
  5959. 313: 'pass_stmt',
  5960. 314: 'power',
  5961. 315: 'print_stmt',
  5962. 316: 'raise_stmt',
  5963. 317: 'return_stmt',
  5964. 318: 'shift_expr',
  5965. 319: 'simple_stmt',
  5966. 320: 'sliceop',
  5967. 321: 'small_stmt',
  5968. 322: 'stmt',
  5969. 323: 'subscript',
  5970. 324: 'subscriptlist',
  5971. 325: 'suite',
  5972. 326: 'term',
  5973. 327: 'test',
  5974. 328: 'testlist',
  5975. 329: 'testlist1',
  5976. 330: 'testlist_gexp',
  5977. 331: 'testlist_safe',
  5978. 332: 'trailer',
  5979. 333: 'try_stmt',
  5980. 334: 'varargslist',
  5981. 335: 'while_stmt',
  5982. 336: 'with_stmt',
  5983. 337: 'with_var',
  5984. 338: 'xor_expr',
  5985. 339: 'yield_expr',
  5986. 340: 'yield_stmt'},
  5987. dfas:
  5988. {256: [[[[1, 1], [2, 1], [3, 2]], [[0, 1]], [[2, 1]]],
  5989. {2: 1,
  5990. 4: 1,
  5991. 5: 1,
  5992. 6: 1,
  5993. 7: 1,
  5994. 8: 1,
  5995. 9: 1,
  5996. 10: 1,
  5997. 11: 1,
  5998. 12: 1,
  5999. 13: 1,
  6000. 14: 1,
  6001. 15: 1,
  6002. 16: 1,
  6003. 17: 1,
  6004. 18: 1,
  6005. 19: 1,
  6006. 20: 1,
  6007. 21: 1,
  6008. 22: 1,
  6009. 23: 1,
  6010. 24: 1,
  6011. 25: 1,
  6012. 26: 1,
  6013. 27: 1,
  6014. 28: 1,
  6015. 29: 1,
  6016. 30: 1,
  6017. 31: 1,
  6018. 32: 1,
  6019. 33: 1,
  6020. 34: 1,
  6021. 35: 1,
  6022. 36: 1}],
  6023. 257: [[[[37, 1]], [[38, 0], [0, 1]]],
  6024. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6025. 258: [[[[39, 1]], [[40, 0], [0, 1]]],
  6026. {6: 1,
  6027. 7: 1,
  6028. 8: 1,
  6029. 9: 1,
  6030. 11: 1,
  6031. 13: 1,
  6032. 17: 1,
  6033. 20: 1,
  6034. 24: 1,
  6035. 28: 1,
  6036. 35: 1}],
  6037. 259: [[[[41, 1], [42, 2], [43, 3]],
  6038. [[44, 4]],
  6039. [[45, 5], [0, 2]],
  6040. [[44, 6]],
  6041. [[45, 7], [0, 4]],
  6042. [[41, 1], [42, 2], [43, 3], [0, 5]],
  6043. [[0, 6]],
  6044. [[42, 4], [43, 3]]],
  6045. {6: 1,
  6046. 7: 1,
  6047. 8: 1,
  6048. 9: 1,
  6049. 11: 1,
  6050. 13: 1,
  6051. 17: 1,
  6052. 20: 1,
  6053. 24: 1,
  6054. 28: 1,
  6055. 35: 1,
  6056. 36: 1,
  6057. 41: 1,
  6058. 43: 1}],
  6059. 260: [[[[44, 1]], [[46, 2], [47, 3], [0, 1]], [[0, 2]], [[44, 2]]],
  6060. {6: 1,
  6061. 7: 1,
  6062. 8: 1,
  6063. 9: 1,
  6064. 11: 1,
  6065. 13: 1,
  6066. 17: 1,
  6067. 20: 1,
  6068. 24: 1,
  6069. 28: 1,
  6070. 35: 1,
  6071. 36: 1}],
  6072. 261: [[[[48, 1]], [[24, 0], [35, 0], [0, 1]]],
  6073. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6074. 262: [[[[19, 1]], [[44, 2]], [[45, 3], [0, 2]], [[44, 4]], [[0, 4]]],
  6075. {19: 1}],
  6076. 263: [[[[17, 1], [8, 2], [9, 5], [28, 4], [11, 3], [13, 6], [20, 2]],
  6077. [[17, 1], [0, 1]],
  6078. [[0, 2]],
  6079. [[49, 7], [50, 2]],
  6080. [[51, 2], [52, 8], [53, 8]],
  6081. [[54, 9], [55, 2]],
  6082. [[56, 10]],
  6083. [[50, 2]],
  6084. [[51, 2]],
  6085. [[55, 2]],
  6086. [[13, 2]]],
  6087. {8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 28: 1}],
  6088. 264: [[[[57, 1],
  6089. [58, 1],
  6090. [59, 1],
  6091. [60, 1],
  6092. [61, 1],
  6093. [62, 1],
  6094. [63, 1],
  6095. [64, 1],
  6096. [65, 1],
  6097. [66, 1],
  6098. [67, 1],
  6099. [68, 1]],
  6100. [[0, 1]]],
  6101. {57: 1,
  6102. 58: 1,
  6103. 59: 1,
  6104. 60: 1,
  6105. 61: 1,
  6106. 62: 1,
  6107. 63: 1,
  6108. 64: 1,
  6109. 65: 1,
  6110. 66: 1,
  6111. 67: 1,
  6112. 68: 1}],
  6113. 265: [[[[31, 1]], [[0, 1]]], {31: 1}],
  6114. 266: [[[[10, 1]],
  6115. [[20, 2]],
  6116. [[69, 3], [28, 4]],
  6117. [[70, 5]],
  6118. [[51, 6], [71, 7]],
  6119. [[0, 5]],
  6120. [[69, 3]],
  6121. [[51, 6]]],
  6122. {10: 1}],
  6123. 267: [[[[72, 1],
  6124. [73, 1],
  6125. [7, 2],
  6126. [74, 1],
  6127. [72, 1],
  6128. [75, 1],
  6129. [76, 1],
  6130. [77, 3],
  6131. [78, 1],
  6132. [79, 1]],
  6133. [[0, 1]],
  6134. [[75, 1]],
  6135. [[7, 1], [0, 3]]],
  6136. {7: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1}],
  6137. 268: [[[[80, 1]], [[81, 0], [0, 1]]],
  6138. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6139. 269: [[[[82, 1],
  6140. [83, 1],
  6141. [84, 1],
  6142. [85, 1],
  6143. [86, 1],
  6144. [87, 1],
  6145. [88, 1],
  6146. [89, 1]],
  6147. [[0, 1]]],
  6148. {4: 1, 10: 1, 14: 1, 16: 1, 27: 1, 30: 1, 33: 1, 34: 1}],
  6149. 270: [[[[32, 1]], [[0, 1]]], {32: 1}],
  6150. 271: [[[[90, 1]], [[88, 2], [85, 2]], [[0, 2]]], {33: 1}],
  6151. 272: [[[[33, 1]],
  6152. [[91, 2]],
  6153. [[28, 4], [2, 3]],
  6154. [[0, 3]],
  6155. [[51, 5], [92, 6]],
  6156. [[2, 3]],
  6157. [[51, 5]]],
  6158. {33: 1}],
  6159. 273: [[[[93, 1]], [[93, 1], [0, 1]]], {33: 1}],
  6160. 274: [[[[21, 1]], [[94, 2]], [[0, 2]]], {21: 1}],
  6161. 275: [[[[44, 1]],
  6162. [[69, 2]],
  6163. [[44, 3]],
  6164. [[45, 4], [0, 3]],
  6165. [[44, 1], [0, 4]]],
  6166. {6: 1,
  6167. 7: 1,
  6168. 8: 1,
  6169. 9: 1,
  6170. 11: 1,
  6171. 13: 1,
  6172. 17: 1,
  6173. 20: 1,
  6174. 24: 1,
  6175. 28: 1,
  6176. 35: 1,
  6177. 36: 1}],
  6178. 276: [[[[91, 1]], [[95, 2], [0, 1]], [[20, 3]], [[0, 3]]], {20: 1}],
  6179. 277: [[[[96, 1]], [[45, 0], [0, 1]]], {20: 1}],
  6180. 278: [[[[20, 1]], [[97, 0], [0, 1]]], {20: 1}],
  6181. 279: [[[[20, 1]], [[0, 1]]], {20: 1}],
  6182. 280: [[[[71, 1]], [[2, 1], [98, 2]], [[0, 2]]],
  6183. {6: 1,
  6184. 7: 1,
  6185. 8: 1,
  6186. 9: 1,
  6187. 11: 1,
  6188. 13: 1,
  6189. 17: 1,
  6190. 20: 1,
  6191. 24: 1,
  6192. 28: 1,
  6193. 35: 1,
  6194. 36: 1}],
  6195. 281: [[[[99, 1]],
  6196. [[44, 2], [0, 1]],
  6197. [[95, 3], [45, 3], [0, 2]],
  6198. [[44, 4]],
  6199. [[0, 4]]],
  6200. {99: 1}],
  6201. 282: [[[[15, 1]],
  6202. [[80, 2]],
  6203. [[75, 3], [0, 2]],
  6204. [[44, 4]],
  6205. [[45, 5], [0, 4]],
  6206. [[44, 6]],
  6207. [[0, 6]]],
  6208. {15: 1}],
  6209. 283: [[[[100, 1]], [[101, 0], [0, 1]]],
  6210. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6211. 284: [[[[71, 1]],
  6212. [[102, 2], [47, 3], [0, 1]],
  6213. [[71, 4], [53, 4]],
  6214. [[71, 5], [53, 5]],
  6215. [[0, 4]],
  6216. [[47, 3], [0, 5]]],
  6217. {6: 1,
  6218. 7: 1,
  6219. 8: 1,
  6220. 9: 1,
  6221. 11: 1,
  6222. 13: 1,
  6223. 17: 1,
  6224. 20: 1,
  6225. 24: 1,
  6226. 28: 1,
  6227. 35: 1,
  6228. 36: 1}],
  6229. 285: [[[[80, 1]], [[45, 2], [0, 1]], [[80, 1], [0, 2]]],
  6230. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6231. 286: [[[[103, 2], [24, 1], [6, 1], [35, 1]], [[104, 2]], [[0, 2]]],
  6232. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6233. 287: [[[[2, 0], [98, 1], [105, 0]], [[0, 1]]],
  6234. {2: 1,
  6235. 4: 1,
  6236. 5: 1,
  6237. 6: 1,
  6238. 7: 1,
  6239. 8: 1,
  6240. 9: 1,
  6241. 10: 1,
  6242. 11: 1,
  6243. 12: 1,
  6244. 13: 1,
  6245. 14: 1,
  6246. 15: 1,
  6247. 16: 1,
  6248. 17: 1,
  6249. 18: 1,
  6250. 19: 1,
  6251. 20: 1,
  6252. 21: 1,
  6253. 22: 1,
  6254. 23: 1,
  6255. 24: 1,
  6256. 25: 1,
  6257. 26: 1,
  6258. 27: 1,
  6259. 28: 1,
  6260. 29: 1,
  6261. 30: 1,
  6262. 31: 1,
  6263. 32: 1,
  6264. 33: 1,
  6265. 34: 1,
  6266. 35: 1,
  6267. 36: 1,
  6268. 98: 1}],
  6269. 288: [[[[106, 1], [107, 1], [108, 1], [109, 1], [110, 1]], [[0, 1]]],
  6270. {5: 1, 18: 1, 25: 1, 31: 1, 32: 1}],
  6271. 289: [[[[27, 1]],
  6272. [[94, 2]],
  6273. [[75, 3]],
  6274. [[71, 4]],
  6275. [[69, 5]],
  6276. [[70, 6]],
  6277. [[111, 7], [0, 6]],
  6278. [[69, 8]],
  6279. [[70, 9]],
  6280. [[0, 9]]],
  6281. {27: 1}],
  6282. 290: [[[[28, 1], [20, 2]], [[112, 3]], [[0, 2]], [[51, 2]]], {20: 1, 28: 1}],
  6283. 291: [[[[113, 1]], [[45, 2], [0, 1]], [[113, 1], [0, 2]]], {20: 1, 28: 1}],
  6284. 292: [[[[4, 1]], [[20, 2]], [[114, 3]], [[69, 4]], [[70, 5]], [[0, 5]]],
  6285. {4: 1}],
  6286. 293: [[[[27, 1]],
  6287. [[94, 2]],
  6288. [[75, 3]],
  6289. [[115, 4]],
  6290. [[116, 5], [0, 4]],
  6291. [[0, 5]]],
  6292. {27: 1}],
  6293. 294: [[[[30, 1]], [[117, 2]], [[116, 3], [0, 2]], [[0, 3]]], {30: 1}],
  6294. 295: [[[[46, 1], [118, 1]], [[0, 1]]], {27: 1, 30: 1}],
  6295. 296: [[[[26, 1]], [[20, 2]], [[45, 1], [0, 2]]], {26: 1}],
  6296. 297: [[[[30, 1]],
  6297. [[44, 2]],
  6298. [[69, 3]],
  6299. [[70, 4]],
  6300. [[111, 5], [119, 1], [0, 4]],
  6301. [[69, 6]],
  6302. [[70, 7]],
  6303. [[0, 7]]],
  6304. {30: 1}],
  6305. 298: [[[[20, 1]], [[95, 2], [0, 1]], [[20, 3]], [[0, 3]]], {20: 1}],
  6306. 299: [[[[120, 1]], [[45, 2], [0, 1]], [[120, 1], [0, 2]]], {20: 1}],
  6307. 300: [[[[29, 1]],
  6308. [[91, 2], [97, 3]],
  6309. [[23, 4]],
  6310. [[91, 2], [23, 4], [97, 3]],
  6311. [[121, 5], [41, 5], [28, 6]],
  6312. [[0, 5]],
  6313. [[121, 7]],
  6314. [[51, 5]]],
  6315. {29: 1}],
  6316. 301: [[[[23, 1]], [[122, 2]], [[0, 2]]], {23: 1}],
  6317. 302: [[[[123, 1], [124, 1]], [[0, 1]]], {23: 1, 29: 1}],
  6318. 303: [[[[36, 1]], [[69, 2], [125, 3]], [[44, 4]], [[69, 2]], [[0, 4]]],
  6319. {36: 1}],
  6320. 304: [[[[27, 1]],
  6321. [[94, 2]],
  6322. [[75, 3]],
  6323. [[126, 4]],
  6324. [[127, 5], [0, 4]],
  6325. [[0, 5]]],
  6326. {27: 1}],
  6327. 305: [[[[30, 1]], [[117, 2]], [[127, 3], [0, 2]], [[0, 3]]], {30: 1}],
  6328. 306: [[[[128, 1], [129, 1]], [[0, 1]]], {27: 1, 30: 1}],
  6329. 307: [[[[44, 1]],
  6330. [[128, 2], [45, 3], [0, 1]],
  6331. [[0, 2]],
  6332. [[44, 4], [0, 3]],
  6333. [[45, 3], [0, 4]]],
  6334. {6: 1,
  6335. 7: 1,
  6336. 8: 1,
  6337. 9: 1,
  6338. 11: 1,
  6339. 13: 1,
  6340. 17: 1,
  6341. 20: 1,
  6342. 24: 1,
  6343. 28: 1,
  6344. 35: 1,
  6345. 36: 1}],
  6346. 308: [[[[7, 1], [130, 2]], [[39, 2]], [[0, 2]]],
  6347. {6: 1,
  6348. 7: 1,
  6349. 8: 1,
  6350. 9: 1,
  6351. 11: 1,
  6352. 13: 1,
  6353. 17: 1,
  6354. 20: 1,
  6355. 24: 1,
  6356. 28: 1,
  6357. 35: 1}],
  6358. 309: [[[[36, 1]], [[69, 2], [125, 3]], [[117, 4]], [[69, 2]], [[0, 4]]],
  6359. {36: 1}],
  6360. 310: [[[[131, 1], [115, 1]], [[0, 1]]],
  6361. {6: 1,
  6362. 7: 1,
  6363. 8: 1,
  6364. 9: 1,
  6365. 11: 1,
  6366. 13: 1,
  6367. 17: 1,
  6368. 20: 1,
  6369. 24: 1,
  6370. 28: 1,
  6371. 35: 1,
  6372. 36: 1}],
  6373. 311: [[[[132, 1]], [[133, 0], [0, 1]]],
  6374. {6: 1,
  6375. 7: 1,
  6376. 8: 1,
  6377. 9: 1,
  6378. 11: 1,
  6379. 13: 1,
  6380. 17: 1,
  6381. 20: 1,
  6382. 24: 1,
  6383. 28: 1,
  6384. 35: 1}],
  6385. 312: [[[[28, 1]], [[51, 2], [125, 3]], [[0, 2]], [[51, 2]]], {28: 1}],
  6386. 313: [[[[22, 1]], [[0, 1]]], {22: 1}],
  6387. 314: [[[[134, 1]], [[135, 1], [43, 2], [0, 1]], [[104, 3]], [[0, 3]]],
  6388. {8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 28: 1}],
  6389. 315: [[[[12, 1]],
  6390. [[44, 2], [136, 3], [0, 1]],
  6391. [[45, 4], [0, 2]],
  6392. [[44, 5]],
  6393. [[44, 2], [0, 4]],
  6394. [[45, 6], [0, 5]],
  6395. [[44, 7]],
  6396. [[45, 8], [0, 7]],
  6397. [[44, 7], [0, 8]]],
  6398. {12: 1}],
  6399. 316: [[[[5, 1]],
  6400. [[44, 2], [0, 1]],
  6401. [[45, 3], [0, 2]],
  6402. [[44, 4]],
  6403. [[45, 5], [0, 4]],
  6404. [[44, 6]],
  6405. [[0, 6]]],
  6406. {5: 1}],
  6407. 317: [[[[18, 1]], [[71, 2], [0, 1]], [[0, 2]]], {18: 1}],
  6408. 318: [[[[137, 1]], [[136, 0], [138, 0], [0, 1]]],
  6409. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6410. 319: [[[[139, 1]], [[2, 2], [140, 3]], [[0, 2]], [[139, 1], [2, 2]]],
  6411. {5: 1,
  6412. 6: 1,
  6413. 7: 1,
  6414. 8: 1,
  6415. 9: 1,
  6416. 11: 1,
  6417. 12: 1,
  6418. 13: 1,
  6419. 15: 1,
  6420. 17: 1,
  6421. 18: 1,
  6422. 19: 1,
  6423. 20: 1,
  6424. 21: 1,
  6425. 22: 1,
  6426. 23: 1,
  6427. 24: 1,
  6428. 25: 1,
  6429. 26: 1,
  6430. 28: 1,
  6431. 29: 1,
  6432. 31: 1,
  6433. 32: 1,
  6434. 35: 1,
  6435. 36: 1}],
  6436. 320: [[[[69, 1]], [[44, 2], [0, 1]], [[0, 2]]], {69: 1}],
  6437. 321: [[[[141, 1],
  6438. [142, 1],
  6439. [143, 1],
  6440. [144, 1],
  6441. [145, 1],
  6442. [146, 1],
  6443. [147, 1],
  6444. [148, 1],
  6445. [149, 1]],
  6446. [[0, 1]]],
  6447. {5: 1,
  6448. 6: 1,
  6449. 7: 1,
  6450. 8: 1,
  6451. 9: 1,
  6452. 11: 1,
  6453. 12: 1,
  6454. 13: 1,
  6455. 15: 1,
  6456. 17: 1,
  6457. 18: 1,
  6458. 19: 1,
  6459. 20: 1,
  6460. 21: 1,
  6461. 22: 1,
  6462. 23: 1,
  6463. 24: 1,
  6464. 25: 1,
  6465. 26: 1,
  6466. 28: 1,
  6467. 29: 1,
  6468. 31: 1,
  6469. 32: 1,
  6470. 35: 1,
  6471. 36: 1}],
  6472. 322: [[[[1, 1], [3, 1]], [[0, 1]]],
  6473. {4: 1,
  6474. 5: 1,
  6475. 6: 1,
  6476. 7: 1,
  6477. 8: 1,
  6478. 9: 1,
  6479. 10: 1,
  6480. 11: 1,
  6481. 12: 1,
  6482. 13: 1,
  6483. 14: 1,
  6484. 15: 1,
  6485. 16: 1,
  6486. 17: 1,
  6487. 18: 1,
  6488. 19: 1,
  6489. 20: 1,
  6490. 21: 1,
  6491. 22: 1,
  6492. 23: 1,
  6493. 24: 1,
  6494. 25: 1,
  6495. 26: 1,
  6496. 27: 1,
  6497. 28: 1,
  6498. 29: 1,
  6499. 30: 1,
  6500. 31: 1,
  6501. 32: 1,
  6502. 33: 1,
  6503. 34: 1,
  6504. 35: 1,
  6505. 36: 1}],
  6506. 323: [[[[44, 1], [69, 2], [97, 3]],
  6507. [[69, 2], [0, 1]],
  6508. [[150, 4], [44, 5], [0, 2]],
  6509. [[97, 6]],
  6510. [[0, 4]],
  6511. [[150, 4], [0, 5]],
  6512. [[97, 4]]],
  6513. {6: 1,
  6514. 7: 1,
  6515. 8: 1,
  6516. 9: 1,
  6517. 11: 1,
  6518. 13: 1,
  6519. 17: 1,
  6520. 20: 1,
  6521. 24: 1,
  6522. 28: 1,
  6523. 35: 1,
  6524. 36: 1,
  6525. 69: 1,
  6526. 97: 1}],
  6527. 324: [[[[151, 1]], [[45, 2], [0, 1]], [[151, 1], [0, 2]]],
  6528. {6: 1,
  6529. 7: 1,
  6530. 8: 1,
  6531. 9: 1,
  6532. 11: 1,
  6533. 13: 1,
  6534. 17: 1,
  6535. 20: 1,
  6536. 24: 1,
  6537. 28: 1,
  6538. 35: 1,
  6539. 36: 1,
  6540. 69: 1,
  6541. 97: 1}],
  6542. 325: [[[[1, 1], [2, 2]],
  6543. [[0, 1]],
  6544. [[152, 3]],
  6545. [[105, 4]],
  6546. [[153, 1], [105, 4]]],
  6547. {2: 1,
  6548. 5: 1,
  6549. 6: 1,
  6550. 7: 1,
  6551. 8: 1,
  6552. 9: 1,
  6553. 11: 1,
  6554. 12: 1,
  6555. 13: 1,
  6556. 15: 1,
  6557. 17: 1,
  6558. 18: 1,
  6559. 19: 1,
  6560. 20: 1,
  6561. 21: 1,
  6562. 22: 1,
  6563. 23: 1,
  6564. 24: 1,
  6565. 25: 1,
  6566. 26: 1,
  6567. 28: 1,
  6568. 29: 1,
  6569. 31: 1,
  6570. 32: 1,
  6571. 35: 1,
  6572. 36: 1}],
  6573. 326: [[[[104, 1]], [[154, 0], [41, 0], [155, 0], [156, 0], [0, 1]]],
  6574. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6575. 327: [[[[115, 1], [157, 2]],
  6576. [[30, 3], [0, 1]],
  6577. [[0, 2]],
  6578. [[115, 4]],
  6579. [[111, 5]],
  6580. [[44, 2]]],
  6581. {6: 1,
  6582. 7: 1,
  6583. 8: 1,
  6584. 9: 1,
  6585. 11: 1,
  6586. 13: 1,
  6587. 17: 1,
  6588. 20: 1,
  6589. 24: 1,
  6590. 28: 1,
  6591. 35: 1,
  6592. 36: 1}],
  6593. 328: [[[[44, 1]], [[45, 2], [0, 1]], [[44, 1], [0, 2]]],
  6594. {6: 1,
  6595. 7: 1,
  6596. 8: 1,
  6597. 9: 1,
  6598. 11: 1,
  6599. 13: 1,
  6600. 17: 1,
  6601. 20: 1,
  6602. 24: 1,
  6603. 28: 1,
  6604. 35: 1,
  6605. 36: 1}],
  6606. 329: [[[[44, 1]], [[45, 0], [0, 1]]],
  6607. {6: 1,
  6608. 7: 1,
  6609. 8: 1,
  6610. 9: 1,
  6611. 11: 1,
  6612. 13: 1,
  6613. 17: 1,
  6614. 20: 1,
  6615. 24: 1,
  6616. 28: 1,
  6617. 35: 1,
  6618. 36: 1}],
  6619. 330: [[[[44, 1]],
  6620. [[46, 2], [45, 3], [0, 1]],
  6621. [[0, 2]],
  6622. [[44, 4], [0, 3]],
  6623. [[45, 3], [0, 4]]],
  6624. {6: 1,
  6625. 7: 1,
  6626. 8: 1,
  6627. 9: 1,
  6628. 11: 1,
  6629. 13: 1,
  6630. 17: 1,
  6631. 20: 1,
  6632. 24: 1,
  6633. 28: 1,
  6634. 35: 1,
  6635. 36: 1}],
  6636. 331: [[[[117, 1]],
  6637. [[45, 2], [0, 1]],
  6638. [[117, 3]],
  6639. [[45, 4], [0, 3]],
  6640. [[117, 3], [0, 4]]],
  6641. {6: 1,
  6642. 7: 1,
  6643. 8: 1,
  6644. 9: 1,
  6645. 11: 1,
  6646. 13: 1,
  6647. 17: 1,
  6648. 20: 1,
  6649. 24: 1,
  6650. 28: 1,
  6651. 35: 1,
  6652. 36: 1}],
  6653. 332: [[[[28, 1], [97, 2], [11, 3]],
  6654. [[51, 4], [92, 5]],
  6655. [[20, 4]],
  6656. [[158, 6]],
  6657. [[0, 4]],
  6658. [[51, 4]],
  6659. [[50, 4]]],
  6660. {11: 1, 28: 1, 97: 1}],
  6661. 333: [[[[14, 1]],
  6662. [[69, 2]],
  6663. [[70, 3]],
  6664. [[159, 4], [160, 5]],
  6665. [[69, 6]],
  6666. [[69, 7]],
  6667. [[70, 8]],
  6668. [[70, 9]],
  6669. [[159, 4], [111, 10], [160, 5], [0, 8]],
  6670. [[0, 9]],
  6671. [[69, 11]],
  6672. [[70, 12]],
  6673. [[160, 5], [0, 12]]],
  6674. {14: 1}],
  6675. 334: [[[[41, 1], [113, 2], [43, 3]],
  6676. [[20, 4]],
  6677. [[47, 5], [45, 6], [0, 2]],
  6678. [[20, 7]],
  6679. [[45, 8], [0, 4]],
  6680. [[44, 9]],
  6681. [[41, 1], [113, 2], [43, 3], [0, 6]],
  6682. [[0, 7]],
  6683. [[43, 3]],
  6684. [[45, 6], [0, 9]]],
  6685. {20: 1, 28: 1, 41: 1, 43: 1}],
  6686. 335: [[[[16, 1]],
  6687. [[44, 2]],
  6688. [[69, 3]],
  6689. [[70, 4]],
  6690. [[111, 5], [0, 4]],
  6691. [[69, 6]],
  6692. [[70, 7]],
  6693. [[0, 7]]],
  6694. {16: 1}],
  6695. 336: [[[[34, 1]],
  6696. [[44, 2]],
  6697. [[69, 3], [161, 4]],
  6698. [[70, 5]],
  6699. [[69, 3]],
  6700. [[0, 5]]],
  6701. {34: 1}],
  6702. 337: [[[[95, 1]], [[80, 2]], [[0, 2]]], {95: 1}],
  6703. 338: [[[[162, 1]], [[163, 0], [0, 1]]],
  6704. {6: 1, 8: 1, 9: 1, 11: 1, 13: 1, 17: 1, 20: 1, 24: 1, 28: 1, 35: 1}],
  6705. 339: [[[[25, 1]], [[71, 2], [0, 1]], [[0, 2]]], {25: 1}],
  6706. 340: [[[[53, 1]], [[0, 1]]], {25: 1}]},
  6707. states:
  6708. [[[[1, 1], [2, 1], [3, 2]], [[0, 1]], [[2, 1]]],
  6709. [[[37, 1]], [[38, 0], [0, 1]]],
  6710. [[[39, 1]], [[40, 0], [0, 1]]],
  6711. [[[41, 1], [42, 2], [43, 3]],
  6712. [[44, 4]],
  6713. [[45, 5], [0, 2]],
  6714. [[44, 6]],
  6715. [[45, 7], [0, 4]],
  6716. [[41, 1], [42, 2], [43, 3], [0, 5]],
  6717. [[0, 6]],
  6718. [[42, 4], [43, 3]]],
  6719. [[[44, 1]], [[46, 2], [47, 3], [0, 1]], [[0, 2]], [[44, 2]]],
  6720. [[[48, 1]], [[24, 0], [35, 0], [0, 1]]],
  6721. [[[19, 1]], [[44, 2]], [[45, 3], [0, 2]], [[44, 4]], [[0, 4]]],
  6722. [[[17, 1], [8, 2], [9, 5], [28, 4], [11, 3], [13, 6], [20, 2]],
  6723. [[17, 1], [0, 1]],
  6724. [[0, 2]],
  6725. [[49, 7], [50, 2]],
  6726. [[51, 2], [52, 8], [53, 8]],
  6727. [[54, 9], [55, 2]],
  6728. [[56, 10]],
  6729. [[50, 2]],
  6730. [[51, 2]],
  6731. [[55, 2]],
  6732. [[13, 2]]],
  6733. [[[57, 1],
  6734. [58, 1],
  6735. [59, 1],
  6736. [60, 1],
  6737. [61, 1],
  6738. [62, 1],
  6739. [63, 1],
  6740. [64, 1],
  6741. [65, 1],
  6742. [66, 1],
  6743. [67, 1],
  6744. [68, 1]],
  6745. [[0, 1]]],
  6746. [[[31, 1]], [[0, 1]]],
  6747. [[[10, 1]],
  6748. [[20, 2]],
  6749. [[69, 3], [28, 4]],
  6750. [[70, 5]],
  6751. [[51, 6], [71, 7]],
  6752. [[0, 5]],
  6753. [[69, 3]],
  6754. [[51, 6]]],
  6755. [[[72, 1],
  6756. [73, 1],
  6757. [7, 2],
  6758. [74, 1],
  6759. [72, 1],
  6760. [75, 1],
  6761. [76, 1],
  6762. [77, 3],
  6763. [78, 1],
  6764. [79, 1]],
  6765. [[0, 1]],
  6766. [[75, 1]],
  6767. [[7, 1], [0, 3]]],
  6768. [[[80, 1]], [[81, 0], [0, 1]]],
  6769. [[[82, 1], [83, 1], [84, 1], [85, 1], [86, 1], [87, 1], [88, 1], [89, 1]],
  6770. [[0, 1]]],
  6771. [[[32, 1]], [[0, 1]]],
  6772. [[[90, 1]], [[88, 2], [85, 2]], [[0, 2]]],
  6773. [[[33, 1]],
  6774. [[91, 2]],
  6775. [[28, 4], [2, 3]],
  6776. [[0, 3]],
  6777. [[51, 5], [92, 6]],
  6778. [[2, 3]],
  6779. [[51, 5]]],
  6780. [[[93, 1]], [[93, 1], [0, 1]]],
  6781. [[[21, 1]], [[94, 2]], [[0, 2]]],
  6782. [[[44, 1]], [[69, 2]], [[44, 3]], [[45, 4], [0, 3]], [[44, 1], [0, 4]]],
  6783. [[[91, 1]], [[95, 2], [0, 1]], [[20, 3]], [[0, 3]]],
  6784. [[[96, 1]], [[45, 0], [0, 1]]],
  6785. [[[20, 1]], [[97, 0], [0, 1]]],
  6786. [[[20, 1]], [[0, 1]]],
  6787. [[[71, 1]], [[2, 1], [98, 2]], [[0, 2]]],
  6788. [[[99, 1]],
  6789. [[44, 2], [0, 1]],
  6790. [[95, 3], [45, 3], [0, 2]],
  6791. [[44, 4]],
  6792. [[0, 4]]],
  6793. [[[15, 1]],
  6794. [[80, 2]],
  6795. [[75, 3], [0, 2]],
  6796. [[44, 4]],
  6797. [[45, 5], [0, 4]],
  6798. [[44, 6]],
  6799. [[0, 6]]],
  6800. [[[100, 1]], [[101, 0], [0, 1]]],
  6801. [[[71, 1]],
  6802. [[102, 2], [47, 3], [0, 1]],
  6803. [[71, 4], [53, 4]],
  6804. [[71, 5], [53, 5]],
  6805. [[0, 4]],
  6806. [[47, 3], [0, 5]]],
  6807. [[[80, 1]], [[45, 2], [0, 1]], [[80, 1], [0, 2]]],
  6808. [[[103, 2], [24, 1], [6, 1], [35, 1]], [[104, 2]], [[0, 2]]],
  6809. [[[2, 0], [98, 1], [105, 0]], [[0, 1]]],
  6810. [[[106, 1], [107, 1], [108, 1], [109, 1], [110, 1]], [[0, 1]]],
  6811. [[[27, 1]],
  6812. [[94, 2]],
  6813. [[75, 3]],
  6814. [[71, 4]],
  6815. [[69, 5]],
  6816. [[70, 6]],
  6817. [[111, 7], [0, 6]],
  6818. [[69, 8]],
  6819. [[70, 9]],
  6820. [[0, 9]]],
  6821. [[[28, 1], [20, 2]], [[112, 3]], [[0, 2]], [[51, 2]]],
  6822. [[[113, 1]], [[45, 2], [0, 1]], [[113, 1], [0, 2]]],
  6823. [[[4, 1]], [[20, 2]], [[114, 3]], [[69, 4]], [[70, 5]], [[0, 5]]],
  6824. [[[27, 1]], [[94, 2]], [[75, 3]], [[115, 4]], [[116, 5], [0, 4]], [[0, 5]]],
  6825. [[[30, 1]], [[117, 2]], [[116, 3], [0, 2]], [[0, 3]]],
  6826. [[[46, 1], [118, 1]], [[0, 1]]],
  6827. [[[26, 1]], [[20, 2]], [[45, 1], [0, 2]]],
  6828. [[[30, 1]],
  6829. [[44, 2]],
  6830. [[69, 3]],
  6831. [[70, 4]],
  6832. [[111, 5], [119, 1], [0, 4]],
  6833. [[69, 6]],
  6834. [[70, 7]],
  6835. [[0, 7]]],
  6836. [[[20, 1]], [[95, 2], [0, 1]], [[20, 3]], [[0, 3]]],
  6837. [[[120, 1]], [[45, 2], [0, 1]], [[120, 1], [0, 2]]],
  6838. [[[29, 1]],
  6839. [[91, 2], [97, 3]],
  6840. [[23, 4]],
  6841. [[91, 2], [23, 4], [97, 3]],
  6842. [[121, 5], [41, 5], [28, 6]],
  6843. [[0, 5]],
  6844. [[121, 7]],
  6845. [[51, 5]]],
  6846. [[[23, 1]], [[122, 2]], [[0, 2]]],
  6847. [[[123, 1], [124, 1]], [[0, 1]]],
  6848. [[[36, 1]], [[69, 2], [125, 3]], [[44, 4]], [[69, 2]], [[0, 4]]],
  6849. [[[27, 1]], [[94, 2]], [[75, 3]], [[126, 4]], [[127, 5], [0, 4]], [[0, 5]]],
  6850. [[[30, 1]], [[117, 2]], [[127, 3], [0, 2]], [[0, 3]]],
  6851. [[[128, 1], [129, 1]], [[0, 1]]],
  6852. [[[44, 1]],
  6853. [[128, 2], [45, 3], [0, 1]],
  6854. [[0, 2]],
  6855. [[44, 4], [0, 3]],
  6856. [[45, 3], [0, 4]]],
  6857. [[[7, 1], [130, 2]], [[39, 2]], [[0, 2]]],
  6858. [[[36, 1]], [[69, 2], [125, 3]], [[117, 4]], [[69, 2]], [[0, 4]]],
  6859. [[[131, 1], [115, 1]], [[0, 1]]],
  6860. [[[132, 1]], [[133, 0], [0, 1]]],
  6861. [[[28, 1]], [[51, 2], [125, 3]], [[0, 2]], [[51, 2]]],
  6862. [[[22, 1]], [[0, 1]]],
  6863. [[[134, 1]], [[135, 1], [43, 2], [0, 1]], [[104, 3]], [[0, 3]]],
  6864. [[[12, 1]],
  6865. [[44, 2], [136, 3], [0, 1]],
  6866. [[45, 4], [0, 2]],
  6867. [[44, 5]],
  6868. [[44, 2], [0, 4]],
  6869. [[45, 6], [0, 5]],
  6870. [[44, 7]],
  6871. [[45, 8], [0, 7]],
  6872. [[44, 7], [0, 8]]],
  6873. [[[5, 1]],
  6874. [[44, 2], [0, 1]],
  6875. [[45, 3], [0, 2]],
  6876. [[44, 4]],
  6877. [[45, 5], [0, 4]],
  6878. [[44, 6]],
  6879. [[0, 6]]],
  6880. [[[18, 1]], [[71, 2], [0, 1]], [[0, 2]]],
  6881. [[[137, 1]], [[136, 0], [138, 0], [0, 1]]],
  6882. [[[139, 1]], [[2, 2], [140, 3]], [[0, 2]], [[139, 1], [2, 2]]],
  6883. [[[69, 1]], [[44, 2], [0, 1]], [[0, 2]]],
  6884. [[[141, 1],
  6885. [142, 1],
  6886. [143, 1],
  6887. [144, 1],
  6888. [145, 1],
  6889. [146, 1],
  6890. [147, 1],
  6891. [148, 1],
  6892. [149, 1]],
  6893. [[0, 1]]],
  6894. [[[1, 1], [3, 1]], [[0, 1]]],
  6895. [[[44, 1], [69, 2], [97, 3]],
  6896. [[69, 2], [0, 1]],
  6897. [[150, 4], [44, 5], [0, 2]],
  6898. [[97, 6]],
  6899. [[0, 4]],
  6900. [[150, 4], [0, 5]],
  6901. [[97, 4]]],
  6902. [[[151, 1]], [[45, 2], [0, 1]], [[151, 1], [0, 2]]],
  6903. [[[1, 1], [2, 2]], [[0, 1]], [[152, 3]], [[105, 4]], [[153, 1], [105, 4]]],
  6904. [[[104, 1]], [[154, 0], [41, 0], [155, 0], [156, 0], [0, 1]]],
  6905. [[[115, 1], [157, 2]],
  6906. [[30, 3], [0, 1]],
  6907. [[0, 2]],
  6908. [[115, 4]],
  6909. [[111, 5]],
  6910. [[44, 2]]],
  6911. [[[44, 1]], [[45, 2], [0, 1]], [[44, 1], [0, 2]]],
  6912. [[[44, 1]], [[45, 0], [0, 1]]],
  6913. [[[44, 1]],
  6914. [[46, 2], [45, 3], [0, 1]],
  6915. [[0, 2]],
  6916. [[44, 4], [0, 3]],
  6917. [[45, 3], [0, 4]]],
  6918. [[[117, 1]],
  6919. [[45, 2], [0, 1]],
  6920. [[117, 3]],
  6921. [[45, 4], [0, 3]],
  6922. [[117, 3], [0, 4]]],
  6923. [[[28, 1], [97, 2], [11, 3]],
  6924. [[51, 4], [92, 5]],
  6925. [[20, 4]],
  6926. [[158, 6]],
  6927. [[0, 4]],
  6928. [[51, 4]],
  6929. [[50, 4]]],
  6930. [[[14, 1]],
  6931. [[69, 2]],
  6932. [[70, 3]],
  6933. [[159, 4], [160, 5]],
  6934. [[69, 6]],
  6935. [[69, 7]],
  6936. [[70, 8]],
  6937. [[70, 9]],
  6938. [[159, 4], [111, 10], [160, 5], [0, 8]],
  6939. [[0, 9]],
  6940. [[69, 11]],
  6941. [[70, 12]],
  6942. [[160, 5], [0, 12]]],
  6943. [[[41, 1], [113, 2], [43, 3]],
  6944. [[20, 4]],
  6945. [[47, 5], [45, 6], [0, 2]],
  6946. [[20, 7]],
  6947. [[45, 8], [0, 4]],
  6948. [[44, 9]],
  6949. [[41, 1], [113, 2], [43, 3], [0, 6]],
  6950. [[0, 7]],
  6951. [[43, 3]],
  6952. [[45, 6], [0, 9]]],
  6953. [[[16, 1]],
  6954. [[44, 2]],
  6955. [[69, 3]],
  6956. [[70, 4]],
  6957. [[111, 5], [0, 4]],
  6958. [[69, 6]],
  6959. [[70, 7]],
  6960. [[0, 7]]],
  6961. [[[34, 1]], [[44, 2]], [[69, 3], [161, 4]], [[70, 5]], [[69, 3]], [[0, 5]]],
  6962. [[[95, 1]], [[80, 2]], [[0, 2]]],
  6963. [[[162, 1]], [[163, 0], [0, 1]]],
  6964. [[[25, 1]], [[71, 2], [0, 1]], [[0, 2]]],
  6965. [[[53, 1]], [[0, 1]]]],
  6966. labels:
  6967. [[0, 'EMPTY'],
  6968. [319, null],
  6969. [4, null],
  6970. [269, null],
  6971. [1, 'def'],
  6972. [1, 'raise'],
  6973. [32, null],
  6974. [1, 'not'],
  6975. [2, null],
  6976. [26, null],
  6977. [1, 'class'],
  6978. [9, null],
  6979. [1, 'print'],
  6980. [25, null],
  6981. [1, 'try'],
  6982. [1, 'exec'],
  6983. [1, 'while'],
  6984. [3, null],
  6985. [1, 'return'],
  6986. [1, 'assert'],
  6987. [1, null],
  6988. [1, 'del'],
  6989. [1, 'pass'],
  6990. [1, 'import'],
  6991. [15, null],
  6992. [1, 'yield'],
  6993. [1, 'global'],
  6994. [1, 'for'],
  6995. [7, null],
  6996. [1, 'from'],
  6997. [1, 'if'],
  6998. [1, 'break'],
  6999. [1, 'continue'],
  7000. [50, null],
  7001. [1, 'with'],
  7002. [14, null],
  7003. [1, 'lambda'],
  7004. [318, null],
  7005. [19, null],
  7006. [308, null],
  7007. [1, 'and'],
  7008. [16, null],
  7009. [260, null],
  7010. [36, null],
  7011. [327, null],
  7012. [12, null],
  7013. [293, null],
  7014. [22, null],
  7015. [326, null],
  7016. [307, null],
  7017. [10, null],
  7018. [8, null],
  7019. [330, null],
  7020. [339, null],
  7021. [275, null],
  7022. [27, null],
  7023. [329, null],
  7024. [46, null],
  7025. [39, null],
  7026. [41, null],
  7027. [47, null],
  7028. [42, null],
  7029. [43, null],
  7030. [37, null],
  7031. [44, null],
  7032. [49, null],
  7033. [40, null],
  7034. [38, null],
  7035. [45, null],
  7036. [11, null],
  7037. [325, null],
  7038. [328, null],
  7039. [29, null],
  7040. [21, null],
  7041. [28, null],
  7042. [1, 'in'],
  7043. [30, null],
  7044. [1, 'is'],
  7045. [31, null],
  7046. [20, null],
  7047. [283, null],
  7048. [267, null],
  7049. [333, null],
  7050. [297, null],
  7051. [289, null],
  7052. [266, null],
  7053. [336, null],
  7054. [335, null],
  7055. [292, null],
  7056. [271, null],
  7057. [273, null],
  7058. [278, null],
  7059. [259, null],
  7060. [272, null],
  7061. [285, null],
  7062. [1, 'as'],
  7063. [276, null],
  7064. [23, null],
  7065. [0, null],
  7066. [1, 'except'],
  7067. [338, null],
  7068. [18, null],
  7069. [264, null],
  7070. [314, null],
  7071. [286, null],
  7072. [322, null],
  7073. [265, null],
  7074. [270, null],
  7075. [316, null],
  7076. [317, null],
  7077. [340, null],
  7078. [1, 'else'],
  7079. [291, null],
  7080. [290, null],
  7081. [312, null],
  7082. [311, null],
  7083. [295, null],
  7084. [310, null],
  7085. [294, null],
  7086. [1, 'elif'],
  7087. [298, null],
  7088. [299, null],
  7089. [277, null],
  7090. [301, null],
  7091. [300, null],
  7092. [334, null],
  7093. [331, null],
  7094. [306, null],
  7095. [304, null],
  7096. [305, null],
  7097. [268, null],
  7098. [309, null],
  7099. [258, null],
  7100. [1, 'or'],
  7101. [263, null],
  7102. [332, null],
  7103. [35, null],
  7104. [261, null],
  7105. [34, null],
  7106. [321, null],
  7107. [13, null],
  7108. [288, null],
  7109. [262, null],
  7110. [284, null],
  7111. [313, null],
  7112. [315, null],
  7113. [274, null],
  7114. [282, null],
  7115. [296, null],
  7116. [302, null],
  7117. [320, null],
  7118. [323, null],
  7119. [5, null],
  7120. [6, null],
  7121. [48, null],
  7122. [17, null],
  7123. [24, null],
  7124. [303, null],
  7125. [324, null],
  7126. [281, null],
  7127. [1, 'finally'],
  7128. [337, null],
  7129. [257, null],
  7130. [33, null]],
  7131. keywords:
  7132. {'and': 40,
  7133. 'as': 95,
  7134. 'assert': 19,
  7135. 'break': 31,
  7136. 'class': 10,
  7137. 'continue': 32,
  7138. 'def': 4,
  7139. 'del': 21,
  7140. 'elif': 119,
  7141. 'else': 111,
  7142. 'except': 99,
  7143. 'exec': 15,
  7144. 'finally': 160,
  7145. 'for': 27,
  7146. 'from': 29,
  7147. 'global': 26,
  7148. 'if': 30,
  7149. 'import': 23,
  7150. 'in': 75,
  7151. 'is': 77,
  7152. 'lambda': 36,
  7153. 'not': 7,
  7154. 'or': 133,
  7155. 'pass': 22,
  7156. 'print': 12,
  7157. 'raise': 5,
  7158. 'return': 18,
  7159. 'try': 14,
  7160. 'while': 16,
  7161. 'with': 34,
  7162. 'yield': 25},
  7163. tokens:
  7164. {0: 98,
  7165. 1: 20,
  7166. 2: 8,
  7167. 3: 17,
  7168. 4: 2,
  7169. 5: 152,
  7170. 6: 153,
  7171. 7: 28,
  7172. 8: 51,
  7173. 9: 11,
  7174. 10: 50,
  7175. 11: 69,
  7176. 12: 45,
  7177. 13: 140,
  7178. 14: 35,
  7179. 15: 24,
  7180. 16: 41,
  7181. 17: 155,
  7182. 18: 101,
  7183. 19: 38,
  7184. 20: 79,
  7185. 21: 73,
  7186. 22: 47,
  7187. 23: 97,
  7188. 24: 156,
  7189. 25: 13,
  7190. 26: 9,
  7191. 27: 55,
  7192. 28: 74,
  7193. 29: 72,
  7194. 30: 76,
  7195. 31: 78,
  7196. 32: 6,
  7197. 33: 163,
  7198. 34: 138,
  7199. 35: 136,
  7200. 36: 43,
  7201. 37: 63,
  7202. 38: 67,
  7203. 39: 58,
  7204. 40: 66,
  7205. 41: 59,
  7206. 42: 61,
  7207. 43: 62,
  7208. 44: 64,
  7209. 45: 68,
  7210. 46: 57,
  7211. 47: 60,
  7212. 48: 154,
  7213. 49: 65,
  7214. 50: 33},
  7215. start: 256
  7216. };
  7217. // low level parser to a concrete syntax tree, derived from cpython's lib2to3
  7218. /**
  7219. *
  7220. * @constructor
  7221. * @param {Object} grammar
  7222. *
  7223. * p = new Parser(grammar);
  7224. * p.setup([start]);
  7225. * foreach input token:
  7226. * if p.addtoken(...):
  7227. * break
  7228. * root = p.rootnode
  7229. *
  7230. * can throw ParseError
  7231. */
  7232. function Parser(grammar)
  7233. {
  7234. this.grammar = grammar;
  7235. return this;
  7236. }
  7237. Parser.prototype.setup = function(start)
  7238. {
  7239. start = start || this.grammar.start;
  7240. //print("START:"+start);
  7241. var newnode =
  7242. {
  7243. type: start,
  7244. value: null,
  7245. context: null,
  7246. children: []
  7247. };
  7248. var stackentry =
  7249. {
  7250. dfa: this.grammar.dfas[start],
  7251. state: 0,
  7252. node: newnode
  7253. };
  7254. this.stack = [stackentry];
  7255. this.used_names = {};
  7256. };
  7257. function findInDfa(a, obj)
  7258. {
  7259. var i = a.length;
  7260. while (i--)
  7261. {
  7262. if (a[i][0] === obj[0] && a[i][1] === obj[1])
  7263. {
  7264. return true;
  7265. }
  7266. }
  7267. return false;
  7268. }
  7269. // Add a token; return true if we're done
  7270. Parser.prototype.addtoken = function(type, value, context)
  7271. {
  7272. var ilabel = this.classify(type, value, context);
  7273. //print("ilabel:"+ilabel);
  7274. OUTERWHILE:
  7275. while (true)
  7276. {
  7277. var tp = this.stack[this.stack.length - 1];
  7278. var states = tp.dfa[0];
  7279. var first = tp.dfa[1];
  7280. var arcs = states[tp.state];
  7281. // look for a state with this label
  7282. for (var a = 0; a < arcs.length; ++a)
  7283. {
  7284. var i = arcs[a][0];
  7285. var newstate = arcs[a][1];
  7286. var t = this.grammar.labels[i][0];
  7287. var v = this.grammar.labels[i][1];
  7288. //print("a:"+a+", t:"+t+", i:"+i);
  7289. if (ilabel === i)
  7290. {
  7291. // look it up in the list of labels
  7292. goog.asserts.assert(t < 256);
  7293. // shift a token; we're done with it
  7294. this.shift(type, value, newstate, context);
  7295. // pop while we are in an accept-only state
  7296. var state = newstate;
  7297. //print("before:"+JSON.stringify(states[state]) + ":state:"+state+":"+JSON.stringify(states[state]));
  7298. while (states[state].length === 1
  7299. && states[state][0][0] === 0
  7300. && states[state][0][1] === state) // states[state] == [(0, state)])
  7301. {
  7302. this.pop();
  7303. //print("in after pop:"+JSON.stringify(states[state]) + ":state:"+state+":"+JSON.stringify(states[state]));
  7304. if (this.stack.length === 0)
  7305. {
  7306. // done!
  7307. return true;
  7308. }
  7309. tp = this.stack[this.stack.length - 1];
  7310. state = tp.state;
  7311. states = tp.dfa[0];
  7312. first = tp.dfa[1];
  7313. //print(JSON.stringify(states), JSON.stringify(first));
  7314. //print("bottom:"+JSON.stringify(states[state]) + ":state:"+state+":"+JSON.stringify(states[state]));
  7315. }
  7316. // done with this token
  7317. //print("DONE, return false");
  7318. return false;
  7319. }
  7320. else if (t >= 256)
  7321. {
  7322. var itsdfa = this.grammar.dfas[t];
  7323. var itsfirst = itsdfa[1];
  7324. if (itsfirst.hasOwnProperty(ilabel))
  7325. {
  7326. // push a symbol
  7327. this.push(t, this.grammar.dfas[t], newstate, context);
  7328. continue OUTERWHILE;
  7329. }
  7330. }
  7331. }
  7332. //print("findInDfa: " + JSON.stringify(arcs)+" vs. " + tp.state);
  7333. if (findInDfa(arcs, [0, tp.state]))
  7334. {
  7335. // an accepting state, pop it and try somethign else
  7336. //print("WAA");
  7337. this.pop();
  7338. if (this.stack.length === 0)
  7339. {
  7340. throw new Sk.builtin.ParseError("too much input");
  7341. }
  7342. }
  7343. else
  7344. {
  7345. // no transition
  7346. throw new Sk.builtin.ParseError("bad input");
  7347. }
  7348. }
  7349. };
  7350. // turn a token into a label
  7351. Parser.prototype.classify = function(type, value, context)
  7352. {
  7353. var ilabel;
  7354. if (type === Sk.Tokenizer.T_NAME)
  7355. {
  7356. this.used_names[value] = true;
  7357. ilabel = this.grammar.keywords.hasOwnProperty(value) && this.grammar.keywords[value];
  7358. if (ilabel)
  7359. {
  7360. //print("is keyword");
  7361. return ilabel;
  7362. }
  7363. }
  7364. ilabel = this.grammar.tokens.hasOwnProperty(type) && this.grammar.tokens[type];
  7365. if (!ilabel)
  7366. throw new Sk.builtin.ParseError("bad token", type, value, context);
  7367. return ilabel;
  7368. };
  7369. // shift a token
  7370. Parser.prototype.shift = function(type, value, newstate, context)
  7371. {
  7372. var dfa = this.stack[this.stack.length - 1].dfa;
  7373. var state = this.stack[this.stack.length - 1].state;
  7374. var node = this.stack[this.stack.length - 1].node;
  7375. //print("context", context);
  7376. var newnode = {
  7377. type: type,
  7378. value: value,
  7379. lineno: context[0][0], // throwing away end here to match cpython
  7380. col_offset: context[0][1],
  7381. children: null
  7382. };
  7383. if (newnode)
  7384. {
  7385. node.children.push(newnode);
  7386. }
  7387. this.stack[this.stack.length - 1] = {
  7388. dfa: dfa,
  7389. state: newstate,
  7390. node: node
  7391. };
  7392. };
  7393. // push a nonterminal
  7394. Parser.prototype.push = function(type, newdfa, newstate, context)
  7395. {
  7396. var dfa = this.stack[this.stack.length - 1].dfa;
  7397. var node = this.stack[this.stack.length - 1].node;
  7398. var newnode = {
  7399. type: type,
  7400. value: null,
  7401. lineno: context[0][0], // throwing away end here to match cpython
  7402. col_offset: context[0][1],
  7403. children: []
  7404. };
  7405. this.stack[this.stack.length - 1] = {
  7406. dfa: dfa,
  7407. state: newstate,
  7408. node: node
  7409. };
  7410. this.stack.push({
  7411. dfa: newdfa,
  7412. state: 0,
  7413. node: newnode
  7414. });
  7415. };
  7416. //var ac = 0;
  7417. //var bc = 0;
  7418. // pop a nonterminal
  7419. Parser.prototype.pop = function()
  7420. {
  7421. var pop = this.stack.pop();
  7422. var newnode = pop.node;
  7423. //print("POP");
  7424. if (newnode)
  7425. {
  7426. //print("A", ac++, newnode.type);
  7427. //print("stacklen:"+this.stack.length);
  7428. if (this.stack.length !== 0)
  7429. {
  7430. //print("B", bc++);
  7431. var node = this.stack[this.stack.length - 1].node;
  7432. node.children.push(newnode);
  7433. }
  7434. else
  7435. {
  7436. //print("C");
  7437. this.rootnode = newnode;
  7438. this.rootnode.used_names = this.used_names;
  7439. }
  7440. }
  7441. };
  7442. /**
  7443. * parser for interactive input. returns a function that should be called with
  7444. * lines of input as they are entered. the function will return false
  7445. * until the input is complete, when it will return the rootnode of the parse.
  7446. *
  7447. * @param {string} filename
  7448. * @param {string=} style root of parse tree (optional)
  7449. */
  7450. function makeParser(filename, style)
  7451. {
  7452. if (style === undefined) style = "file_input";
  7453. var p = new Parser(Sk.ParseTables);
  7454. p.setup(Sk.ParseTables.sym[style]);
  7455. var curIndex = 0;
  7456. var lineno = 1;
  7457. var column = 0;
  7458. var prefix = "";
  7459. var T_COMMENT = Sk.Tokenizer.T_COMMENT;
  7460. var T_NL = Sk.Tokenizer.T_NL;
  7461. var T_OP = Sk.Tokenizer.T_OP;
  7462. var tokenizer = new Sk.Tokenizer(filename, style === "single_input", function(type, value, start, end, line)
  7463. {
  7464. //print(JSON.stringify([type, value, start, end, line]));
  7465. var s_lineno = start[0];
  7466. var s_column = start[1];
  7467. /*
  7468. if (s_lineno !== lineno && s_column !== column)
  7469. {
  7470. // todo; update prefix and line/col
  7471. }
  7472. */
  7473. if (type === T_COMMENT || type === T_NL)
  7474. {
  7475. prefix += value;
  7476. lineno = end[0];
  7477. column = end[1];
  7478. if (value[value.length - 1] === "\n")
  7479. {
  7480. lineno += 1;
  7481. column = 0;
  7482. }
  7483. //print(" not calling addtoken");
  7484. return undefined;
  7485. }
  7486. if (type === T_OP)
  7487. {
  7488. type = Sk.OpMap[value];
  7489. }
  7490. if (p.addtoken(type, value, [start, end, line]))
  7491. {
  7492. return true;
  7493. }
  7494. });
  7495. return function(line)
  7496. {
  7497. var ret = tokenizer.generateTokens(line);
  7498. //print("tok:"+ret);
  7499. if (ret)
  7500. {
  7501. if (ret !== "done")
  7502. throw "ParseError: incomplete input";
  7503. return p.rootnode;
  7504. }
  7505. return false;
  7506. };
  7507. }
  7508. Sk.parse = function parse(filename, input)
  7509. {
  7510. var parseFunc = makeParser(filename);
  7511. if (input.substr(input.length - 1, 1) !== "\n") input += "\n";
  7512. //print("input:"+input);
  7513. var lines = input.split("\n");
  7514. var ret;
  7515. for (var i = 0; i < lines.length; ++i)
  7516. {
  7517. ret = parseFunc(lines[i] + ((i === lines.length - 1) ? "" : "\n"));
  7518. }
  7519. return ret;
  7520. };
  7521. Sk.parseTreeDump = function parseTreeDump(n, indent)
  7522. {
  7523. //return JSON.stringify(n, null, 2);
  7524. indent = indent || "";
  7525. var ret = "";
  7526. ret += indent;
  7527. if (n.type >= 256) // non-term
  7528. {
  7529. ret += Sk.ParseTables.number2symbol[n.type] + "\n";
  7530. for (var i = 0; i < n.children.length; ++i)
  7531. {
  7532. ret += Sk.parseTreeDump(n.children[i], indent + " ");
  7533. }
  7534. }
  7535. else
  7536. {
  7537. ret += Sk.Tokenizer.tokenNames[n.type] + ": " + new Sk.builtin.str(n.value).tp$repr().v + "\n";
  7538. }
  7539. return ret;
  7540. };
  7541. goog.exportSymbol("Sk.parse", Sk.parse);
  7542. goog.exportSymbol("Sk.parseTreeDump", Sk.parseTreeDump);
  7543. /* File automatically generated by asdl_js.py. */
  7544. /* ----- expr_context ----- */
  7545. /** @constructor */
  7546. function Load() {}
  7547. /** @constructor */
  7548. function Store() {}
  7549. /** @constructor */
  7550. function Del() {}
  7551. /** @constructor */
  7552. function AugLoad() {}
  7553. /** @constructor */
  7554. function AugStore() {}
  7555. /** @constructor */
  7556. function Param() {}
  7557. /* ----- boolop ----- */
  7558. /** @constructor */
  7559. function And() {}
  7560. /** @constructor */
  7561. function Or() {}
  7562. /* ----- operator ----- */
  7563. /** @constructor */
  7564. function Add() {}
  7565. /** @constructor */
  7566. function Sub() {}
  7567. /** @constructor */
  7568. function Mult() {}
  7569. /** @constructor */
  7570. function Div() {}
  7571. /** @constructor */
  7572. function Mod() {}
  7573. /** @constructor */
  7574. function Pow() {}
  7575. /** @constructor */
  7576. function LShift() {}
  7577. /** @constructor */
  7578. function RShift() {}
  7579. /** @constructor */
  7580. function BitOr() {}
  7581. /** @constructor */
  7582. function BitXor() {}
  7583. /** @constructor */
  7584. function BitAnd() {}
  7585. /** @constructor */
  7586. function FloorDiv() {}
  7587. /* ----- unaryop ----- */
  7588. /** @constructor */
  7589. function Invert() {}
  7590. /** @constructor */
  7591. function Not() {}
  7592. /** @constructor */
  7593. function UAdd() {}
  7594. /** @constructor */
  7595. function USub() {}
  7596. /* ----- cmpop ----- */
  7597. /** @constructor */
  7598. function Eq() {}
  7599. /** @constructor */
  7600. function NotEq() {}
  7601. /** @constructor */
  7602. function Lt() {}
  7603. /** @constructor */
  7604. function LtE() {}
  7605. /** @constructor */
  7606. function Gt() {}
  7607. /** @constructor */
  7608. function GtE() {}
  7609. /** @constructor */
  7610. function Is() {}
  7611. /** @constructor */
  7612. function IsNot() {}
  7613. /** @constructor */
  7614. function In_() {}
  7615. /** @constructor */
  7616. function NotIn() {}
  7617. /* ---------------------- */
  7618. /* constructors for nodes */
  7619. /* ---------------------- */
  7620. /** @constructor */
  7621. function Module(/* {asdl_seq *} */ body)
  7622. {
  7623. this.body = body;
  7624. return this;
  7625. }
  7626. /** @constructor */
  7627. function Interactive(/* {asdl_seq *} */ body)
  7628. {
  7629. this.body = body;
  7630. return this;
  7631. }
  7632. /** @constructor */
  7633. function Expression(/* {expr_ty} */ body)
  7634. {
  7635. goog.asserts.assert(body !== null && body !== undefined);
  7636. this.body = body;
  7637. return this;
  7638. }
  7639. /** @constructor */
  7640. function Suite(/* {asdl_seq *} */ body)
  7641. {
  7642. this.body = body;
  7643. return this;
  7644. }
  7645. /** @constructor */
  7646. function FunctionDef(/* {identifier} */ name, /* {arguments__ty} */ args, /*
  7647. {asdl_seq *} */ body, /* {asdl_seq *} */
  7648. decorator_list, /* {int} */ lineno, /* {int} */
  7649. col_offset)
  7650. {
  7651. goog.asserts.assert(name !== null && name !== undefined);
  7652. goog.asserts.assert(args !== null && args !== undefined);
  7653. this.name = name;
  7654. this.args = args;
  7655. this.body = body;
  7656. this.decorator_list = decorator_list;
  7657. this.lineno = lineno;
  7658. this.col_offset = col_offset;
  7659. return this;
  7660. }
  7661. /** @constructor */
  7662. function ClassDef(/* {identifier} */ name, /* {asdl_seq *} */ bases, /*
  7663. {asdl_seq *} */ body, /* {asdl_seq *} */ decorator_list,
  7664. /* {int} */ lineno, /* {int} */ col_offset)
  7665. {
  7666. goog.asserts.assert(name !== null && name !== undefined);
  7667. this.name = name;
  7668. this.bases = bases;
  7669. this.body = body;
  7670. this.decorator_list = decorator_list;
  7671. this.lineno = lineno;
  7672. this.col_offset = col_offset;
  7673. return this;
  7674. }
  7675. /** @constructor */
  7676. function Return_(/* {expr_ty} */ value, /* {int} */ lineno, /* {int} */
  7677. col_offset)
  7678. {
  7679. this.value = value;
  7680. this.lineno = lineno;
  7681. this.col_offset = col_offset;
  7682. return this;
  7683. }
  7684. /** @constructor */
  7685. function Delete_(/* {asdl_seq *} */ targets, /* {int} */ lineno, /* {int} */
  7686. col_offset)
  7687. {
  7688. this.targets = targets;
  7689. this.lineno = lineno;
  7690. this.col_offset = col_offset;
  7691. return this;
  7692. }
  7693. /** @constructor */
  7694. function Assign(/* {asdl_seq *} */ targets, /* {expr_ty} */ value, /* {int} */
  7695. lineno, /* {int} */ col_offset)
  7696. {
  7697. goog.asserts.assert(value !== null && value !== undefined);
  7698. this.targets = targets;
  7699. this.value = value;
  7700. this.lineno = lineno;
  7701. this.col_offset = col_offset;
  7702. return this;
  7703. }
  7704. /** @constructor */
  7705. function AugAssign(/* {expr_ty} */ target, /* {operator_ty} */ op, /* {expr_ty}
  7706. */ value, /* {int} */ lineno, /* {int} */ col_offset)
  7707. {
  7708. goog.asserts.assert(target !== null && target !== undefined);
  7709. goog.asserts.assert(op !== null && op !== undefined);
  7710. goog.asserts.assert(value !== null && value !== undefined);
  7711. this.target = target;
  7712. this.op = op;
  7713. this.value = value;
  7714. this.lineno = lineno;
  7715. this.col_offset = col_offset;
  7716. return this;
  7717. }
  7718. /** @constructor */
  7719. function Print(/* {expr_ty} */ dest, /* {asdl_seq *} */ values, /* {bool} */
  7720. nl, /* {int} */ lineno, /* {int} */ col_offset)
  7721. {
  7722. this.dest = dest;
  7723. this.values = values;
  7724. this.nl = nl;
  7725. this.lineno = lineno;
  7726. this.col_offset = col_offset;
  7727. return this;
  7728. }
  7729. /** @constructor */
  7730. function For_(/* {expr_ty} */ target, /* {expr_ty} */ iter, /* {asdl_seq *} */
  7731. body, /* {asdl_seq *} */ orelse, /* {int} */ lineno, /*
  7732. {int} */ col_offset)
  7733. {
  7734. goog.asserts.assert(target !== null && target !== undefined);
  7735. goog.asserts.assert(iter !== null && iter !== undefined);
  7736. this.target = target;
  7737. this.iter = iter;
  7738. this.body = body;
  7739. this.orelse = orelse;
  7740. this.lineno = lineno;
  7741. this.col_offset = col_offset;
  7742. return this;
  7743. }
  7744. /** @constructor */
  7745. function While_(/* {expr_ty} */ test, /* {asdl_seq *} */ body, /* {asdl_seq *}
  7746. */ orelse, /* {int} */ lineno, /* {int} */ col_offset)
  7747. {
  7748. goog.asserts.assert(test !== null && test !== undefined);
  7749. this.test = test;
  7750. this.body = body;
  7751. this.orelse = orelse;
  7752. this.lineno = lineno;
  7753. this.col_offset = col_offset;
  7754. return this;
  7755. }
  7756. /** @constructor */
  7757. function If_(/* {expr_ty} */ test, /* {asdl_seq *} */ body, /* {asdl_seq *} */
  7758. orelse, /* {int} */ lineno, /* {int} */ col_offset)
  7759. {
  7760. goog.asserts.assert(test !== null && test !== undefined);
  7761. this.test = test;
  7762. this.body = body;
  7763. this.orelse = orelse;
  7764. this.lineno = lineno;
  7765. this.col_offset = col_offset;
  7766. return this;
  7767. }
  7768. /** @constructor */
  7769. function With_(/* {expr_ty} */ context_expr, /* {expr_ty} */ optional_vars, /*
  7770. {asdl_seq *} */ body, /* {int} */ lineno, /* {int} */
  7771. col_offset)
  7772. {
  7773. goog.asserts.assert(context_expr !== null && context_expr !== undefined);
  7774. this.context_expr = context_expr;
  7775. this.optional_vars = optional_vars;
  7776. this.body = body;
  7777. this.lineno = lineno;
  7778. this.col_offset = col_offset;
  7779. return this;
  7780. }
  7781. /** @constructor */
  7782. function Raise(/* {expr_ty} */ type, /* {expr_ty} */ inst, /* {expr_ty} */
  7783. tback, /* {int} */ lineno, /* {int} */ col_offset)
  7784. {
  7785. this.type = type;
  7786. this.inst = inst;
  7787. this.tback = tback;
  7788. this.lineno = lineno;
  7789. this.col_offset = col_offset;
  7790. return this;
  7791. }
  7792. /** @constructor */
  7793. function TryExcept(/* {asdl_seq *} */ body, /* {asdl_seq *} */ handlers, /*
  7794. {asdl_seq *} */ orelse, /* {int} */ lineno, /* {int} */
  7795. col_offset)
  7796. {
  7797. this.body = body;
  7798. this.handlers = handlers;
  7799. this.orelse = orelse;
  7800. this.lineno = lineno;
  7801. this.col_offset = col_offset;
  7802. return this;
  7803. }
  7804. /** @constructor */
  7805. function TryFinally(/* {asdl_seq *} */ body, /* {asdl_seq *} */ finalbody, /*
  7806. {int} */ lineno, /* {int} */ col_offset)
  7807. {
  7808. this.body = body;
  7809. this.finalbody = finalbody;
  7810. this.lineno = lineno;
  7811. this.col_offset = col_offset;
  7812. return this;
  7813. }
  7814. /** @constructor */
  7815. function Assert(/* {expr_ty} */ test, /* {expr_ty} */ msg, /* {int} */ lineno,
  7816. /* {int} */ col_offset)
  7817. {
  7818. goog.asserts.assert(test !== null && test !== undefined);
  7819. this.test = test;
  7820. this.msg = msg;
  7821. this.lineno = lineno;
  7822. this.col_offset = col_offset;
  7823. return this;
  7824. }
  7825. /** @constructor */
  7826. function Import_(/* {asdl_seq *} */ names, /* {int} */ lineno, /* {int} */
  7827. col_offset)
  7828. {
  7829. this.names = names;
  7830. this.lineno = lineno;
  7831. this.col_offset = col_offset;
  7832. return this;
  7833. }
  7834. /** @constructor */
  7835. function ImportFrom(/* {identifier} */ module, /* {asdl_seq *} */ names, /*
  7836. {int} */ level, /* {int} */ lineno, /* {int} */
  7837. col_offset)
  7838. {
  7839. goog.asserts.assert(module !== null && module !== undefined);
  7840. this.module = module;
  7841. this.names = names;
  7842. this.level = level;
  7843. this.lineno = lineno;
  7844. this.col_offset = col_offset;
  7845. return this;
  7846. }
  7847. /** @constructor */
  7848. function Exec(/* {expr_ty} */ body, /* {expr_ty} */ globals, /* {expr_ty} */
  7849. locals, /* {int} */ lineno, /* {int} */ col_offset)
  7850. {
  7851. goog.asserts.assert(body !== null && body !== undefined);
  7852. this.body = body;
  7853. this.globals = globals;
  7854. this.locals = locals;
  7855. this.lineno = lineno;
  7856. this.col_offset = col_offset;
  7857. return this;
  7858. }
  7859. /** @constructor */
  7860. function Global(/* {asdl_seq *} */ names, /* {int} */ lineno, /* {int} */
  7861. col_offset)
  7862. {
  7863. this.names = names;
  7864. this.lineno = lineno;
  7865. this.col_offset = col_offset;
  7866. return this;
  7867. }
  7868. /** @constructor */
  7869. function Expr(/* {expr_ty} */ value, /* {int} */ lineno, /* {int} */ col_offset)
  7870. {
  7871. goog.asserts.assert(value !== null && value !== undefined);
  7872. this.value = value;
  7873. this.lineno = lineno;
  7874. this.col_offset = col_offset;
  7875. return this;
  7876. }
  7877. /** @constructor */
  7878. function Pass(/* {int} */ lineno, /* {int} */ col_offset)
  7879. {
  7880. this.lineno = lineno;
  7881. this.col_offset = col_offset;
  7882. return this;
  7883. }
  7884. /** @constructor */
  7885. function Break_(/* {int} */ lineno, /* {int} */ col_offset)
  7886. {
  7887. this.lineno = lineno;
  7888. this.col_offset = col_offset;
  7889. return this;
  7890. }
  7891. /** @constructor */
  7892. function Continue_(/* {int} */ lineno, /* {int} */ col_offset)
  7893. {
  7894. this.lineno = lineno;
  7895. this.col_offset = col_offset;
  7896. return this;
  7897. }
  7898. /** @constructor */
  7899. function BoolOp(/* {boolop_ty} */ op, /* {asdl_seq *} */ values, /* {int} */
  7900. lineno, /* {int} */ col_offset)
  7901. {
  7902. goog.asserts.assert(op !== null && op !== undefined);
  7903. this.op = op;
  7904. this.values = values;
  7905. this.lineno = lineno;
  7906. this.col_offset = col_offset;
  7907. return this;
  7908. }
  7909. /** @constructor */
  7910. function BinOp(/* {expr_ty} */ left, /* {operator_ty} */ op, /* {expr_ty} */
  7911. right, /* {int} */ lineno, /* {int} */ col_offset)
  7912. {
  7913. goog.asserts.assert(left !== null && left !== undefined);
  7914. goog.asserts.assert(op !== null && op !== undefined);
  7915. goog.asserts.assert(right !== null && right !== undefined);
  7916. this.left = left;
  7917. this.op = op;
  7918. this.right = right;
  7919. this.lineno = lineno;
  7920. this.col_offset = col_offset;
  7921. return this;
  7922. }
  7923. /** @constructor */
  7924. function UnaryOp(/* {unaryop_ty} */ op, /* {expr_ty} */ operand, /* {int} */
  7925. lineno, /* {int} */ col_offset)
  7926. {
  7927. goog.asserts.assert(op !== null && op !== undefined);
  7928. goog.asserts.assert(operand !== null && operand !== undefined);
  7929. this.op = op;
  7930. this.operand = operand;
  7931. this.lineno = lineno;
  7932. this.col_offset = col_offset;
  7933. return this;
  7934. }
  7935. /** @constructor */
  7936. function Lambda(/* {arguments__ty} */ args, /* {expr_ty} */ body, /* {int} */
  7937. lineno, /* {int} */ col_offset)
  7938. {
  7939. goog.asserts.assert(args !== null && args !== undefined);
  7940. goog.asserts.assert(body !== null && body !== undefined);
  7941. this.args = args;
  7942. this.body = body;
  7943. this.lineno = lineno;
  7944. this.col_offset = col_offset;
  7945. return this;
  7946. }
  7947. /** @constructor */
  7948. function IfExp(/* {expr_ty} */ test, /* {expr_ty} */ body, /* {expr_ty} */
  7949. orelse, /* {int} */ lineno, /* {int} */ col_offset)
  7950. {
  7951. goog.asserts.assert(test !== null && test !== undefined);
  7952. goog.asserts.assert(body !== null && body !== undefined);
  7953. goog.asserts.assert(orelse !== null && orelse !== undefined);
  7954. this.test = test;
  7955. this.body = body;
  7956. this.orelse = orelse;
  7957. this.lineno = lineno;
  7958. this.col_offset = col_offset;
  7959. return this;
  7960. }
  7961. /** @constructor */
  7962. function Dict(/* {asdl_seq *} */ keys, /* {asdl_seq *} */ values, /* {int} */
  7963. lineno, /* {int} */ col_offset)
  7964. {
  7965. this.keys = keys;
  7966. this.values = values;
  7967. this.lineno = lineno;
  7968. this.col_offset = col_offset;
  7969. return this;
  7970. }
  7971. /** @constructor */
  7972. function ListComp(/* {expr_ty} */ elt, /* {asdl_seq *} */ generators, /* {int}
  7973. */ lineno, /* {int} */ col_offset)
  7974. {
  7975. goog.asserts.assert(elt !== null && elt !== undefined);
  7976. this.elt = elt;
  7977. this.generators = generators;
  7978. this.lineno = lineno;
  7979. this.col_offset = col_offset;
  7980. return this;
  7981. }
  7982. /** @constructor */
  7983. function GeneratorExp(/* {expr_ty} */ elt, /* {asdl_seq *} */ generators, /*
  7984. {int} */ lineno, /* {int} */ col_offset)
  7985. {
  7986. goog.asserts.assert(elt !== null && elt !== undefined);
  7987. this.elt = elt;
  7988. this.generators = generators;
  7989. this.lineno = lineno;
  7990. this.col_offset = col_offset;
  7991. return this;
  7992. }
  7993. /** @constructor */
  7994. function Yield(/* {expr_ty} */ value, /* {int} */ lineno, /* {int} */
  7995. col_offset)
  7996. {
  7997. this.value = value;
  7998. this.lineno = lineno;
  7999. this.col_offset = col_offset;
  8000. return this;
  8001. }
  8002. /** @constructor */
  8003. function Compare(/* {expr_ty} */ left, /* {asdl_int_seq *} */ ops, /* {asdl_seq
  8004. *} */ comparators, /* {int} */ lineno, /* {int} */
  8005. col_offset)
  8006. {
  8007. goog.asserts.assert(left !== null && left !== undefined);
  8008. this.left = left;
  8009. this.ops = ops;
  8010. this.comparators = comparators;
  8011. this.lineno = lineno;
  8012. this.col_offset = col_offset;
  8013. return this;
  8014. }
  8015. /** @constructor */
  8016. function Call(/* {expr_ty} */ func, /* {asdl_seq *} */ args, /* {asdl_seq *} */
  8017. keywords, /* {expr_ty} */ starargs, /* {expr_ty} */ kwargs,
  8018. /* {int} */ lineno, /* {int} */ col_offset)
  8019. {
  8020. goog.asserts.assert(func !== null && func !== undefined);
  8021. this.func = func;
  8022. this.args = args;
  8023. this.keywords = keywords;
  8024. this.starargs = starargs;
  8025. this.kwargs = kwargs;
  8026. this.lineno = lineno;
  8027. this.col_offset = col_offset;
  8028. return this;
  8029. }
  8030. /** @constructor */
  8031. function Num(/* {object} */ n, /* {int} */ lineno, /* {int} */ col_offset)
  8032. {
  8033. goog.asserts.assert(n !== null && n !== undefined);
  8034. this.n = n;
  8035. this.lineno = lineno;
  8036. this.col_offset = col_offset;
  8037. return this;
  8038. }
  8039. /** @constructor */
  8040. function Str(/* {string} */ s, /* {int} */ lineno, /* {int} */ col_offset)
  8041. {
  8042. goog.asserts.assert(s !== null && s !== undefined);
  8043. this.s = s;
  8044. this.lineno = lineno;
  8045. this.col_offset = col_offset;
  8046. return this;
  8047. }
  8048. /** @constructor */
  8049. function Attribute(/* {expr_ty} */ value, /* {identifier} */ attr, /*
  8050. {expr_context_ty} */ ctx, /* {int} */ lineno, /* {int}
  8051. */ col_offset)
  8052. {
  8053. goog.asserts.assert(value !== null && value !== undefined);
  8054. goog.asserts.assert(attr !== null && attr !== undefined);
  8055. goog.asserts.assert(ctx !== null && ctx !== undefined);
  8056. this.value = value;
  8057. this.attr = attr;
  8058. this.ctx = ctx;
  8059. this.lineno = lineno;
  8060. this.col_offset = col_offset;
  8061. return this;
  8062. }
  8063. /** @constructor */
  8064. function Subscript(/* {expr_ty} */ value, /* {slice_ty} */ slice, /*
  8065. {expr_context_ty} */ ctx, /* {int} */ lineno, /* {int}
  8066. */ col_offset)
  8067. {
  8068. goog.asserts.assert(value !== null && value !== undefined);
  8069. goog.asserts.assert(slice !== null && slice !== undefined);
  8070. goog.asserts.assert(ctx !== null && ctx !== undefined);
  8071. this.value = value;
  8072. this.slice = slice;
  8073. this.ctx = ctx;
  8074. this.lineno = lineno;
  8075. this.col_offset = col_offset;
  8076. return this;
  8077. }
  8078. /** @constructor */
  8079. function Name(/* {identifier} */ id, /* {expr_context_ty} */ ctx, /* {int} */
  8080. lineno, /* {int} */ col_offset)
  8081. {
  8082. goog.asserts.assert(id !== null && id !== undefined);
  8083. goog.asserts.assert(ctx !== null && ctx !== undefined);
  8084. this.id = id;
  8085. this.ctx = ctx;
  8086. this.lineno = lineno;
  8087. this.col_offset = col_offset;
  8088. return this;
  8089. }
  8090. /** @constructor */
  8091. function List(/* {asdl_seq *} */ elts, /* {expr_context_ty} */ ctx, /* {int} */
  8092. lineno, /* {int} */ col_offset)
  8093. {
  8094. goog.asserts.assert(ctx !== null && ctx !== undefined);
  8095. this.elts = elts;
  8096. this.ctx = ctx;
  8097. this.lineno = lineno;
  8098. this.col_offset = col_offset;
  8099. return this;
  8100. }
  8101. /** @constructor */
  8102. function Tuple(/* {asdl_seq *} */ elts, /* {expr_context_ty} */ ctx, /* {int}
  8103. */ lineno, /* {int} */ col_offset)
  8104. {
  8105. goog.asserts.assert(ctx !== null && ctx !== undefined);
  8106. this.elts = elts;
  8107. this.ctx = ctx;
  8108. this.lineno = lineno;
  8109. this.col_offset = col_offset;
  8110. return this;
  8111. }
  8112. /** @constructor */
  8113. function Ellipsis()
  8114. {
  8115. return this;
  8116. }
  8117. /** @constructor */
  8118. function Slice(/* {expr_ty} */ lower, /* {expr_ty} */ upper, /* {expr_ty} */
  8119. step)
  8120. {
  8121. this.lower = lower;
  8122. this.upper = upper;
  8123. this.step = step;
  8124. return this;
  8125. }
  8126. /** @constructor */
  8127. function ExtSlice(/* {asdl_seq *} */ dims)
  8128. {
  8129. this.dims = dims;
  8130. return this;
  8131. }
  8132. /** @constructor */
  8133. function Index(/* {expr_ty} */ value)
  8134. {
  8135. goog.asserts.assert(value !== null && value !== undefined);
  8136. this.value = value;
  8137. return this;
  8138. }
  8139. /** @constructor */
  8140. function comprehension(/* {expr_ty} */ target, /* {expr_ty} */ iter, /*
  8141. {asdl_seq *} */ ifs)
  8142. {
  8143. goog.asserts.assert(target !== null && target !== undefined);
  8144. goog.asserts.assert(iter !== null && iter !== undefined);
  8145. this.target = target;
  8146. this.iter = iter;
  8147. this.ifs = ifs;
  8148. return this;
  8149. }
  8150. /** @constructor */
  8151. function ExceptHandler(/* {expr_ty} */ type, /* {expr_ty} */ name, /* {asdl_seq
  8152. *} */ body, /* {int} */ lineno, /* {int} */
  8153. col_offset)
  8154. {
  8155. this.type = type;
  8156. this.name = name;
  8157. this.body = body;
  8158. this.lineno = lineno;
  8159. this.col_offset = col_offset;
  8160. return this;
  8161. }
  8162. /** @constructor */
  8163. function arguments_(/* {asdl_seq *} */ args, /* {identifier} */ vararg, /*
  8164. {identifier} */ kwarg, /* {asdl_seq *} */ defaults)
  8165. {
  8166. this.args = args;
  8167. this.vararg = vararg;
  8168. this.kwarg = kwarg;
  8169. this.defaults = defaults;
  8170. return this;
  8171. }
  8172. /** @constructor */
  8173. function keyword(/* {identifier} */ arg, /* {expr_ty} */ value)
  8174. {
  8175. goog.asserts.assert(arg !== null && arg !== undefined);
  8176. goog.asserts.assert(value !== null && value !== undefined);
  8177. this.arg = arg;
  8178. this.value = value;
  8179. return this;
  8180. }
  8181. /** @constructor */
  8182. function alias(/* {identifier} */ name, /* {identifier} */ asname)
  8183. {
  8184. goog.asserts.assert(name !== null && name !== undefined);
  8185. this.name = name;
  8186. this.asname = asname;
  8187. return this;
  8188. }
  8189. Module._astname = "Module";
  8190. Module._fields = [
  8191. "body", function(n) { return n.body; }
  8192. ];
  8193. Interactive._astname = "Interactive";
  8194. Interactive._fields = [
  8195. "body", function(n) { return n.body; }
  8196. ];
  8197. Expression._astname = "Expression";
  8198. Expression._fields = [
  8199. "body", function(n) { return n.body; }
  8200. ];
  8201. Suite._astname = "Suite";
  8202. Suite._fields = [
  8203. "body", function(n) { return n.body; }
  8204. ];
  8205. FunctionDef._astname = "FunctionDef";
  8206. FunctionDef._fields = [
  8207. "name", function(n) { return n.name; },
  8208. "args", function(n) { return n.args; },
  8209. "body", function(n) { return n.body; },
  8210. "decorator_list", function(n) { return n.decorator_list; }
  8211. ];
  8212. ClassDef._astname = "ClassDef";
  8213. ClassDef._fields = [
  8214. "name", function(n) { return n.name; },
  8215. "bases", function(n) { return n.bases; },
  8216. "body", function(n) { return n.body; },
  8217. "decorator_list", function(n) { return n.decorator_list; }
  8218. ];
  8219. Return_._astname = "Return";
  8220. Return_._fields = [
  8221. "value", function(n) { return n.value; }
  8222. ];
  8223. Delete_._astname = "Delete";
  8224. Delete_._fields = [
  8225. "targets", function(n) { return n.targets; }
  8226. ];
  8227. Assign._astname = "Assign";
  8228. Assign._fields = [
  8229. "targets", function(n) { return n.targets; },
  8230. "value", function(n) { return n.value; }
  8231. ];
  8232. AugAssign._astname = "AugAssign";
  8233. AugAssign._fields = [
  8234. "target", function(n) { return n.target; },
  8235. "op", function(n) { return n.op; },
  8236. "value", function(n) { return n.value; }
  8237. ];
  8238. Print._astname = "Print";
  8239. Print._fields = [
  8240. "dest", function(n) { return n.dest; },
  8241. "values", function(n) { return n.values; },
  8242. "nl", function(n) { return n.nl; }
  8243. ];
  8244. For_._astname = "For";
  8245. For_._fields = [
  8246. "target", function(n) { return n.target; },
  8247. "iter", function(n) { return n.iter; },
  8248. "body", function(n) { return n.body; },
  8249. "orelse", function(n) { return n.orelse; }
  8250. ];
  8251. While_._astname = "While";
  8252. While_._fields = [
  8253. "test", function(n) { return n.test; },
  8254. "body", function(n) { return n.body; },
  8255. "orelse", function(n) { return n.orelse; }
  8256. ];
  8257. If_._astname = "If";
  8258. If_._fields = [
  8259. "test", function(n) { return n.test; },
  8260. "body", function(n) { return n.body; },
  8261. "orelse", function(n) { return n.orelse; }
  8262. ];
  8263. With_._astname = "With";
  8264. With_._fields = [
  8265. "context_expr", function(n) { return n.context_expr; },
  8266. "optional_vars", function(n) { return n.optional_vars; },
  8267. "body", function(n) { return n.body; }
  8268. ];
  8269. Raise._astname = "Raise";
  8270. Raise._fields = [
  8271. "type", function(n) { return n.type; },
  8272. "inst", function(n) { return n.inst; },
  8273. "tback", function(n) { return n.tback; }
  8274. ];
  8275. TryExcept._astname = "TryExcept";
  8276. TryExcept._fields = [
  8277. "body", function(n) { return n.body; },
  8278. "handlers", function(n) { return n.handlers; },
  8279. "orelse", function(n) { return n.orelse; }
  8280. ];
  8281. TryFinally._astname = "TryFinally";
  8282. TryFinally._fields = [
  8283. "body", function(n) { return n.body; },
  8284. "finalbody", function(n) { return n.finalbody; }
  8285. ];
  8286. Assert._astname = "Assert";
  8287. Assert._fields = [
  8288. "test", function(n) { return n.test; },
  8289. "msg", function(n) { return n.msg; }
  8290. ];
  8291. Import_._astname = "Import";
  8292. Import_._fields = [
  8293. "names", function(n) { return n.names; }
  8294. ];
  8295. ImportFrom._astname = "ImportFrom";
  8296. ImportFrom._fields = [
  8297. "module", function(n) { return n.module; },
  8298. "names", function(n) { return n.names; },
  8299. "level", function(n) { return n.level; }
  8300. ];
  8301. Exec._astname = "Exec";
  8302. Exec._fields = [
  8303. "body", function(n) { return n.body; },
  8304. "globals", function(n) { return n.globals; },
  8305. "locals", function(n) { return n.locals; }
  8306. ];
  8307. Global._astname = "Global";
  8308. Global._fields = [
  8309. "names", function(n) { return n.names; }
  8310. ];
  8311. Expr._astname = "Expr";
  8312. Expr._fields = [
  8313. "value", function(n) { return n.value; }
  8314. ];
  8315. Pass._astname = "Pass";
  8316. Pass._fields = [
  8317. ];
  8318. Break_._astname = "Break";
  8319. Break_._fields = [
  8320. ];
  8321. Continue_._astname = "Continue";
  8322. Continue_._fields = [
  8323. ];
  8324. BoolOp._astname = "BoolOp";
  8325. BoolOp._fields = [
  8326. "op", function(n) { return n.op; },
  8327. "values", function(n) { return n.values; }
  8328. ];
  8329. BinOp._astname = "BinOp";
  8330. BinOp._fields = [
  8331. "left", function(n) { return n.left; },
  8332. "op", function(n) { return n.op; },
  8333. "right", function(n) { return n.right; }
  8334. ];
  8335. UnaryOp._astname = "UnaryOp";
  8336. UnaryOp._fields = [
  8337. "op", function(n) { return n.op; },
  8338. "operand", function(n) { return n.operand; }
  8339. ];
  8340. Lambda._astname = "Lambda";
  8341. Lambda._fields = [
  8342. "args", function(n) { return n.args; },
  8343. "body", function(n) { return n.body; }
  8344. ];
  8345. IfExp._astname = "IfExp";
  8346. IfExp._fields = [
  8347. "test", function(n) { return n.test; },
  8348. "body", function(n) { return n.body; },
  8349. "orelse", function(n) { return n.orelse; }
  8350. ];
  8351. Dict._astname = "Dict";
  8352. Dict._fields = [
  8353. "keys", function(n) { return n.keys; },
  8354. "values", function(n) { return n.values; }
  8355. ];
  8356. ListComp._astname = "ListComp";
  8357. ListComp._fields = [
  8358. "elt", function(n) { return n.elt; },
  8359. "generators", function(n) { return n.generators; }
  8360. ];
  8361. GeneratorExp._astname = "GeneratorExp";
  8362. GeneratorExp._fields = [
  8363. "elt", function(n) { return n.elt; },
  8364. "generators", function(n) { return n.generators; }
  8365. ];
  8366. Yield._astname = "Yield";
  8367. Yield._fields = [
  8368. "value", function(n) { return n.value; }
  8369. ];
  8370. Compare._astname = "Compare";
  8371. Compare._fields = [
  8372. "left", function(n) { return n.left; },
  8373. "ops", function(n) { return n.ops; },
  8374. "comparators", function(n) { return n.comparators; }
  8375. ];
  8376. Call._astname = "Call";
  8377. Call._fields = [
  8378. "func", function(n) { return n.func; },
  8379. "args", function(n) { return n.args; },
  8380. "keywords", function(n) { return n.keywords; },
  8381. "starargs", function(n) { return n.starargs; },
  8382. "kwargs", function(n) { return n.kwargs; }
  8383. ];
  8384. Num._astname = "Num";
  8385. Num._fields = [
  8386. "n", function(n) { return n.n; }
  8387. ];
  8388. Str._astname = "Str";
  8389. Str._fields = [
  8390. "s", function(n) { return n.s; }
  8391. ];
  8392. Attribute._astname = "Attribute";
  8393. Attribute._fields = [
  8394. "value", function(n) { return n.value; },
  8395. "attr", function(n) { return n.attr; },
  8396. "ctx", function(n) { return n.ctx; }
  8397. ];
  8398. Subscript._astname = "Subscript";
  8399. Subscript._fields = [
  8400. "value", function(n) { return n.value; },
  8401. "slice", function(n) { return n.slice; },
  8402. "ctx", function(n) { return n.ctx; }
  8403. ];
  8404. Name._astname = "Name";
  8405. Name._fields = [
  8406. "id", function(n) { return n.id; },
  8407. "ctx", function(n) { return n.ctx; }
  8408. ];
  8409. List._astname = "List";
  8410. List._fields = [
  8411. "elts", function(n) { return n.elts; },
  8412. "ctx", function(n) { return n.ctx; }
  8413. ];
  8414. Tuple._astname = "Tuple";
  8415. Tuple._fields = [
  8416. "elts", function(n) { return n.elts; },
  8417. "ctx", function(n) { return n.ctx; }
  8418. ];
  8419. Load._astname = "Load";
  8420. Store._astname = "Store";
  8421. Del._astname = "Del";
  8422. AugLoad._astname = "AugLoad";
  8423. AugStore._astname = "AugStore";
  8424. Param._astname = "Param";
  8425. Load._astname = "Load";
  8426. Load._fields = [
  8427. ];
  8428. Store._astname = "Store";
  8429. Store._fields = [
  8430. ];
  8431. Del._astname = "Del";
  8432. Del._fields = [
  8433. ];
  8434. AugLoad._astname = "AugLoad";
  8435. AugLoad._fields = [
  8436. ];
  8437. AugStore._astname = "AugStore";
  8438. AugStore._fields = [
  8439. ];
  8440. Param._astname = "Param";
  8441. Param._fields = [
  8442. ];
  8443. Ellipsis._astname = "Ellipsis";
  8444. Ellipsis._fields = [
  8445. ];
  8446. Slice._astname = "Slice";
  8447. Slice._fields = [
  8448. "lower", function(n) { return n.lower; },
  8449. "upper", function(n) { return n.upper; },
  8450. "step", function(n) { return n.step; }
  8451. ];
  8452. ExtSlice._astname = "ExtSlice";
  8453. ExtSlice._fields = [
  8454. "dims", function(n) { return n.dims; }
  8455. ];
  8456. Index._astname = "Index";
  8457. Index._fields = [
  8458. "value", function(n) { return n.value; }
  8459. ];
  8460. And._astname = "And";
  8461. Or._astname = "Or";
  8462. And._astname = "And";
  8463. And._fields = [
  8464. ];
  8465. Or._astname = "Or";
  8466. Or._fields = [
  8467. ];
  8468. Add._astname = "Add";
  8469. Sub._astname = "Sub";
  8470. Mult._astname = "Mult";
  8471. Div._astname = "Div";
  8472. Mod._astname = "Mod";
  8473. Pow._astname = "Pow";
  8474. LShift._astname = "LShift";
  8475. RShift._astname = "RShift";
  8476. BitOr._astname = "BitOr";
  8477. BitXor._astname = "BitXor";
  8478. BitAnd._astname = "BitAnd";
  8479. FloorDiv._astname = "FloorDiv";
  8480. Add._astname = "Add";
  8481. Add._fields = [
  8482. ];
  8483. Sub._astname = "Sub";
  8484. Sub._fields = [
  8485. ];
  8486. Mult._astname = "Mult";
  8487. Mult._fields = [
  8488. ];
  8489. Div._astname = "Div";
  8490. Div._fields = [
  8491. ];
  8492. Mod._astname = "Mod";
  8493. Mod._fields = [
  8494. ];
  8495. Pow._astname = "Pow";
  8496. Pow._fields = [
  8497. ];
  8498. LShift._astname = "LShift";
  8499. LShift._fields = [
  8500. ];
  8501. RShift._astname = "RShift";
  8502. RShift._fields = [
  8503. ];
  8504. BitOr._astname = "BitOr";
  8505. BitOr._fields = [
  8506. ];
  8507. BitXor._astname = "BitXor";
  8508. BitXor._fields = [
  8509. ];
  8510. BitAnd._astname = "BitAnd";
  8511. BitAnd._fields = [
  8512. ];
  8513. FloorDiv._astname = "FloorDiv";
  8514. FloorDiv._fields = [
  8515. ];
  8516. Invert._astname = "Invert";
  8517. Not._astname = "Not";
  8518. UAdd._astname = "UAdd";
  8519. USub._astname = "USub";
  8520. Invert._astname = "Invert";
  8521. Invert._fields = [
  8522. ];
  8523. Not._astname = "Not";
  8524. Not._fields = [
  8525. ];
  8526. UAdd._astname = "UAdd";
  8527. UAdd._fields = [
  8528. ];
  8529. USub._astname = "USub";
  8530. USub._fields = [
  8531. ];
  8532. Eq._astname = "Eq";
  8533. NotEq._astname = "NotEq";
  8534. Lt._astname = "Lt";
  8535. LtE._astname = "LtE";
  8536. Gt._astname = "Gt";
  8537. GtE._astname = "GtE";
  8538. Is._astname = "Is";
  8539. IsNot._astname = "IsNot";
  8540. In_._astname = "In";
  8541. NotIn._astname = "NotIn";
  8542. Eq._astname = "Eq";
  8543. Eq._fields = [
  8544. ];
  8545. NotEq._astname = "NotEq";
  8546. NotEq._fields = [
  8547. ];
  8548. Lt._astname = "Lt";
  8549. Lt._fields = [
  8550. ];
  8551. LtE._astname = "LtE";
  8552. LtE._fields = [
  8553. ];
  8554. Gt._astname = "Gt";
  8555. Gt._fields = [
  8556. ];
  8557. GtE._astname = "GtE";
  8558. GtE._fields = [
  8559. ];
  8560. Is._astname = "Is";
  8561. Is._fields = [
  8562. ];
  8563. IsNot._astname = "IsNot";
  8564. IsNot._fields = [
  8565. ];
  8566. In_._astname = "In";
  8567. In_._fields = [
  8568. ];
  8569. NotIn._astname = "NotIn";
  8570. NotIn._fields = [
  8571. ];
  8572. comprehension._astname = "comprehension";
  8573. comprehension._fields = [
  8574. "target", function(n) { return n.target; },
  8575. "iter", function(n) { return n.iter; },
  8576. "ifs", function(n) { return n.ifs; }
  8577. ];
  8578. ExceptHandler._astname = "ExceptHandler";
  8579. ExceptHandler._fields = [
  8580. "type", function(n) { return n.type; },
  8581. "name", function(n) { return n.name; },
  8582. "body", function(n) { return n.body; }
  8583. ];
  8584. arguments_._astname = "arguments";
  8585. arguments_._fields = [
  8586. "args", function(n) { return n.args; },
  8587. "vararg", function(n) { return n.vararg; },
  8588. "kwarg", function(n) { return n.kwarg; },
  8589. "defaults", function(n) { return n.defaults; }
  8590. ];
  8591. keyword._astname = "keyword";
  8592. keyword._fields = [
  8593. "arg", function(n) { return n.arg; },
  8594. "value", function(n) { return n.value; }
  8595. ];
  8596. alias._astname = "alias";
  8597. alias._fields = [
  8598. "name", function(n) { return n.name; },
  8599. "asname", function(n) { return n.asname; }
  8600. ];
  8601. //
  8602. // This is pretty much a straight port of ast.c from CPython 2.6.5.
  8603. //
  8604. // The previous version was easier to work with and more JS-ish, but having a
  8605. // somewhat different ast structure than cpython makes testing more difficult.
  8606. //
  8607. // This way, we can use a dump from the ast module on any arbitrary python
  8608. // code and know that we're the same up to ast level, at least.
  8609. //
  8610. var SYM = Sk.ParseTables.sym;
  8611. var TOK = Sk.Tokenizer;
  8612. /** @constructor */
  8613. function Compiling(encoding, filename)
  8614. {
  8615. this.c_encoding = encoding;
  8616. this.c_filename = filename;
  8617. }
  8618. /**
  8619. * @return {number}
  8620. */
  8621. function NCH(n) { goog.asserts.assert(n !== undefined); if (n.children === null) return 0; return n.children.length; }
  8622. function CHILD(n, i)
  8623. {
  8624. goog.asserts.assert(n !== undefined);
  8625. goog.asserts.assert(i !== undefined);
  8626. return n.children[i];
  8627. }
  8628. function REQ(n, type) { goog.asserts.assert(n.type === type, "node wasn't expected type"); }
  8629. function strobj(s)
  8630. {
  8631. goog.asserts.assert(typeof s === "string", "expecting string, got " + (typeof s));
  8632. return new Sk.builtin.str(s);
  8633. }
  8634. /** @return {number} */
  8635. function numStmts(n)
  8636. {
  8637. switch (n.type)
  8638. {
  8639. case SYM.single_input:
  8640. if (CHILD(n, 0).type === TOK.T_NEWLINE)
  8641. return 0;
  8642. else
  8643. return numStmts(CHILD(n, 0));
  8644. case SYM.file_input:
  8645. var cnt = 0;
  8646. for (var i = 0; i < NCH(n); ++i)
  8647. {
  8648. var ch = CHILD(n, i);
  8649. if (ch.type === SYM.stmt)
  8650. cnt += numStmts(ch);
  8651. }
  8652. return cnt;
  8653. case SYM.stmt:
  8654. return numStmts(CHILD(n, 0));
  8655. case SYM.compound_stmt:
  8656. return 1;
  8657. case SYM.simple_stmt:
  8658. return Math.floor(NCH(n) / 2); // div 2 is to remove count of ;s
  8659. case SYM.suite:
  8660. if (NCH(n) === 1)
  8661. return numStmts(CHILD(n, 0));
  8662. else
  8663. {
  8664. var cnt = 0;
  8665. for (var i = 2; i < NCH(n) - 1; ++i)
  8666. cnt += numStmts(CHILD(n, i));
  8667. return cnt;
  8668. }
  8669. default:
  8670. goog.asserts.fail("Non-statement found");
  8671. }
  8672. return 0;
  8673. }
  8674. function forbiddenCheck(c, n, x)
  8675. {
  8676. if (x === "None") throw new SyntaxError("assignment to None");
  8677. if (x === "True" || x === "False") throw new SyntaxError("assignment to True or False is forbidden");
  8678. }
  8679. /**
  8680. * Set the context ctx for e, recursively traversing e.
  8681. *
  8682. * Only sets context for expr kinds that can appear in assignment context as
  8683. * per the asdl file.
  8684. */
  8685. function setContext(c, e, ctx, n)
  8686. {
  8687. goog.asserts.assert(ctx !== AugStore && ctx !== AugLoad);
  8688. var s = null;
  8689. var exprName = null;
  8690. switch (e.constructor)
  8691. {
  8692. case Attribute:
  8693. case Name:
  8694. if (ctx === Store) forbiddenCheck(c, n, e.attr);
  8695. e.ctx = ctx;
  8696. break;
  8697. case Subscript:
  8698. e.ctx = ctx;
  8699. break;
  8700. case List:
  8701. e.ctx = ctx;
  8702. s = e.elts;
  8703. break;
  8704. case Tuple:
  8705. if (e.elts.length === 0)
  8706. throw new SyntaxError("can't assign to ()");
  8707. e.ctx = ctx;
  8708. s = e.elts;
  8709. break;
  8710. case Lambda:
  8711. exprName = "lambda";
  8712. break;
  8713. case Call:
  8714. exprName = "function call";
  8715. break;
  8716. case BoolOp:
  8717. case BinOp:
  8718. case UnaryOp:
  8719. exprName = "operator";
  8720. break;
  8721. case GeneratorExp:
  8722. exprName = "generator expression";
  8723. break;
  8724. case Yield:
  8725. exprName = "yield expression";
  8726. break;
  8727. case ListComp:
  8728. exprName = "list comprehension";
  8729. break;
  8730. case Dict:
  8731. case Num:
  8732. case Str:
  8733. exprName = "literal";
  8734. break;
  8735. case Compare:
  8736. exprName = "comparison";
  8737. break;
  8738. case IfExp:
  8739. exprName = "conditional expression";
  8740. break;
  8741. default:
  8742. goog.asserts.fail("unhandled expression in assignment");
  8743. }
  8744. if (exprName)
  8745. {
  8746. throw new SyntaxError("can't " + (ctx === Store ? "assign to" : "delete") + " " + exprName);
  8747. }
  8748. if (s)
  8749. {
  8750. for (var i = 0; i < s.length; ++i)
  8751. {
  8752. setContext(c, s[i], ctx, n);
  8753. }
  8754. }
  8755. }
  8756. var operatorMap = {};
  8757. (function() {
  8758. operatorMap[TOK.T_VBAR] = BitOr;
  8759. operatorMap[TOK.T_VBAR] = BitOr;
  8760. operatorMap[TOK.T_CIRCUMFLEX] = BitXor;
  8761. operatorMap[TOK.T_AMPER] = BitAnd;
  8762. operatorMap[TOK.T_LEFTSHIFT] = LShift;
  8763. operatorMap[TOK.T_RIGHTSHIFT] = RShift;
  8764. operatorMap[TOK.T_PLUS] = Add;
  8765. operatorMap[TOK.T_MINUS] = Sub;
  8766. operatorMap[TOK.T_STAR] = Mult;
  8767. operatorMap[TOK.T_SLASH] = Div;
  8768. operatorMap[TOK.T_DOUBLESLASH] = FloorDiv;
  8769. operatorMap[TOK.T_PERCENT] = Mod;
  8770. }());
  8771. function getOperator(n)
  8772. {
  8773. goog.asserts.assert(operatorMap[n.type] !== undefined);
  8774. return operatorMap[n.type];
  8775. }
  8776. function astForCompOp(c, n)
  8777. {
  8778. /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
  8779. |'is' 'not'
  8780. */
  8781. REQ(n, SYM.comp_op);
  8782. if (NCH(n) === 1)
  8783. {
  8784. n = CHILD(n, 0);
  8785. switch (n.type)
  8786. {
  8787. case TOK.T_LESS: return Lt;
  8788. case TOK.T_GREATER: return Gt;
  8789. case TOK.T_EQEQUAL: return Eq;
  8790. case TOK.T_LESSEQUAL: return LtE;
  8791. case TOK.T_GREATEREQUAL: return GtE;
  8792. case TOK.T_NOTEQUAL: return NotEq;
  8793. case TOK.T_NAME:
  8794. if (n.value === "in") return In_;
  8795. if (n.value === "is") return Is;
  8796. }
  8797. }
  8798. else if (NCH(n) === 2)
  8799. {
  8800. if (CHILD(n, 0).type === TOK.T_NAME)
  8801. {
  8802. if (CHILD(n, 1).value === "in") return NotIn;
  8803. if (CHILD(n, 0).value === "is") return IsNot;
  8804. }
  8805. }
  8806. goog.asserts.fail("invalid comp_op");
  8807. }
  8808. function seqForTestlist(c, n)
  8809. {
  8810. /* testlist: test (',' test)* [','] */
  8811. goog.asserts.assert(n.type === SYM.testlist ||
  8812. n.type === SYM.listmaker ||
  8813. n.type === SYM.testlist_gexp ||
  8814. n.type === SYM.testlist_safe ||
  8815. n.type === SYM.testlist1);
  8816. var seq = [];
  8817. for (var i = 0; i < NCH(n); i += 2)
  8818. {
  8819. goog.asserts.assert(CHILD(n, i).type === SYM.test || CHILD(n, i).type === SYM.old_test);
  8820. seq[i / 2] = astForExpr(c, CHILD(n, i));
  8821. }
  8822. return seq;
  8823. }
  8824. function astForSuite(c, n)
  8825. {
  8826. /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
  8827. REQ(n, SYM.suite);
  8828. var seq = [];
  8829. var pos = 0;
  8830. var ch;
  8831. if (CHILD(n, 0).type === SYM.simple_stmt)
  8832. {
  8833. n = CHILD(n, 0);
  8834. /* simple_stmt always ends with an NEWLINE and may have a trailing
  8835. * SEMI. */
  8836. var end = NCH(n) - 1;
  8837. if (CHILD(n, end - 1).type === TOK.T_SEMI)
  8838. end -= 1;
  8839. for (var i = 0; i < end; i += 2) // by 2 to skip ;
  8840. seq[pos++] = astForStmt(c, CHILD(n, i));
  8841. }
  8842. else
  8843. {
  8844. for (var i = 2; i < NCH(n) - 1; ++i)
  8845. {
  8846. ch = CHILD(n, i);
  8847. REQ(ch, SYM.stmt);
  8848. var num = numStmts(ch);
  8849. if (num === 1)
  8850. {
  8851. // small_stmt or compound_stmt w/ only 1 child
  8852. seq[pos++] = astForStmt(c, ch);
  8853. }
  8854. else
  8855. {
  8856. ch = CHILD(ch, 0);
  8857. REQ(ch, SYM.simple_stmt);
  8858. for (var j = 0; j < NCH(ch); j += 2)
  8859. {
  8860. if (NCH(CHILD(ch, j)) === 0)
  8861. {
  8862. goog.asserts.assert(j + 1 === NCH(ch));
  8863. break;
  8864. }
  8865. seq[pos++] = astForStmt(c, CHILD(ch, j));
  8866. }
  8867. }
  8868. }
  8869. }
  8870. goog.asserts.assert(pos === numStmts(n));
  8871. return seq;
  8872. }
  8873. function astForExceptClause(c, exc, body)
  8874. {
  8875. /* except_clause: 'except' [test [(',' | 'as') test]] */
  8876. REQ(exc, SYM.except_clause);
  8877. REQ(body, SYM.suite);
  8878. if (NCH(exc) === 1)
  8879. return new ExceptHandler(null, null, astForSuite(c, body), exc.lineno, exc.col_offset);
  8880. else if (NCH(exc) === 2)
  8881. return new ExceptHandler(astForExpr(c, CHILD(exc, 1)), null, astForSuite(c, body), exc.lineno, exc.col_offset);
  8882. else if (NCH(exc) === 4)
  8883. {
  8884. var e = astForExpr(c, CHILD(exc, 3));
  8885. setContext(c, e, Store, CHILD(exc, 3));
  8886. return new ExceptHandler(astForExpr(c, CHILD(exc, 1)), e, astForSuite(c, body), exc.lineno, exc.col_offset);
  8887. }
  8888. goog.asserts.fail("wrong number of children for except clause");
  8889. }
  8890. function astForTryStmt(c, n)
  8891. {
  8892. var nc = NCH(n);
  8893. var nexcept = (nc - 3) / 3;
  8894. var body, orelse = null, finally_ = null;
  8895. REQ(n, SYM.try_stmt);
  8896. body = astForSuite(c, CHILD(n, 2));
  8897. if (CHILD(n, nc - 3).type === TOK.T_NAME)
  8898. {
  8899. if (CHILD(n, nc - 3).value === "finally")
  8900. {
  8901. if (nc >= 9 && CHILD(n, nc - 6).type === TOK.T_NAME)
  8902. {
  8903. /* we can assume it's an "else",
  8904. because nc >= 9 for try-else-finally and
  8905. it would otherwise have a type of except_clause */
  8906. orelse = astForSuite(c, CHILD(n, nc - 4));
  8907. nexcept--;
  8908. }
  8909. finally_ = astForSuite(c, CHILD(n, nc - 1));
  8910. nexcept--;
  8911. }
  8912. else
  8913. {
  8914. /* we can assume it's an "else",
  8915. otherwise it would have a type of except_clause */
  8916. orelse = astForSuite(c, CHILD(n, nc - 1));
  8917. nexcept--;
  8918. }
  8919. }
  8920. else if (CHILD(n, nc - 3).type !== SYM.except_clause)
  8921. {
  8922. throw new SyntaxError("malformed 'try' statement");
  8923. }
  8924. if (nexcept > 0)
  8925. {
  8926. var handlers = [];
  8927. for (var i = 0; i < nexcept; ++i)
  8928. handlers[i] = astForExceptClause(c, CHILD(n, 3 + i * 3), CHILD(n, 5 + i * 3));
  8929. var exceptSt = new TryExcept(body, handlers, orelse, n.lineno, n.col_offset);
  8930. /* if a 'finally' is present too, we nest the TryExcept within a
  8931. TryFinally to emulate try ... except ... finally */
  8932. body = [exceptSt];
  8933. }
  8934. goog.asserts.assert(finally_ !== null);
  8935. return new TryFinally(body, finally_, n.lineno, n.col_offset);
  8936. }
  8937. function astForDottedName(c, n)
  8938. {
  8939. REQ(n, SYM.dotted_name);
  8940. var lineno = n.lineno;
  8941. var col_offset = n.col_offset;
  8942. var id = strobj(CHILD(n, 0).value);
  8943. var e = new Name(id, Load, lineno, col_offset);
  8944. for (var i = 2; i < NCH(n); i += 2)
  8945. {
  8946. id = strobj(CHILD(n, i).value);
  8947. e = new Attribute(e, id, Load, lineno, col_offset);
  8948. }
  8949. return e;
  8950. }
  8951. function astForDecorator(c, n)
  8952. {
  8953. /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
  8954. REQ(n, SYM.decorator);
  8955. REQ(CHILD(n, 0), TOK.T_AT);
  8956. REQ(CHILD(n, NCH(n) - 1), TOK.T_NEWLINE);
  8957. var nameExpr = astForDottedName(c, CHILD(n, 1));
  8958. var d;
  8959. if (NCH(n) === 3) // no args
  8960. return nameExpr;
  8961. else if (NCH(n) === 5) // call with no args
  8962. return new Call(nameExpr, [], [], null, null, n.lineno, n.col_offset);
  8963. else
  8964. return astForCall(c, CHILD(n, 3), nameExpr);
  8965. }
  8966. function astForDecorators(c, n)
  8967. {
  8968. REQ(n, SYM.decorators);
  8969. var decoratorSeq = [];
  8970. for (var i = 0; i < NCH(n); ++i)
  8971. decoratorSeq[i] = astForDecorator(c, CHILD(n, i));
  8972. return decoratorSeq;
  8973. }
  8974. function astForDecorated(c, n)
  8975. {
  8976. REQ(n, SYM.decorated);
  8977. var decoratorSeq = astForDecorators(c, CHILD(n, 0));
  8978. goog.asserts.assert(CHILD(n, 1).type === SYM.funcdef || CHILD(n, 1).type === SYM.classdef);
  8979. var thing = null;
  8980. if (CHILD(n, 1).type === SYM.funcdef)
  8981. thing = astForFuncdef(c, CHILD(n, 1), decoratorSeq);
  8982. else if (CHILD(n, 1) === SYM.classdef)
  8983. thing = astForClassdef(c, CHILD(n, 1), decoratorSeq);
  8984. if (thing)
  8985. {
  8986. thing.lineno = n.lineno;
  8987. thing.col_offset = n.col_offset;
  8988. }
  8989. return thing;
  8990. }
  8991. function astForWithVar(c, n)
  8992. {
  8993. REQ(n, SYM.with_var);
  8994. return astForExpr(c, CHILD(n, 1));
  8995. }
  8996. function astForWithStmt(c, n)
  8997. {
  8998. /* with_stmt: 'with' test [ with_var ] ':' suite */
  8999. var suiteIndex = 3; // skip with, test, :
  9000. goog.asserts.assert(n.type === SYM.with_stmt);
  9001. var contextExpr = astForExpr(c, CHILD(n, 1));
  9002. if (CHILD(n, 2).type === SYM.with_var)
  9003. {
  9004. var optionalVars = astForWithVar(c, CHILD(n, 2));
  9005. setContext(c, optionalVars, Store, n);
  9006. suiteIndex = 4;
  9007. }
  9008. return new With_(contextExpr, optionalVars, astForSuite(c, CHILD(n, suiteIndex)), n.lineno, n.col_offset);
  9009. }
  9010. function astForExecStmt(c, n)
  9011. {
  9012. var expr1, globals = null, locals = null;
  9013. var nchildren = NCH(n);
  9014. goog.asserts.assert(nchildren === 2 || nchildren === 4 || nchildren === 6);
  9015. /* exec_stmt: 'exec' expr ['in' test [',' test]] */
  9016. REQ(n, SYM.exec_stmt);
  9017. var expr1 = astForExpr(c, CHILD(n, 1));
  9018. if (nchildren >= 4)
  9019. globals = astForExpr(c, CHILD(n, 3));
  9020. if (nchildren === 6)
  9021. locals = astForExpr(c, CHILD(n, 5));
  9022. return new Exec(expr1, globals, locals, n.lineno, n.col_offset);
  9023. }
  9024. function astForIfStmt(c, n)
  9025. {
  9026. /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
  9027. ['else' ':' suite]
  9028. */
  9029. REQ(n, SYM.if_stmt);
  9030. if (NCH(n) === 4)
  9031. return new If_(
  9032. astForExpr(c, CHILD(n, 1)),
  9033. astForSuite(c, CHILD(n, 3)),
  9034. [], n.lineno, n.col_offset);
  9035. var s = CHILD(n, 4).value;
  9036. var decider = s.charAt(2); // elSe or elIf
  9037. if (decider === 's')
  9038. {
  9039. return new If_(
  9040. astForExpr(c, CHILD(n, 1)),
  9041. astForSuite(c, CHILD(n, 3)),
  9042. astForSuite(c, CHILD(n, 6)),
  9043. n.lineno, n.col_offset);
  9044. }
  9045. else if (decider === 'i')
  9046. {
  9047. var nElif = NCH(n) - 4;
  9048. var hasElse = false;
  9049. var orelse = [];
  9050. /* must reference the child nElif+1 since 'else' token is third, not
  9051. * fourth child from the end. */
  9052. if (CHILD(n, nElif + 1).type === TOK.T_NAME
  9053. && CHILD(n, nElif + 1).value.charAt(2) === 's')
  9054. {
  9055. hasElse = true;
  9056. nElif -= 3;
  9057. }
  9058. nElif /= 4;
  9059. if (hasElse)
  9060. {
  9061. orelse = [
  9062. new If_(
  9063. astForExpr(c, CHILD(n, NCH(n) - 6)),
  9064. astForSuite(c, CHILD(n, NCH(n) - 4)),
  9065. astForSuite(c, CHILD(n, NCH(n) - 1)),
  9066. CHILD(n, NCH(n) - 6).lineno,
  9067. CHILD(n, NCH(n) - 6).col_offset)];
  9068. nElif--;
  9069. }
  9070. for (var i = 0; i < nElif; ++i)
  9071. {
  9072. var off = 5 + (nElif - i - 1) * 4;
  9073. orelse = [
  9074. new If_(
  9075. astForExpr(c, CHILD(n, off)),
  9076. astForSuite(c, CHILD(n, off + 2)),
  9077. orelse,
  9078. CHILD(n, off).lineno,
  9079. CHILD(n, off).col_offset)];
  9080. }
  9081. return new If_(
  9082. astForExpr(c, CHILD(n, 1)),
  9083. astForSuite(c, CHILD(n, 3)),
  9084. orelse, n.lineno, n.col_offset);
  9085. }
  9086. goog.asserts.fail("unexpected token in 'if' statement");
  9087. }
  9088. function astForExprlist(c, n, context)
  9089. {
  9090. REQ(n, SYM.exprlist);
  9091. var seq = [];
  9092. for (var i = 0; i < NCH(n); i += 2)
  9093. {
  9094. var e = astForExpr(c, CHILD(n, i));
  9095. seq[i / 2] = e;
  9096. if (context) setContext(c, e, context, CHILD(n, i));
  9097. }
  9098. return seq;
  9099. }
  9100. function astForDelStmt(c, n)
  9101. {
  9102. /* del_stmt: 'del' exprlist */
  9103. REQ(n, SYM.del_stmt);
  9104. return new Delete_(astForExprlist(c, CHILD(n, 1), Del), n.lineno, n.col_offset);
  9105. }
  9106. function astForGlobalStmt(c, n)
  9107. {
  9108. /* global_stmt: 'global' NAME (',' NAME)* */
  9109. REQ(n, SYM.global_stmt);
  9110. var s = [];
  9111. for (var i = 1; i < NCH(n); i += 2)
  9112. {
  9113. s[(i - 1) / 2] = strobj(CHILD(n, i).value);
  9114. }
  9115. return new Global(s, n.lineno, n.col_offset);
  9116. }
  9117. function astForAssertStmt(c, n)
  9118. {
  9119. /* assert_stmt: 'assert' test [',' test] */
  9120. REQ(n, SYM.assert_stmt);
  9121. if (NCH(n) === 2)
  9122. return new Assert(astForExpr(c, CHILD(n, 1)), null, n.lineno, n.col_offset);
  9123. else if (NCH(n) === 4)
  9124. return new Assert(astForExpr(c, CHILD(n, 1)), astForExpr(c, CHILD(n, 3)), n.lineno, n.col_offset);
  9125. goog.asserts.fail("improper number of parts to assert stmt");
  9126. }
  9127. function aliasForImportName(c, n)
  9128. {
  9129. /*
  9130. import_as_name: NAME ['as' NAME]
  9131. dotted_as_name: dotted_name ['as' NAME]
  9132. dotted_name: NAME ('.' NAME)*
  9133. */
  9134. loop: while (true) {
  9135. switch (n.type)
  9136. {
  9137. case SYM.import_as_name:
  9138. var str = null;
  9139. if (NCH(n) === 3)
  9140. str = CHILD(n, 2).value;
  9141. var name = strobj(CHILD(n, 0).value);
  9142. return new alias(name, strobj(str));
  9143. case SYM.dotted_as_name:
  9144. if (NCH(n) === 1)
  9145. {
  9146. n = CHILD(n, 0);
  9147. continue loop;
  9148. }
  9149. else
  9150. {
  9151. var a = aliasForImportName(c, CHILD(n, 0));
  9152. goog.asserts.assert(!a.asname);
  9153. a.asname = strobj(CHILD(n, 2).value);
  9154. return a;
  9155. }
  9156. case SYM.dotted_name:
  9157. if (NCH(n) === 1)
  9158. return new alias(strobj(CHILD(n, 0).value), null);
  9159. else
  9160. {
  9161. // create a string of the form a.b.c
  9162. var str = '';
  9163. for (var i = 0; i < NCH(n); i += 2)
  9164. str += CHILD(n, i).value + ".";
  9165. return new alias(strobj(str.substr(0, str.length - 1)), null);
  9166. }
  9167. case TOK.T_STAR:
  9168. return new alias(strobj("*"), null);
  9169. default:
  9170. throw new SyntaxError("unexpected import name");
  9171. }
  9172. break; }
  9173. }
  9174. function astForImportStmt(c, n)
  9175. {
  9176. /*
  9177. import_stmt: import_name | import_from
  9178. import_name: 'import' dotted_as_names
  9179. import_from: 'from' ('.'* dotted_name | '.') 'import'
  9180. ('*' | '(' import_as_names ')' | import_as_names)
  9181. */
  9182. REQ(n, SYM.import_stmt);
  9183. var lineno = n.lineno;
  9184. var col_offset = n.col_offset;
  9185. n = CHILD(n, 0);
  9186. if (n.type === SYM.import_name)
  9187. {
  9188. n = CHILD(n, 1);
  9189. REQ(n, SYM.dotted_as_names);
  9190. var aliases = [];
  9191. for (var i = 0; i < NCH(n); i += 2)
  9192. aliases[i / 2] = aliasForImportName(c, CHILD(n, i));
  9193. return new Import_(aliases, lineno, col_offset);
  9194. }
  9195. else if (n.type === SYM.import_from)
  9196. {
  9197. var mod = null;
  9198. var ndots = 0;
  9199. var nchildren;
  9200. for (var idx = 1; idx < NCH(n); ++idx)
  9201. {
  9202. if (CHILD(n, idx).type === SYM.dotted_name)
  9203. {
  9204. mod = aliasForImportName(c, CHILD(n, idx));
  9205. idx++;
  9206. break;
  9207. }
  9208. else if (CHILD(n, idx).type !== TOK.T_DOT)
  9209. break;
  9210. ndots++;
  9211. }
  9212. ++idx; // skip the import keyword
  9213. switch (CHILD(n, idx).type)
  9214. {
  9215. case TOK.T_STAR:
  9216. // from ... import
  9217. n = CHILD(n, idx);
  9218. nchildren = 1;
  9219. break;
  9220. case TOK.T_LPAR:
  9221. // from ... import (x, y, z)
  9222. n = CHILD(n, idx + 1);
  9223. nchildren = NCH(n);
  9224. break;
  9225. case SYM.import_as_names:
  9226. // from ... import x, y, z
  9227. n = CHILD(n, idx);
  9228. nchildren = NCH(n);
  9229. if (nchildren % 2 === 0)
  9230. throw new SyntaxError("trailing comma not allowed without surrounding parentheses");
  9231. break;
  9232. default:
  9233. throw new SyntaxError("Unexpected node-type in from-import");
  9234. }
  9235. var aliases = [];
  9236. if (n.type === TOK.T_STAR)
  9237. aliases[0] = aliasForImportName(c, n);
  9238. else
  9239. for (var i = 0; i < NCH(n); i += 2)
  9240. aliases[i / 2] = aliasForImportName(c, CHILD(n, i));
  9241. var modname = mod ? mod.name.v : "";
  9242. return new ImportFrom(strobj(modname), aliases, ndots, lineno, col_offset);
  9243. }
  9244. throw new SyntaxError("unknown import statement");
  9245. }
  9246. function astForTestlistGexp(c, n)
  9247. {
  9248. /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
  9249. /* argument: test [ gen_for ] */
  9250. goog.asserts.assert(n.type === SYM.testlist_gexp || n.type === SYM.argument);
  9251. if (NCH(n) > 1 && CHILD(n, 1).type === SYM.gen_for)
  9252. return astForGenexp(c, n);
  9253. return astForTestlist(c, n);
  9254. }
  9255. function astForListcomp(c, n)
  9256. {
  9257. /* listmaker: test ( list_for | (',' test)* [','] )
  9258. list_for: 'for' exprlist 'in' testlist_safe [list_iter]
  9259. list_iter: list_for | list_if
  9260. list_if: 'if' test [list_iter]
  9261. testlist_safe: test [(',' test)+ [',']]
  9262. */
  9263. function countListFors(c, n)
  9264. {
  9265. var nfors = 0;
  9266. var ch = CHILD(n, 1);
  9267. count_list_for: while(true) {
  9268. nfors++;
  9269. REQ(ch, SYM.list_for);
  9270. if (NCH(ch) === 5)
  9271. ch = CHILD(ch, 4);
  9272. else
  9273. return nfors;
  9274. count_list_iter: while(true) {
  9275. REQ(ch, SYM.list_iter);
  9276. ch = CHILD(ch, 0);
  9277. if (ch.type === SYM.list_for)
  9278. continue count_list_for;
  9279. else if (ch.type === SYM.list_if)
  9280. {
  9281. if (NCH(ch) === 3)
  9282. {
  9283. ch = CHILD(ch, 2);
  9284. continue count_list_iter;
  9285. }
  9286. else
  9287. return nfors;
  9288. }
  9289. break; }
  9290. break; }
  9291. }
  9292. function countListIfs(c, n)
  9293. {
  9294. var nifs = 0;
  9295. while (true)
  9296. {
  9297. REQ(n, SYM.list_iter);
  9298. if (CHILD(n, 0).type === SYM.list_for)
  9299. return nifs;
  9300. n = CHILD(n, 0);
  9301. REQ(n, SYM.list_if);
  9302. nifs++;
  9303. if (NCH(n) == 2)
  9304. return nifs;
  9305. n = CHILD(n, 2);
  9306. }
  9307. }
  9308. REQ(n, SYM.listmaker);
  9309. goog.asserts.assert(NCH(n) > 1);
  9310. var elt = astForExpr(c, CHILD(n, 0));
  9311. var nfors = countListFors(c, n);
  9312. var listcomps = [];
  9313. var ch = CHILD(n, 1);
  9314. for (var i = 0; i < nfors; ++i)
  9315. {
  9316. REQ(ch, SYM.list_for);
  9317. var forch = CHILD(ch, 1);
  9318. var t = astForExprlist(c, forch, Store);
  9319. var expression = astForTestlist(c, CHILD(ch, 3));
  9320. var lc;
  9321. if (NCH(forch) === 1)
  9322. lc = new comprehension(t[0], expression, []);
  9323. else
  9324. lc = new comprehension(new Tuple(t, Store, ch.lineno, ch.col_offset), expression, []);
  9325. if (NCH(ch) === 5)
  9326. {
  9327. ch = CHILD(ch, 4);
  9328. var nifs = countListIfs(c, ch);
  9329. var ifs = [];
  9330. for (var j = 0; j < nifs; ++j)
  9331. {
  9332. REQ(ch, SYM.list_iter);
  9333. ch = CHILD(ch, 0);
  9334. REQ(ch, SYM.list_if);
  9335. ifs[j] = astForExpr(c, CHILD(ch, 1));
  9336. if (NCH(ch) === 3)
  9337. ch = CHILD(ch, 2);
  9338. }
  9339. if (ch.type === SYM.list_iter)
  9340. ch = CHILD(ch, 0);
  9341. lc.ifs = ifs;
  9342. }
  9343. listcomps[i] = lc;
  9344. }
  9345. return new ListComp(elt, listcomps, n.lineno, n.col_offset);
  9346. }
  9347. function astForFactor(c, n)
  9348. {
  9349. /* some random peephole thing that cpy does */
  9350. if (CHILD(n, 0).type === TOK.T_MINUS && NCH(n) === 2)
  9351. {
  9352. var pfactor = CHILD(n, 1);
  9353. if (pfactor.type === SYM.factor && NCH(pfactor) === 1)
  9354. {
  9355. var ppower = CHILD(pfactor, 0);
  9356. if (ppower.type === SYM.power && NCH(ppower) === 1)
  9357. {
  9358. var patom = CHILD(ppower, 0);
  9359. if (patom.type === SYM.atom)
  9360. {
  9361. var pnum = CHILD(patom, 0);
  9362. if (pnum.type === TOK.T_NUMBER)
  9363. {
  9364. pnum.value = "-" + pnum.value;
  9365. return astForAtom(c, patom);
  9366. }
  9367. }
  9368. }
  9369. }
  9370. }
  9371. var expression = astForExpr(c, CHILD(n, 1));
  9372. switch (CHILD(n, 0).type)
  9373. {
  9374. case TOK.T_PLUS: return new UnaryOp(UAdd, expression, n.lineno, n.col_offset);
  9375. case TOK.T_MINUS: return new UnaryOp(USub, expression, n.lineno, n.col_offset);
  9376. case TOK.T_TILDE: return new UnaryOp(Invert, expression, n.lineno, n.col_offset);
  9377. }
  9378. goog.asserts.fail("unhandled factor");
  9379. }
  9380. function astForForStmt(c, n)
  9381. {
  9382. /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
  9383. var seq = [];
  9384. REQ(n, SYM.for_stmt);
  9385. if (NCH(n) === 9)
  9386. seq = astForSuite(c, CHILD(n, 8));
  9387. var nodeTarget = CHILD(n, 1);
  9388. var _target = astForExprlist(c, nodeTarget, Store);
  9389. var target;
  9390. if (NCH(nodeTarget) === 1)
  9391. target = _target[0];
  9392. else
  9393. target = new Tuple(_target, Store, n.lineno, n.col_offset);
  9394. return new For_(target,
  9395. astForTestlist(c, CHILD(n, 3)),
  9396. astForSuite(c, CHILD(n, 5)),
  9397. seq, n.lineno, n.col_offset);
  9398. }
  9399. function astForCall(c, n, func)
  9400. {
  9401. /*
  9402. arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
  9403. | '**' test)
  9404. argument: [test '='] test [gen_for] # Really [keyword '='] test
  9405. */
  9406. REQ(n, SYM.arglist);
  9407. var nargs = 0;
  9408. var nkeywords = 0;
  9409. var ngens = 0;
  9410. for (var i = 0; i < NCH(n); ++i)
  9411. {
  9412. var ch = CHILD(n, i);
  9413. if (ch.type === SYM.argument)
  9414. {
  9415. if (NCH(ch) === 1) nargs++;
  9416. else if (CHILD(ch, 1).type === SYM.gen_for) ngens++;
  9417. else nkeywords++;
  9418. }
  9419. }
  9420. if (ngens > 1 || (ngens && (nargs || nkeywords)))
  9421. throw new SyntaxError("Generator expression must be parenthesized if not sole argument");
  9422. if (nargs + nkeywords + ngens > 255)
  9423. throw new SyntaxError("more than 255 arguments");
  9424. var args = [];
  9425. var keywords = [];
  9426. nargs = 0;
  9427. nkeywords = 0;
  9428. var vararg = null;
  9429. var kwarg = null;
  9430. for (var i = 0; i < NCH(n); ++i)
  9431. {
  9432. var ch = CHILD(n, i);
  9433. if (ch.type === SYM.argument)
  9434. {
  9435. if (NCH(ch) === 1)
  9436. {
  9437. if (nkeywords) throw new SyntaxError("non-keyword arg after keyword arg");
  9438. if (vararg) throw new SyntaxError("only named arguments may follow *expression");
  9439. args[nargs++] = astForExpr(c, CHILD(ch, 0));
  9440. }
  9441. else if (CHILD(ch, 1).type === SYM.gen_for)
  9442. args[nargs++] = astForGenexp(c, ch);
  9443. else
  9444. {
  9445. var e = astForExpr(c, CHILD(ch, 0));
  9446. if (e.constructor === Lambda) throw new SyntaxError("lambda cannot contain assignment");
  9447. else if (e.constructor !== Name) throw new SyntaxError("keyword can't be an expression");
  9448. var key = e.id;
  9449. forbiddenCheck(c, CHILD(ch, 0), key);
  9450. for (var k = 0; k < nkeywords; ++k)
  9451. {
  9452. var tmp = keywords[k].arg;
  9453. if (tmp === key) throw new SyntaxError("keyword argument repeated");
  9454. }
  9455. keywords[nkeywords++] = new keyword(key, astForExpr(c, CHILD(ch, 2)));
  9456. }
  9457. }
  9458. else if (ch.type === TOK.T_STAR)
  9459. vararg = astForExpr(c, CHILD(n, ++i));
  9460. else if (ch.type === TOK.T_DOUBLESTAR)
  9461. kwarg = astForExpr(c, CHILD(n, ++i));
  9462. }
  9463. return new Call(func, args, keywords, vararg, kwarg, func.lineno, func.col_offset);
  9464. }
  9465. function astForTrailer(c, n, leftExpr)
  9466. {
  9467. /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
  9468. subscriptlist: subscript (',' subscript)* [',']
  9469. subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
  9470. */
  9471. REQ(n, SYM.trailer);
  9472. if (CHILD(n, 0).type === TOK.T_LPAR)
  9473. {
  9474. if (NCH(n) === 2)
  9475. return new Call(leftExpr, [], [], null, null, n.lineno, n.col_offset);
  9476. else
  9477. return astForCall(c, CHILD(n, 1), leftExpr);
  9478. }
  9479. else if (CHILD(n, 0).type === TOK.T_DOT)
  9480. return new Attribute(leftExpr, strobj(CHILD(n, 1).value), Load, n.lineno, n.col_offset);
  9481. else
  9482. {
  9483. REQ(CHILD(n, 0), TOK.T_LSQB);
  9484. REQ(CHILD(n, 2), TOK.T_RSQB);
  9485. n = CHILD(n, 1);
  9486. if (NCH(n) === 1)
  9487. return new Subscript(leftExpr, astForSlice(c, CHILD(n, 0)), Load, n.lineno, n.col_offset);
  9488. else
  9489. {
  9490. /* The grammar is ambiguous here. The ambiguity is resolved
  9491. by treating the sequence as a tuple literal if there are
  9492. no slice features.
  9493. */
  9494. var simple = true;
  9495. var slices = [];
  9496. for (var j = 0; j < NCH(n); j += 2)
  9497. {
  9498. var slc = astForSlice(c, CHILD(n, j));
  9499. if (slc.constructor !== Index)
  9500. simple = false;
  9501. slices[j / 2] = slc;
  9502. }
  9503. if (!simple)
  9504. {
  9505. return new Subscript(leftExpr, new ExtSlice(slices), Load, n.lineno, n.col_offset);
  9506. }
  9507. var elts = [];
  9508. for (var j = 0; j < slices.length; ++j)
  9509. {
  9510. var slc = slices[j];
  9511. goog.asserts.assert(slc.constructor === Index && slc.value !== null && slc.vaule !== undefined);
  9512. elts[j] = slc.value;
  9513. }
  9514. var e = new Tuple(elts, Load, n.lineno, n.col_offset);
  9515. return new Subscript(leftExpr, new Index(e), Load, n.lineno, n.col_offset);
  9516. }
  9517. }
  9518. }
  9519. function astForFlowStmt(c, n)
  9520. {
  9521. /*
  9522. flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
  9523. | yield_stmt
  9524. break_stmt: 'break'
  9525. continue_stmt: 'continue'
  9526. return_stmt: 'return' [testlist]
  9527. yield_stmt: yield_expr
  9528. yield_expr: 'yield' testlist
  9529. raise_stmt: 'raise' [test [',' test [',' test]]]
  9530. */
  9531. var ch;
  9532. REQ(n, SYM.flow_stmt);
  9533. ch = CHILD(n, 0);
  9534. switch (ch.type)
  9535. {
  9536. case SYM.break_stmt: return new Break_(n.lineno, n.col_offset);
  9537. case SYM.continue_stmt: return new Continue_(n.lineno, n.col_offset);
  9538. case SYM.yield_stmt:
  9539. return new Expr(astForExpr(c, CHILD(ch, 0)), n.lineno, n.col_offset);
  9540. case SYM.return_stmt:
  9541. if (NCH(ch) === 1)
  9542. return new Return_(null, n.lineno, n.col_offset);
  9543. else
  9544. return new Return_(astForTestlist(c, CHILD(ch, 1)), n.lineno, n.col_offset);
  9545. case SYM.raise_stmt:
  9546. if (NCH(ch) === 1)
  9547. return new Raise(null, null, null, n.lineno, n.col_offset);
  9548. else if (NCH(ch) === 2)
  9549. return new Raise(astForExpr(c, CHILD(ch, 1)), null, null, n.lineno, n.col_offset);
  9550. else if (NCH(ch) === 4)
  9551. return new Raise(
  9552. astForExpr(c, CHILD(ch, 1)),
  9553. astForExpr(c, CHILD(ch, 3)),
  9554. null, n.lineno, n.col_offset);
  9555. else if (NCH(ch) === 6)
  9556. return new Raise(
  9557. astForExpr(c, CHILD(ch, 1)),
  9558. astForExpr(c, CHILD(ch, 3)),
  9559. astForExpr(c, CHILD(ch, 5)),
  9560. n.lineno, n.col_offset);
  9561. default:
  9562. goog.asserts.fail("unexpected flow_stmt");
  9563. }
  9564. goog.asserts.fail("unhandled flow statement");
  9565. }
  9566. function astForArguments(c, n)
  9567. {
  9568. /* parameters: '(' [varargslist] ')'
  9569. varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
  9570. | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
  9571. */
  9572. var ch;
  9573. var vararg = null;
  9574. var kwarg = null;
  9575. if (n.type === SYM.parameters)
  9576. {
  9577. if (NCH(n) === 2) // () as arglist
  9578. return new arguments_([], null, null, []);
  9579. n = CHILD(n, 1);
  9580. }
  9581. REQ(n, SYM.varargslist);
  9582. var args = [];
  9583. var defaults = [];
  9584. /* fpdef: NAME | '(' fplist ')'
  9585. fplist: fpdef (',' fpdef)* [',']
  9586. */
  9587. var foundDefault = false;
  9588. var i = 0;
  9589. var j = 0; // index for defaults
  9590. var k = 0; // index for args
  9591. while (i < NCH(n))
  9592. {
  9593. ch = CHILD(n, i);
  9594. switch (ch.type)
  9595. {
  9596. case SYM.fpdef:
  9597. var complexArgs = 0;
  9598. var parenthesized = 0;
  9599. handle_fpdef: while (true) {
  9600. if (i + 1 < NCH(n) && CHILD(n, i + 1).type === TOK.T_EQUAL)
  9601. {
  9602. defaults[j++] = astForExpr(c, CHILD(n, i + 2));
  9603. i += 2;
  9604. foundDefault = true;
  9605. }
  9606. else if (foundDefault)
  9607. {
  9608. /* def f((x)=4): pass should raise an error.
  9609. def f((x, (y))): pass will just incur the tuple unpacking warning. */
  9610. if (parenthesized && !complexArgs)
  9611. throw new SyntaxError("parenthesized arg with default");
  9612. throw new SyntaxError("non-default argument follows default argument");
  9613. }
  9614. if (NCH(ch) === 3)
  9615. {
  9616. ch = CHILD(ch, 1);
  9617. // def foo((x)): is not complex, special case.
  9618. if (NCH(ch) !== 1)
  9619. {
  9620. throw new SyntaxError("tuple parameter unpacking has been removed");
  9621. }
  9622. else
  9623. {
  9624. /* def foo((x)): setup for checking NAME below. */
  9625. /* Loop because there can be many parens and tuple
  9626. unpacking mixed in. */
  9627. parenthesized = true;
  9628. ch = CHILD(ch, 0);
  9629. goog.asserts.assert(ch.type === SYM.fpdef);
  9630. continue handle_fpdef;
  9631. }
  9632. }
  9633. if (CHILD(ch, 0).type === TOK.T_NAME)
  9634. {
  9635. forbiddenCheck(c, n, CHILD(ch, 0).value);
  9636. var id = strobj(CHILD(ch, 0).value);
  9637. args[k++] = new Name(id, Param, ch.lineno, ch.col_offset);
  9638. }
  9639. i += 2;
  9640. if (parenthesized)
  9641. throw new SyntaxError("parenthesized argument names are invalid");
  9642. break; }
  9643. break;
  9644. case TOK.T_STAR:
  9645. forbiddenCheck(c, CHILD(n, i + 1), CHILD(n, i + 1).value);
  9646. vararg = CHILD(n, i + 1).value;
  9647. i += 3;
  9648. break;
  9649. case TOK.T_DOUBLESTAR:
  9650. forbiddenCheck(c, CHILD(n, i + 1), CHILD(n, i + 1).value);
  9651. kwarg = CHILD(n, i + 1).value;
  9652. i += 3;
  9653. break;
  9654. default:
  9655. goog.asserts.fail("unexpected node in varargslist");
  9656. }
  9657. }
  9658. return new arguments_(args, vararg, kwarg, defaults);
  9659. }
  9660. function astForFuncdef(c, n, decoratorSeq)
  9661. {
  9662. /* funcdef: 'def' NAME parameters ':' suite */
  9663. REQ(n, SYM.funcdef);
  9664. var name = strobj(CHILD(n, 1).value);
  9665. forbiddenCheck(c, CHILD(n, 1), CHILD(n, 1).value);
  9666. var args = astForArguments(c, CHILD(n, 2));
  9667. var body = astForSuite(c, CHILD(n, 4));
  9668. return new FunctionDef(name, args, body, decoratorSeq, n.lineno, n.col_offset);
  9669. }
  9670. function astForClassBases(c, n)
  9671. {
  9672. /* testlist: test (',' test)* [','] */
  9673. goog.asserts.assert(NCH(n) > 0);
  9674. REQ(n, SYM.testlist);
  9675. if (NCH(n) === 1)
  9676. return [ astForExpr(c, CHILD(n, 0)) ];
  9677. return seqForTestlist(c, n);
  9678. }
  9679. function astForClassdef(c, n, decoratorSeq)
  9680. {
  9681. /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
  9682. REQ(n, SYM.classdef);
  9683. forbiddenCheck(c, n, CHILD(n, 1).value);
  9684. var classname = strobj(CHILD(n, 1).value);
  9685. if (NCH(n) === 4)
  9686. return new ClassDef(classname, [], astForSuite(c, CHILD(n, 3)), decoratorSeq, n.lineno, n.col_offset);
  9687. if (CHILD(n, 3).type === TOK.T_RPAR)
  9688. return new ClassDef(classname, [], astForSuite(c, CHILD(n, 5)), decoratorSeq, n.lineno, n.col_offset);
  9689. var bases = astForClassBases(c, CHILD(n, 3));
  9690. var s = astForSuite(c, CHILD(n, 6));
  9691. return new ClassDef(classname, bases, s, decoratorSeq, n.lineno, n.col_offset);
  9692. }
  9693. function astForLambdef(c, n)
  9694. {
  9695. /* lambdef: 'lambda' [varargslist] ':' test */
  9696. var args;
  9697. var expression;
  9698. if (NCH(n) === 3)
  9699. {
  9700. args = new arguments_([], null, null, []);
  9701. expression = astForExpr(c, CHILD(n, 2));
  9702. }
  9703. else
  9704. {
  9705. args = astForArguments(c, CHILD(n, 1));
  9706. expression = astForExpr(c, CHILD(n, 3));
  9707. }
  9708. return new Lambda(args, expression, n.lineno, n.col_offset);
  9709. }
  9710. function astForGenexp(c, n)
  9711. {
  9712. /* testlist_gexp: test ( gen_for | (',' test)* [','] )
  9713. argument: [test '='] test [gen_for] # Really [keyword '='] test */
  9714. goog.asserts.assert(n.type === SYM.testlist_gexp || n.type === SYM.argument);
  9715. goog.asserts.assert(NCH(n) > 1);
  9716. function countGenFors(c, n)
  9717. {
  9718. var nfors = 0;
  9719. var ch = CHILD(n, 1);
  9720. count_gen_for: while(true) {
  9721. nfors++;
  9722. REQ(ch, SYM.gen_for);
  9723. if (NCH(ch) === 5)
  9724. ch = CHILD(ch, 4);
  9725. else
  9726. return nfors;
  9727. count_gen_iter: while(true) {
  9728. REQ(ch, SYM.gen_iter);
  9729. ch = CHILD(ch, 0);
  9730. if (ch.type === SYM.gen_for)
  9731. continue count_gen_for;
  9732. else if (ch.type === SYM.gen_if)
  9733. {
  9734. if (NCH(ch) === 3)
  9735. {
  9736. ch = CHILD(ch, 2);
  9737. continue count_gen_iter;
  9738. }
  9739. else
  9740. return nfors;
  9741. }
  9742. break; }
  9743. break; }
  9744. goog.asserts.fail("logic error in countGenFors");
  9745. }
  9746. function countGenIfs(c, n)
  9747. {
  9748. var nifs = 0;
  9749. while (true)
  9750. {
  9751. REQ(n, SYM.gen_iter);
  9752. if (CHILD(n, 0).type === SYM.gen_for)
  9753. return nifs;
  9754. n = CHILD(n, 0);
  9755. REQ(n, SYM.gen_if);
  9756. nifs++;
  9757. if (NCH(n) == 2)
  9758. return nifs;
  9759. n = CHILD(n, 2);
  9760. }
  9761. }
  9762. var elt = astForExpr(c, CHILD(n, 0));
  9763. var nfors = countGenFors(c, n);
  9764. var genexps = [];
  9765. var ch = CHILD(n, 1);
  9766. for (var i = 0; i < nfors; ++i)
  9767. {
  9768. REQ(ch, SYM.gen_for);
  9769. var forch = CHILD(ch, 1);
  9770. var t = astForExprlist(c, forch, Store);
  9771. var expression = astForExpr(c, CHILD(ch, 3));
  9772. var ge;
  9773. if (NCH(forch) === 1)
  9774. ge = new comprehension(t[0], expression, []);
  9775. else
  9776. ge = new comprehension(new Tuple(t, Store, ch.lineno, ch.col_offset), expression, []);
  9777. if (NCH(ch) === 5)
  9778. {
  9779. ch = CHILD(ch, 4);
  9780. var nifs = countGenIfs(c, ch);
  9781. var ifs = [];
  9782. for (var j = 0; j < nifs; ++j)
  9783. {
  9784. REQ(ch, SYM.gen_iter);
  9785. ch = CHILD(ch, 0);
  9786. REQ(ch, SYM.gen_if);
  9787. expression = astForExpr(c, CHILD(ch, 1));
  9788. ifs[j] = expression;
  9789. if (NCH(ch) === 3)
  9790. ch = CHILD(ch, 2);
  9791. }
  9792. if (ch.type === SYM.gen_iter)
  9793. ch = CHILD(ch, 0);
  9794. ge.ifs = ifs;
  9795. }
  9796. genexps[i] = ge;
  9797. }
  9798. return new GeneratorExp(elt, genexps, n.lineno, n.col_offset);
  9799. }
  9800. function astForWhileStmt(c, n)
  9801. {
  9802. /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
  9803. REQ(n, SYM.while_stmt);
  9804. if (NCH(n) === 4)
  9805. return new While_(astForExpr(c, CHILD(n, 1)), astForSuite(c, CHILD(n, 3)), [], n.lineno, n.col_offset);
  9806. else if (NCH(n) === 7)
  9807. return new While_(astForExpr(c, CHILD(n, 1)), astForSuite(c, CHILD(n, 3)), astForSuite(c, CHILD(n, 6)), n.lineno, n.col_offset);
  9808. goog.asserts.fail("wrong number of tokens for 'while' stmt");
  9809. }
  9810. function astForAugassign(c, n)
  9811. {
  9812. REQ(n, SYM.augassign);
  9813. n = CHILD(n, 0);
  9814. switch (n.value.charAt(0))
  9815. {
  9816. case '+': return Add;
  9817. case '-': return Sub;
  9818. case '/': if (n.value.charAt(1) === '/') return FloorDiv;
  9819. return Div;
  9820. case '%': return Mod;
  9821. case '<': return LShift;
  9822. case '>': return RShift;
  9823. case '&': return BitAnd;
  9824. case '^': return BitXor;
  9825. case '|': return BitOr;
  9826. case '*': if (n.value.charAt(1) === '*') return Pow;
  9827. return Mult;
  9828. default: goog.asserts.fail("invalid augassign");
  9829. }
  9830. }
  9831. function astForBinop(c, n)
  9832. {
  9833. /* Must account for a sequence of expressions.
  9834. How should A op B op C by represented?
  9835. BinOp(BinOp(A, op, B), op, C).
  9836. */
  9837. var result = new BinOp(
  9838. astForExpr(c, CHILD(n, 0)),
  9839. getOperator(CHILD(n, 1)),
  9840. astForExpr(c, CHILD(n, 2)),
  9841. n.lineno, n.col_offset);
  9842. var nops = (NCH(n) - 1) / 2;
  9843. for (var i = 1 ; i < nops; ++i)
  9844. {
  9845. var nextOper = CHILD(n, i * 2 + 1);
  9846. var newoperator = getOperator(nextOper);
  9847. var tmp = astForExpr(c, CHILD(n, i * 2 + 2));
  9848. result = new BinOp(result, newoperator, tmp, nextOper.lineno, nextOper.col_offset);
  9849. }
  9850. return result;
  9851. }
  9852. function astForTestlist(c, n)
  9853. {
  9854. /* testlist_gexp: test (',' test)* [','] */
  9855. /* testlist: test (',' test)* [','] */
  9856. /* testlist_safe: test (',' test)+ [','] */
  9857. /* testlist1: test (',' test)* */
  9858. goog.asserts.assert(NCH(n) > 0);
  9859. if (n.type === SYM.testlist_gexp)
  9860. {
  9861. if (NCH(n) > 1)
  9862. {
  9863. goog.asserts.assert(CHILD(n, 1).type !== SYM.gen_for);
  9864. }
  9865. }
  9866. else
  9867. {
  9868. goog.asserts.assert(n.type === SYM.testlist || n.type === SYM.testlist_safe || n.type === SYM.testlist1);
  9869. }
  9870. if (NCH(n) === 1)
  9871. {
  9872. return astForExpr(c, CHILD(n, 0));
  9873. }
  9874. else
  9875. {
  9876. return new Tuple(seqForTestlist(c, n), Load, n.lineno, n.col_offset);
  9877. }
  9878. }
  9879. function astForExprStmt(c, n)
  9880. {
  9881. REQ(n, SYM.expr_stmt);
  9882. /* expr_stmt: testlist (augassign (yield_expr|testlist)
  9883. | ('=' (yield_expr|testlist))*)
  9884. testlist: test (',' test)* [',']
  9885. augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
  9886. | '<<=' | '>>=' | '**=' | '//='
  9887. test: ... here starts the operator precendence dance
  9888. */
  9889. if (NCH(n) === 1)
  9890. return new Expr(astForTestlist(c, CHILD(n, 0)), n.lineno, n.col_offset);
  9891. else if (CHILD(n, 1).type === SYM.augassign)
  9892. {
  9893. var ch = CHILD(n, 0);
  9894. var expr1 = astForTestlist(c, ch);
  9895. switch (expr1.constructor)
  9896. {
  9897. case GeneratorExp: throw new SyntaxError("augmented assignment to generator expression not possible");
  9898. case Yield: throw new SyntaxError("augmented assignment to yield expression not possible");
  9899. case Name:
  9900. var varName = expr1.id;
  9901. forbiddenCheck(c, ch, varName);
  9902. break;
  9903. case Attribute:
  9904. case Subscript:
  9905. break;
  9906. default:
  9907. throw new SyntaxError("illegal expression for augmented assignment");
  9908. }
  9909. setContext(c, expr1, Store, ch);
  9910. ch = CHILD(n, 2);
  9911. var expr2;
  9912. if (ch.type === SYM.testlist)
  9913. expr2 = astForTestlist(c, ch);
  9914. else
  9915. expr2 = astForExpr(c, ch);
  9916. return new AugAssign(expr1, astForAugassign(c, CHILD(n, 1)), expr2, n.lineno, n.col_offset);
  9917. }
  9918. else
  9919. {
  9920. // normal assignment
  9921. REQ(CHILD(n, 1), TOK.T_EQUAL);
  9922. var targets = [];
  9923. for (var i = 0; i < NCH(n) - 2; i += 2)
  9924. {
  9925. var ch = CHILD(n, i);
  9926. if (ch.type === SYM.yield_expr) throw new SyntaxError("assignment to yield expression not possible");
  9927. var e = astForTestlist(c, ch);
  9928. setContext(c, e, Store, CHILD(n, i));
  9929. targets[i / 2] = e;
  9930. }
  9931. var value = CHILD(n, NCH(n) - 1);
  9932. var expression;
  9933. if (value.type === SYM.testlist)
  9934. expression = astForTestlist(c, value);
  9935. else
  9936. expression = astForExpr(c, value);
  9937. return new Assign(targets, expression, n.lineno, n.col_offset);
  9938. }
  9939. }
  9940. function astForIfexpr(c, n)
  9941. {
  9942. /* test: or_test 'if' or_test 'else' test */
  9943. goog.asserts.assert(NCH(n) === 5);
  9944. return new IfExp(
  9945. astForExpr(c, CHILD(n, 0)),
  9946. astForExpr(c, CHILD(n, 2)),
  9947. astForExpr(c, CHILD(n, 4)),
  9948. n.lineno, n.col_offset);
  9949. }
  9950. /**
  9951. * s is a python-style string literal, including quote characters and u/r/b
  9952. * prefixes. Returns decoded string object.
  9953. */
  9954. function parsestr(c, s)
  9955. {
  9956. var encodeUtf8 = function(s) { return unescape(encodeURIComponent(s)); };
  9957. var decodeUtf8 = function(s) { return decodeURIComponent(escape(s)); };
  9958. var decodeEscape = function(s)
  9959. {
  9960. var len = s.length;
  9961. var ret = '';
  9962. for (var i = 0; i < len; ++i)
  9963. {
  9964. var c = s[i];
  9965. if (c === '\\')
  9966. {
  9967. ++i;
  9968. c = s[i];
  9969. if (c === 'n') ret += "\n";
  9970. else if (c === '\\') ret += "\\";
  9971. else if (c === 't') ret += "\t";
  9972. else if (c === 'r') ret += "\r";
  9973. else if (c === '0') ret += "\0";
  9974. else if (c === 'x')
  9975. {
  9976. var d0 = s[++i];
  9977. var d1 = s[++i];
  9978. ret += String.fromCharCode(parseInt(d0+d1, 16));
  9979. }
  9980. else if (c === 'u' || c === 'U')
  9981. {
  9982. var d0 = s[++i];
  9983. var d1 = s[++i];
  9984. var d2 = s[++i];
  9985. var d3 = s[++i];
  9986. ret += String.fromCharCode(parseInt(d0+d1, 16), parseInt(d2+d3, 16));
  9987. }
  9988. else
  9989. {
  9990. goog.asserts.fail("unhandled escape");
  9991. }
  9992. }
  9993. else
  9994. {
  9995. ret += c;
  9996. }
  9997. }
  9998. return ret;
  9999. };
  10000. //print("parsestr", s);
  10001. var quote = s.charAt(0);
  10002. var rawmode = false;
  10003. var unicode = false;
  10004. if (quote === 'u' || quote === 'U')
  10005. {
  10006. s = s.substr(1);
  10007. quote = s.charAt(0);
  10008. unicode = true;
  10009. }
  10010. else if (quote === 'r' || quote === 'R')
  10011. {
  10012. s = s.substr(1);
  10013. quote = s.charAt(0);
  10014. rawmode = true;
  10015. }
  10016. goog.asserts.assert(quote !== 'b' && quote !== 'B', "todo; haven't done b'' strings yet");
  10017. goog.asserts.assert(quote === "'" || quote === '"' && s.charAt(s.length - 1) === quote);
  10018. s = s.substr(1, s.length - 2);
  10019. if (unicode) {
  10020. s = encodeUtf8(s);
  10021. }
  10022. if (s.length >= 4 && s.charAt(0) === quote && s.charAt(1) === quote)
  10023. {
  10024. goog.asserts.assert(s.charAt(s.length - 1) === quote && s.charAt(s.length - 2) === quote);
  10025. s = s.substr(2, s.length - 4);
  10026. }
  10027. if (rawmode || s.indexOf('\\') === -1)
  10028. {
  10029. return strobj(decodeUtf8(s));
  10030. }
  10031. return strobj(decodeEscape(s));
  10032. }
  10033. function parsestrplus(c, n)
  10034. {
  10035. REQ(CHILD(n, 0), TOK.T_STRING);
  10036. var ret = new Sk.builtin.str("");
  10037. for (var i = 0; i < NCH(n); ++i)
  10038. {
  10039. ret = ret.sq$concat(parsestr(c, CHILD(n, i).value));
  10040. }
  10041. return ret;
  10042. }
  10043. function parsenumber(c, s)
  10044. {
  10045. // todo; no complex support
  10046. var end = s.charAt(s.length - 1);
  10047. if (end === 'l' || end === 'L')
  10048. return Sk.longFromStr(s.substr(0, s.length - 1));
  10049. var k = goog.global.eval(s);
  10050. if ((k > Sk.builtin.lng.threshold$ || k < -Sk.builtin.lng.threshold$)
  10051. && Math.floor(k) === k)
  10052. {
  10053. return Sk.longFromStr(s);
  10054. }
  10055. // todo; we don't currently distinguish between int and float so str is wrong
  10056. // for these.
  10057. if (s.indexOf('.') !== -1
  10058. || s.indexOf('e') !== -1
  10059. || s.indexOf('E') !== -1)
  10060. {
  10061. return parseFloat(s);
  10062. }
  10063. // ugly gunk to placate an overly-nanny closure-compiler:
  10064. // http://code.google.com/p/closure-compiler/issues/detail?id=111
  10065. // this is all just to emulate "parseInt(s)" with no radix.
  10066. var tmp = s;
  10067. if (s.charAt(0) === '-') tmp = s.substr(1);
  10068. if (tmp.charAt(0) === '0' && (tmp.charAt(1) === 'x' || tmp.charAt(1) === 'X'))
  10069. return parseInt(s, 16);
  10070. else if (tmp.charAt(0) === '0' && (tmp.charAt(1) === 'b' || tmp.charAt(1) === 'B'))
  10071. return parseInt(s, 2);
  10072. else if (tmp.charAt(0) === '0')
  10073. return parseInt(s, 8);
  10074. else
  10075. return parseInt(s, 10);
  10076. }
  10077. function astForSlice(c, n)
  10078. {
  10079. REQ(n, SYM.subscript);
  10080. /*
  10081. subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
  10082. sliceop: ':' [test]
  10083. */
  10084. var ch = CHILD(n, 0);
  10085. var lower = null;
  10086. var upper = null;
  10087. var step = null;
  10088. if (ch.type === TOK.T_DOT)
  10089. return new Ellipsis();
  10090. if (NCH(n) === 1 && ch.type === SYM.test)
  10091. return new Index(astForExpr(c, ch));
  10092. if (ch.type === SYM.test)
  10093. lower = astForExpr(c, ch);
  10094. if (ch.type === TOK.T_COLON)
  10095. {
  10096. if (NCH(n) > 1)
  10097. {
  10098. var n2 = CHILD(n, 1);
  10099. if (n2.type === SYM.test)
  10100. upper = astForExpr(c, n2);
  10101. }
  10102. }
  10103. else if (NCH(n) > 2)
  10104. {
  10105. var n2 = CHILD(n, 2);
  10106. if (n2.type === SYM.test)
  10107. upper = astForExpr(c, n2);
  10108. }
  10109. ch = CHILD(n, NCH(n) - 1);
  10110. if (ch.type === SYM.sliceop)
  10111. {
  10112. if (NCH(ch) === 1)
  10113. {
  10114. ch = CHILD(ch, 0);
  10115. step = new Name(strobj("None"), Load, ch.lineno, ch.col_offset);
  10116. }
  10117. else
  10118. {
  10119. ch = CHILD(ch, 1);
  10120. if (ch.type === SYM.test)
  10121. step = astForExpr(c, ch);
  10122. }
  10123. }
  10124. return new Slice(lower, upper, step);
  10125. }
  10126. function astForAtom(c, n)
  10127. {
  10128. /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
  10129. | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
  10130. */
  10131. var ch = CHILD(n, 0);
  10132. switch (ch.type)
  10133. {
  10134. case TOK.T_NAME:
  10135. // All names start in Load context, but may be changed later
  10136. return new Name(strobj(ch.value), Load, n.lineno, n.col_offset);
  10137. case TOK.T_STRING:
  10138. return new Str(parsestrplus(c, n), n.lineno, n.col_offset);
  10139. case TOK.T_NUMBER:
  10140. return new Num(parsenumber(c, ch.value), n.lineno, n.col_offset);
  10141. case TOK.T_LPAR: // various uses for parens
  10142. ch = CHILD(n, 1);
  10143. if (ch.type === TOK.T_RPAR)
  10144. return new Tuple([], Load, n.lineno, n.col_offset);
  10145. if (ch.type === SYM.yield_expr)
  10146. return astForExpr(c, ch);
  10147. if (NCH(ch) > 1 && CHILD(ch, 1).type === SYM.gen_for)
  10148. return astForGenexp(c, ch);
  10149. return astForTestlistGexp(c, ch);
  10150. case TOK.T_LSQB: // list or listcomp
  10151. ch = CHILD(n, 1);
  10152. if (ch.type === TOK.T_RSQB)
  10153. return new List([], Load, n.lineno, n.col_offset);
  10154. REQ(ch, SYM.listmaker);
  10155. if (NCH(ch) === 1 || CHILD(ch, 1).type === TOK.T_COMMA)
  10156. return new List(seqForTestlist(c, ch), Load, n.lineno, n.col_offset);
  10157. else
  10158. return astForListcomp(c, ch);
  10159. case TOK.T_LBRACE:
  10160. /* dictmaker: test ':' test (',' test ':' test)* [','] */
  10161. ch = CHILD(n, 1);
  10162. var size = Math.floor((NCH(ch) + 1) / 4); // + 1 for no trailing comma case
  10163. var keys = [];
  10164. var values = [];
  10165. for (var i = 0; i < NCH(ch); i += 4)
  10166. {
  10167. keys[i / 4] = astForExpr(c, CHILD(ch, i));
  10168. values[i / 4] = astForExpr(c, CHILD(ch, i + 2));
  10169. }
  10170. return new Dict(keys, values, n.lineno, n.col_offset);
  10171. case TOK.T_BACKQUOTE:
  10172. throw new SyntaxError("backquote not supported, use repr()");
  10173. default:
  10174. goog.asserts.fail("unhandled atom", ch.type);
  10175. }
  10176. }
  10177. function astForPower(c, n)
  10178. {
  10179. /* power: atom trailer* ('**' factor)*
  10180. */
  10181. REQ(n, SYM.power);
  10182. var e = astForAtom(c, CHILD(n, 0));
  10183. if (NCH(n) === 1) return e;
  10184. for (var i = 1; i < NCH(n); ++i)
  10185. {
  10186. var ch = CHILD(n, i);
  10187. if (ch.type !== SYM.trailer)
  10188. break;
  10189. var tmp = astForTrailer(c, ch, e);
  10190. tmp.lineno = e.lineno;
  10191. tmp.col_offset = e.col_offset;
  10192. e = tmp;
  10193. }
  10194. if (CHILD(n, NCH(n) - 1).type === SYM.factor)
  10195. {
  10196. var f = astForExpr(c, CHILD(n, NCH(n) - 1));
  10197. e = new BinOp(e, Pow, f, n.lineno, n.col_offset);
  10198. }
  10199. return e;
  10200. }
  10201. function astForExpr(c, n)
  10202. {
  10203. /* handle the full range of simple expressions
  10204. test: or_test ['if' or_test 'else' test] | lambdef
  10205. or_test: and_test ('or' and_test)*
  10206. and_test: not_test ('and' not_test)*
  10207. not_test: 'not' not_test | comparison
  10208. comparison: expr (comp_op expr)*
  10209. expr: xor_expr ('|' xor_expr)*
  10210. xor_expr: and_expr ('^' and_expr)*
  10211. and_expr: shift_expr ('&' shift_expr)*
  10212. shift_expr: arith_expr (('<<'|'>>') arith_expr)*
  10213. arith_expr: term (('+'|'-') term)*
  10214. term: factor (('*'|'/'|'%'|'//') factor)*
  10215. factor: ('+'|'-'|'~') factor | power
  10216. power: atom trailer* ('**' factor)*
  10217. As well as modified versions that exist for backward compatibility,
  10218. to explicitly allow:
  10219. [ x for x in lambda: 0, lambda: 1 ]
  10220. (which would be ambiguous without these extra rules)
  10221. old_test: or_test | old_lambdef
  10222. old_lambdef: 'lambda' [vararglist] ':' old_test
  10223. */
  10224. LOOP: while (true) {
  10225. switch (n.type)
  10226. {
  10227. case SYM.test:
  10228. case SYM.old_test:
  10229. if (CHILD(n, 0).type === SYM.lambdef || CHILD(n, 0).type === SYM.old_lambdef)
  10230. return astForLambdef(c, CHILD(n, 0));
  10231. else if (NCH(n) > 1)
  10232. return astForIfexpr(c, n);
  10233. // fallthrough
  10234. case SYM.or_test:
  10235. case SYM.and_test:
  10236. if (NCH(n) === 1)
  10237. {
  10238. n = CHILD(n, 0);
  10239. continue LOOP;
  10240. }
  10241. var seq = [];
  10242. for (var i = 0; i < NCH(n); i += 2)
  10243. seq[i / 2] = astForExpr(c, CHILD(n, i));
  10244. if (CHILD(n, 1).value === "and")
  10245. return new BoolOp(And, seq, n.lineno, n.col_offset);
  10246. goog.asserts.assert(CHILD(n, 1).value === "or");
  10247. return new BoolOp(Or, seq, n.lineno, n.col_offset);
  10248. case SYM.not_test:
  10249. if (NCH(n) === 1)
  10250. {
  10251. n = CHILD(n, 0);
  10252. continue LOOP;
  10253. }
  10254. else
  10255. {
  10256. return new UnaryOp(Not, astForExpr(c, CHILD(n, 1)), n.lineno, n.col_offset);
  10257. }
  10258. case SYM.comparison:
  10259. if (NCH(n) === 1)
  10260. {
  10261. n = CHILD(n, 0);
  10262. continue LOOP;
  10263. }
  10264. else
  10265. {
  10266. var ops = [];
  10267. var cmps = [];
  10268. for (var i = 1; i < NCH(n); i += 2)
  10269. {
  10270. ops[(i - 1) / 2] = astForCompOp(c, CHILD(n, i));
  10271. cmps[(i - 1) / 2] = astForExpr(c, CHILD(n, i + 1));
  10272. }
  10273. return new Compare(astForExpr(c, CHILD(n, 0)), ops, cmps, n.lineno, n.col_offset);
  10274. }
  10275. case SYM.expr:
  10276. case SYM.xor_expr:
  10277. case SYM.and_expr:
  10278. case SYM.shift_expr:
  10279. case SYM.arith_expr:
  10280. case SYM.term:
  10281. if (NCH(n) === 1)
  10282. {
  10283. n = CHILD(n, 0);
  10284. continue LOOP;
  10285. }
  10286. return astForBinop(c, n);
  10287. case SYM.yield_expr:
  10288. var exp = null;
  10289. if (NCH(n) === 2)
  10290. {
  10291. exp = astForTestlist(c, CHILD(n, 1))
  10292. }
  10293. return new Yield(exp, n.lineno, n.col_offset);
  10294. case SYM.factor:
  10295. if (NCH(n) === 1)
  10296. {
  10297. n = CHILD(n, 0);
  10298. continue LOOP;
  10299. }
  10300. return astForFactor(c, n);
  10301. case SYM.power:
  10302. return astForPower(c, n);
  10303. default:
  10304. goog.asserts.fail("unhandled expr", "n.type: %d", n.type);
  10305. }
  10306. break; }
  10307. }
  10308. function astForPrintStmt(c, n)
  10309. {
  10310. /* print_stmt: 'print' ( [ test (',' test)* [','] ]
  10311. | '>>' test [ (',' test)+ [','] ] )
  10312. */
  10313. var start = 1;
  10314. var dest = null;
  10315. REQ(n, SYM.print_stmt);
  10316. if (NCH(n) >= 2 && CHILD(n, 1).type === TOK.T_RIGHTSHIFT)
  10317. {
  10318. dest = astForExpr(c, CHILD(n, 2));
  10319. start = 4;
  10320. }
  10321. var seq = [];
  10322. for (var i = start, j = 0; i < NCH(n); i += 2, ++j)
  10323. {
  10324. seq[j] = astForExpr(c, CHILD(n, i));
  10325. }
  10326. var nl = (CHILD(n, NCH(n) - 1)).type === TOK.T_COMMA ? false : true;
  10327. return new Print(dest, seq, nl, n.lineno, n.col_offset);
  10328. }
  10329. function astForStmt(c, n)
  10330. {
  10331. if (n.type === SYM.stmt)
  10332. {
  10333. goog.asserts.assert(NCH(n) === 1);
  10334. n = CHILD(n, 0);
  10335. }
  10336. if (n.type === SYM.simple_stmt)
  10337. {
  10338. goog.asserts.assert(numStmts(n) === 1);
  10339. n = CHILD(n, 0);
  10340. }
  10341. if (n.type === SYM.small_stmt)
  10342. {
  10343. REQ(n, SYM.small_stmt);
  10344. n = CHILD(n, 0);
  10345. /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
  10346. | flow_stmt | import_stmt | global_stmt | exec_stmt
  10347. | assert_stmt
  10348. */
  10349. switch (n.type)
  10350. {
  10351. case SYM.expr_stmt: return astForExprStmt(c, n);
  10352. case SYM.print_stmt: return astForPrintStmt(c, n);
  10353. case SYM.del_stmt: return astForDelStmt(c, n);
  10354. case SYM.pass_stmt: return new Pass(n.lineno, n.col_offset);
  10355. case SYM.flow_stmt: return astForFlowStmt(c, n);
  10356. case SYM.import_stmt: return astForImportStmt(c, n);
  10357. case SYM.global_stmt: return astForGlobalStmt(c, n);
  10358. case SYM.exec_stmt: return astForExecStmt(c, n);
  10359. case SYM.assert_stmt: return astForAssertStmt(c, n);
  10360. default: goog.asserts.fail("unhandled small_stmt");
  10361. }
  10362. }
  10363. else
  10364. {
  10365. /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
  10366. | funcdef | classdef | decorated
  10367. */
  10368. var ch = CHILD(n, 0);
  10369. REQ(n, SYM.compound_stmt);
  10370. switch (ch.type)
  10371. {
  10372. case SYM.if_stmt: return astForIfStmt(c, ch);
  10373. case SYM.while_stmt: return astForWhileStmt(c, ch);
  10374. case SYM.for_stmt: return astForForStmt(c, ch);
  10375. case SYM.try_stmt: return astForTryStmt(c, ch);
  10376. case SYM.with_stmt: return astForWithStmt(c, ch);
  10377. case SYM.funcdef: return astForFuncdef(c, ch, []);
  10378. case SYM.classdef: return astForClassdef(c, ch, []);
  10379. case SYM.decorated: return astForDecorated(c, ch);
  10380. default: goog.asserts.assert("unhandled compound_stmt");
  10381. }
  10382. }
  10383. }
  10384. Sk.astFromParse = function(n, filename)
  10385. {
  10386. var c = new Compiling("utf-8", filename);
  10387. var stmts = [];
  10388. var ch;
  10389. var k = 0;
  10390. switch (n.type)
  10391. {
  10392. case SYM.file_input:
  10393. for (var i = 0; i < NCH(n) - 1; ++i)
  10394. {
  10395. var ch = CHILD(n, i);
  10396. if (n.type === TOK.T_NEWLINE)
  10397. continue;
  10398. REQ(ch, SYM.stmt);
  10399. var num = numStmts(ch);
  10400. if (num === 1)
  10401. {
  10402. stmts[k++] = astForStmt(c, ch);
  10403. }
  10404. else
  10405. {
  10406. ch = CHILD(ch, 0);
  10407. REQ(ch, SYM.simple_stmt);
  10408. for (var j = 0; j < num; ++j)
  10409. {
  10410. stmts[k++] = astForStmt(c, CHILD(ch, j * 2));
  10411. }
  10412. }
  10413. }
  10414. return new Module(stmts);
  10415. case SYM.eval_input:
  10416. goog.asserts.fail("todo;");
  10417. case SYM.single_input:
  10418. goog.asserts.fail("todo;");
  10419. default:
  10420. goog.asserts.fail("todo;");
  10421. }
  10422. };
  10423. Sk.astDump = function(node)
  10424. {
  10425. var spaces = function(n) // todo; blurgh
  10426. {
  10427. var ret = "";
  10428. for (var i = 0; i < n; ++i)
  10429. ret += " ";
  10430. return ret;
  10431. }
  10432. var _format = function(node, indent)
  10433. {
  10434. if (node === null)
  10435. {
  10436. return indent+"None";
  10437. }
  10438. else if (node.constructor._astname !== undefined)
  10439. {
  10440. var nctor = node.constructor;
  10441. var namelen = spaces(nctor._astname.length + 1);
  10442. var fields = [];
  10443. for (var i = 0; i < nctor._fields.length; i += 2) // iter_fields
  10444. {
  10445. var a = nctor._fields[i]; // field name
  10446. var b = nctor._fields[i + 1](node); // field getter func
  10447. var fieldlen = spaces(a.length + 1);
  10448. fields.push([a, _format(b, indent + namelen + fieldlen)]);
  10449. }
  10450. var attrs = [];
  10451. for (var i = 0; i < fields.length; ++i)
  10452. {
  10453. var field = fields[i];
  10454. attrs.push(field[0] + "=" + field[1].replace(/^\s+/, ''));
  10455. }
  10456. var fieldstr = attrs.join(',\n' + indent + namelen);
  10457. return indent + nctor._astname + "(" + fieldstr + ")";
  10458. }
  10459. else if (node._astname !== undefined) // an 'enumeration' node
  10460. {
  10461. return indent + node._astname + "()";
  10462. }
  10463. else if (goog.isArrayLike(node))
  10464. {
  10465. var elems = [];
  10466. for (var i = 0; i < node.length; ++i)
  10467. {
  10468. var x = node[i];
  10469. elems.push(_format(x, indent + " "));
  10470. }
  10471. var elemsstr = elems.join(',\n');
  10472. return indent + "[" + elemsstr.replace(/^\s+/, '') + "]";
  10473. }
  10474. else
  10475. {
  10476. var ret;
  10477. if (node === true) ret = "True";
  10478. else if (node === false) ret = "False";
  10479. else if (node instanceof Sk.builtin.lng) ret = node.tp$str().v;
  10480. else if (node instanceof Sk.builtin.str) ret = node.tp$repr().v;
  10481. else ret = "" + node;
  10482. return indent + ret;
  10483. }
  10484. };
  10485. return _format(node, "");
  10486. };
  10487. goog.exportSymbol("Sk.astFromParse", Sk.astFromParse);
  10488. goog.exportSymbol("Sk.astDump", Sk.astDump);
  10489. /* Flags for def-use information */
  10490. var DEF_GLOBAL = 1; /* global stmt */
  10491. var DEF_LOCAL = 2; /* assignment in code block */
  10492. var DEF_PARAM = 2<<1; /* formal parameter */
  10493. var USE = 2<<2; /* name is used */
  10494. var DEF_STAR = 2<<3; /* parameter is star arg */
  10495. var DEF_DOUBLESTAR = 2<<4; /* parameter is star-star arg */
  10496. var DEF_INTUPLE = 2<<5; /* name defined in tuple in parameters */
  10497. var DEF_FREE = 2<<6; /* name used but not defined in nested block */
  10498. var DEF_FREE_GLOBAL = 2<<7; /* free variable is actually implicit global */
  10499. var DEF_FREE_CLASS = 2<<8; /* free variable from class's method */
  10500. var DEF_IMPORT = 2<<9; /* assignment occurred via import */
  10501. var DEF_BOUND = (DEF_LOCAL | DEF_PARAM | DEF_IMPORT);
  10502. /* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol
  10503. table. GLOBAL is returned from PyST_GetScope() for either of them.
  10504. It is stored in ste_symbols at bits 12-14.
  10505. */
  10506. var SCOPE_OFF = 11;
  10507. var SCOPE_MASK = 7;
  10508. var LOCAL = 1;
  10509. var GLOBAL_EXPLICIT = 2;
  10510. var GLOBAL_IMPLICIT = 3;
  10511. var FREE = 4;
  10512. var CELL = 5;
  10513. /* The following three names are used for the ste_unoptimized bit field */
  10514. var OPT_IMPORT_STAR = 1;
  10515. var OPT_EXEC = 2;
  10516. var OPT_BARE_EXEC = 4;
  10517. var OPT_TOPLEVEL = 8; /* top-level names, including eval and exec */
  10518. var GENERATOR = 2;
  10519. var GENERATOR_EXPRESSION = 2;
  10520. var ModuleBlock = 'module';
  10521. var FunctionBlock = 'function';
  10522. var ClassBlock = 'class';
  10523. /**
  10524. * @constructor
  10525. * @param {string} name
  10526. * @param {number} flags
  10527. * @param {Array.<SymbolTableScope>} namespaces
  10528. */
  10529. function Symbol(name, flags, namespaces)
  10530. {
  10531. this.__name = name;
  10532. this.__flags = flags;
  10533. this.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK;
  10534. this.__namespaces = namespaces || [];
  10535. };
  10536. Symbol.prototype.get_name = function() { return this.__name; }
  10537. Symbol.prototype.is_referenced = function() { return !!(this.__flags & USE); }
  10538. Symbol.prototype.is_parameter = function() { return !!(this.__flags & DEF_PARAM); }
  10539. Symbol.prototype.is_global = function() { return this.__scope === GLOBAL_IMPLICIT || this.__scope == GLOBAL_EXPLICIT; }
  10540. Symbol.prototype.is_declared_global = function() { return this.__scope == GLOBAL_EXPLICIT; }
  10541. Symbol.prototype.is_local = function() { return !!(this.__flags & DEF_BOUND); }
  10542. Symbol.prototype.is_free = function() { return this.__scope == FREE; }
  10543. Symbol.prototype.is_imported = function() { return !!(this.__flags & DEF_IMPORT); }
  10544. Symbol.prototype.is_assigned = function() { return !!(this.__flags & DEF_LOCAL); }
  10545. Symbol.prototype.is_namespace = function() { return this.__namespaces && this.__namespaces.length > 0; }
  10546. Symbol.prototype.get_namespaces = function() { return this.__namespaces; }
  10547. var astScopeCounter = 0;
  10548. /**
  10549. * @constructor
  10550. * @param {SymbolTable} table
  10551. * @param {string} name
  10552. * @param {string} type
  10553. * @param {number} lineno
  10554. */
  10555. function SymbolTableScope(table, name, type, ast, lineno)
  10556. {
  10557. this.symFlags = {};
  10558. this.name = name;
  10559. this.varnames = [];
  10560. this.children = [];
  10561. this.blockType = type;
  10562. this.isNested = false;
  10563. this.hasFree = false;
  10564. this.childHasFree = false; // true if child block has free vars including free refs to globals
  10565. this.generator = false;
  10566. this.varargs = false;
  10567. this.varkeywords = false;
  10568. this.returnsValue = false;
  10569. this.lineno = lineno;
  10570. this.table = table;
  10571. if (table.cur && (table.cur.nested || table.cur.blockType === FunctionBlock))
  10572. this.isNested = true;
  10573. ast.scopeId = astScopeCounter++;
  10574. table.stss[ast.scopeId] = this;
  10575. // cache of Symbols for returning to other parts of code
  10576. this.symbols = {};
  10577. }
  10578. SymbolTableScope.prototype.get_type = function() { return this.blockType; };
  10579. SymbolTableScope.prototype.get_name = function() { return this.name; };
  10580. SymbolTableScope.prototype.get_lineno = function() { return this.lineno; };
  10581. SymbolTableScope.prototype.is_nested = function() { return this.isNested; };
  10582. SymbolTableScope.prototype.has_children = function() { return this.children.length > 0; };
  10583. SymbolTableScope.prototype.get_identifiers = function() { return this._identsMatching(function(x) { return true; }); };
  10584. SymbolTableScope.prototype.lookup = function(name)
  10585. {
  10586. var sym;
  10587. if (!this.symbols.hasOwnProperty(name))
  10588. {
  10589. var flags = this.symFlags[name];
  10590. var namespaces = this.__check_children(name);
  10591. sym = this.symbols[name] = new Symbol(name, flags, namespaces);
  10592. }
  10593. else
  10594. {
  10595. sym = this.symbols[name];
  10596. }
  10597. return sym;
  10598. };
  10599. SymbolTableScope.prototype.__check_children = function(name)
  10600. {
  10601. //print(" check_children:", name);
  10602. var ret = [];
  10603. for (var i = 0; i < this.children.length; ++i)
  10604. {
  10605. var child = this.children[i];
  10606. if (child.name === name)
  10607. ret.push(child);
  10608. }
  10609. return ret;
  10610. };
  10611. SymbolTableScope.prototype._identsMatching = function(f)
  10612. {
  10613. var ret = [];
  10614. for (var k in this.symFlags)
  10615. {
  10616. if (this.symFlags.hasOwnProperty(k))
  10617. {
  10618. if (f(this.symFlags[k]))
  10619. ret.push(k);
  10620. }
  10621. }
  10622. ret.sort();
  10623. return ret;
  10624. };
  10625. SymbolTableScope.prototype.get_parameters = function()
  10626. {
  10627. goog.asserts.assert(this.get_type() == 'function', "get_parameters only valid for function scopes");
  10628. if (!this._funcParams)
  10629. this._funcParams = this._identsMatching(function(x) { return x & DEF_PARAM; });
  10630. return this._funcParams;
  10631. };
  10632. SymbolTableScope.prototype.get_locals = function()
  10633. {
  10634. goog.asserts.assert(this.get_type() == 'function', "get_locals only valid for function scopes");
  10635. if (!this._funcLocals)
  10636. this._funcLocals = this._identsMatching(function(x) { return x & DEF_BOUND; });
  10637. return this._funcLocals;
  10638. };
  10639. SymbolTableScope.prototype.get_globals = function()
  10640. {
  10641. goog.asserts.assert(this.get_type() == 'function', "get_globals only valid for function scopes");
  10642. if (!this._funcGlobals)
  10643. {
  10644. this._funcGlobals = this._identsMatching(function(x) {
  10645. var masked = (x >> SCOPE_OFF) & SCOPE_MASK;
  10646. return masked == GLOBAL_IMPLICIT || masked == GLOBAL_EXPLICIT;
  10647. });
  10648. }
  10649. return this._funcGlobals;
  10650. };
  10651. SymbolTableScope.prototype.get_frees = function()
  10652. {
  10653. goog.asserts.assert(this.get_type() == 'function', "get_frees only valid for function scopes");
  10654. if (!this._funcFrees)
  10655. {
  10656. this._funcFrees = this._identsMatching(function(x) {
  10657. var masked = (x >> SCOPE_OFF) & SCOPE_MASK;
  10658. return masked == FREE;
  10659. });
  10660. }
  10661. return this._funcFrees;
  10662. };
  10663. SymbolTableScope.prototype.get_methods = function()
  10664. {
  10665. goog.asserts.assert(this.get_type() == 'class', "get_methods only valid for class scopes");
  10666. if (!this._classMethods)
  10667. {
  10668. // todo; uniq?
  10669. var all = [];
  10670. for (var i = 0; i < this.children.length; ++i)
  10671. all.push(this.children[i].name);
  10672. all.sort();
  10673. this._classMethods = all;
  10674. }
  10675. return this._classMethods;
  10676. };
  10677. SymbolTableScope.prototype.getScope = function(name)
  10678. {
  10679. //print("getScope");
  10680. //for (var k in this.symFlags) print(k);
  10681. var v = this.symFlags[name];
  10682. if (v === undefined) return 0;
  10683. return (v >> SCOPE_OFF) & SCOPE_MASK;
  10684. };
  10685. /**
  10686. * @constructor
  10687. * @param {string} filename
  10688. */
  10689. function SymbolTable(filename)
  10690. {
  10691. this.filename = filename;
  10692. this.cur = null;
  10693. this.top = null;
  10694. this.stack = [];
  10695. this.global = null; // points at top level module symFlags
  10696. this.curClass = null; // current class or null
  10697. this.tmpname = 0;
  10698. // mapping from ast nodes to their scope if they have one. we add an
  10699. // id to the ast node when a scope is created for it, and store it in
  10700. // here for the compiler to lookup later.
  10701. this.stss = {};
  10702. }
  10703. SymbolTable.prototype.getStsForAst = function(ast)
  10704. {
  10705. goog.asserts.assert(ast.scopeId !== undefined, "ast wasn't added to st?");
  10706. var v = this.stss[ast.scopeId];
  10707. goog.asserts.assert(v !== undefined, "unknown sym tab entry");
  10708. return v;
  10709. };
  10710. SymbolTable.prototype.SEQStmt = function(nodes)
  10711. {
  10712. goog.asserts.assert(goog.isArrayLike(nodes), "SEQ: nodes isn't array? got %s", nodes);
  10713. var len = nodes.length;
  10714. for (var i = 0; i < len; ++i)
  10715. {
  10716. var val = nodes[i];
  10717. if (val) this.visitStmt(val);
  10718. }
  10719. };
  10720. SymbolTable.prototype.SEQExpr = function(nodes)
  10721. {
  10722. goog.asserts.assert(goog.isArrayLike(nodes), "SEQ: nodes isn't array? got %s", nodes);
  10723. var len = nodes.length;
  10724. for (var i = 0; i < len; ++i)
  10725. {
  10726. var val = nodes[i];
  10727. if (val) this.visitExpr(val);
  10728. }
  10729. };
  10730. SymbolTable.prototype.enterBlock = function(name, blockType, ast, lineno)
  10731. {
  10732. //print("enterBlock:", name);
  10733. var prev = null;
  10734. if (this.cur)
  10735. {
  10736. prev = this.cur;
  10737. this.stack.push(this.cur);
  10738. }
  10739. this.cur = new SymbolTableScope(this, name, blockType, ast, lineno);
  10740. if (name === 'top')
  10741. {
  10742. //print(" setting global because it's top");
  10743. this.global = this.cur.symFlags;
  10744. }
  10745. if (prev)
  10746. {
  10747. //print(" adding", this.cur.name, "to", prev.name);
  10748. prev.children.push(this.cur);
  10749. }
  10750. };
  10751. SymbolTable.prototype.exitBlock = function()
  10752. {
  10753. //print("exitBlock");
  10754. this.cur = null;
  10755. if (this.stack.length > 0)
  10756. this.cur = this.stack.pop();
  10757. };
  10758. SymbolTable.prototype.visitParams = function(args, toplevel)
  10759. {
  10760. for (var i = 0; i < args.length; ++i)
  10761. {
  10762. var arg = args[i];
  10763. if (arg.constructor === Name)
  10764. {
  10765. goog.asserts.assert(arg.ctx === Param || (arg.ctx === Store && !toplevel));
  10766. this.addDef(arg.id, DEF_PARAM);
  10767. }
  10768. else
  10769. {
  10770. // Tuple isn't supported
  10771. throw new SyntaxError("invalid expression in parameter list");
  10772. }
  10773. }
  10774. }
  10775. SymbolTable.prototype.visitArguments = function(a)
  10776. {
  10777. if (a.args) this.visitParams(a.args, true);
  10778. if (a.vararg)
  10779. {
  10780. this.addDef(a.vararg, DEF_PARAM);
  10781. this.cur.varargs = true;
  10782. }
  10783. if (a.kwarg)
  10784. {
  10785. this.addDef(a.kwarg, DEF_PARAM);
  10786. this.cur.varkeywords = true;
  10787. }
  10788. };
  10789. SymbolTable.prototype.newTmpname = function()
  10790. {
  10791. this.addDef(new Sk.builtin.str("_[" + (++this.tmpname) + "]"), DEF_LOCAL);
  10792. }
  10793. SymbolTable.prototype.addDef = function(name, flag)
  10794. {
  10795. var mangled = mangleName(this.curClass, name).v;
  10796. var val = this.cur.symFlags[mangled];
  10797. if (val !== undefined)
  10798. {
  10799. if ((flag & DEF_PARAM) && (val & DEF_PARAM))
  10800. {
  10801. throw new Sk.builtin.SyntaxError("duplicate argument '" + name + "' in function definition");
  10802. }
  10803. val |= flag;
  10804. }
  10805. else
  10806. {
  10807. val = flag;
  10808. }
  10809. this.cur.symFlags[mangled] = val;
  10810. if (flag & DEF_PARAM)
  10811. {
  10812. this.cur.varnames.push(mangled);
  10813. }
  10814. else if (flag & DEF_GLOBAL)
  10815. {
  10816. val = flag;
  10817. var fromGlobal = this.global[mangled];
  10818. if (fromGlobal !== undefined) val |= fromGlobal;
  10819. this.global[mangled] = val;
  10820. }
  10821. };
  10822. SymbolTable.prototype.visitSlice = function(s)
  10823. {
  10824. switch (s.constructor)
  10825. {
  10826. case Slice:
  10827. if (s.lower) this.visitExpr(s.lower);
  10828. if (s.upper) this.visitExpr(s.upper);
  10829. if (s.step) this.visitExpr(s.step);
  10830. break;
  10831. case ExtSlice:
  10832. for (var i = 0; i < s.dims.length; ++i)
  10833. this.visitSlice(s.dims[i]);
  10834. break;
  10835. case Index:
  10836. this.visitExpr(s.value);
  10837. break;
  10838. case Ellipsis:
  10839. break;
  10840. }
  10841. };
  10842. SymbolTable.prototype.visitStmt = function(s)
  10843. {
  10844. goog.asserts.assert(s !== undefined, "visitStmt called with undefined");
  10845. switch (s.constructor)
  10846. {
  10847. case FunctionDef:
  10848. this.addDef(s.name, DEF_LOCAL);
  10849. if (s.args.defaults) this.SEQExpr(s.args.defaults);
  10850. if (s.decorator_list) this.SEQExpr(s.decorator_list);
  10851. this.enterBlock(s.name.v, FunctionBlock, s, s.lineno);
  10852. this.visitArguments(s.args);
  10853. this.SEQStmt(s.body);
  10854. this.exitBlock();
  10855. break;
  10856. case ClassDef:
  10857. this.addDef(s.name, DEF_LOCAL);
  10858. this.SEQExpr(s.bases);
  10859. if (s.decorator_list) this.SEQExpr(s.decorator_list);
  10860. this.enterBlock(s.name.v, ClassBlock, s, s.lineno);
  10861. var tmp = this.curClass;
  10862. this.curClass = s.name;
  10863. this.SEQStmt(s.body);
  10864. this.curCalss = tmp;
  10865. this.exitBlock();
  10866. break;
  10867. case Return_:
  10868. if (s.value)
  10869. {
  10870. this.visitExpr(s.value);
  10871. this.cur.returnsValue = true;
  10872. if (this.cur.generator)
  10873. throw new SyntaxError("'return' with argument inside generator");
  10874. }
  10875. break;
  10876. case Delete_:
  10877. this.SEQExpr(s.targets);
  10878. break;
  10879. case Assign:
  10880. this.SEQExpr(s.targets);
  10881. this.visitExpr(s.value);
  10882. break;
  10883. case AugAssign:
  10884. this.visitExpr(s.target);
  10885. this.visitExpr(s.value);
  10886. break;
  10887. case Print:
  10888. if (s.dest) this.visitExpr(s.dest);
  10889. this.SEQExpr(s.values);
  10890. break;
  10891. case For_:
  10892. this.visitExpr(s.target);
  10893. this.visitExpr(s.iter);
  10894. this.SEQStmt(s.body);
  10895. if (s.orelse) this.SEQStmt(s.orelse);
  10896. break;
  10897. case While_:
  10898. this.visitExpr(s.test);
  10899. this.SEQStmt(s.body);
  10900. if (s.orelse) this.SEQStmt(s.orelse);
  10901. break;
  10902. case If_:
  10903. this.visitExpr(s.test);
  10904. this.SEQStmt(s.body);
  10905. if (s.orelse)
  10906. this.SEQStmt(s.orelse);
  10907. break;
  10908. case Raise:
  10909. if (s.type)
  10910. {
  10911. this.visitExpr(s.type);
  10912. if (s.inst)
  10913. {
  10914. this.visitExpr(s.inst);
  10915. if (s.tback)
  10916. this.visitExpr(s.tback);
  10917. }
  10918. }
  10919. break;
  10920. case TryExcept:
  10921. this.SEQStmt(s.body);
  10922. this.SEQStmt(s.orelse);
  10923. this.visitExcepthandler(s.handlers);
  10924. break;
  10925. case TryFinally:
  10926. this.SEQStmt(s.body);
  10927. this.SEQStmt(s.finalbody);
  10928. break;
  10929. case Assert:
  10930. this.visitExpr(s.test);
  10931. if (s.msg) this.visitExpr(s.msg);
  10932. break;
  10933. case Import_:
  10934. case ImportFrom:
  10935. this.visitAlias(s.names);
  10936. break;
  10937. case Exec:
  10938. this.visitExpr(s.body);
  10939. if (s.globals)
  10940. {
  10941. this.visitExpr(s.globals);
  10942. if (s.locals)
  10943. this.visitExpr(s.locals);
  10944. }
  10945. break;
  10946. case Global:
  10947. var nameslen = s.names.length;
  10948. for (var i = 0; i < nameslen; ++i)
  10949. {
  10950. var name = mangleName(this.curClass, s.names[i]).v;
  10951. var cur = this.cur.symFlags[name];
  10952. if (cur & (DEF_LOCAL | USE))
  10953. {
  10954. if (cur & DEF_LOCAL)
  10955. throw new SyntaxError("name '" + name + "' is assigned to before global declaration");
  10956. else
  10957. throw new SyntaxError("name '" + name + "' is used prior to global declaration");
  10958. }
  10959. this.addDef(new Sk.builtin.str(name), DEF_GLOBAL);
  10960. }
  10961. break;
  10962. case Expr:
  10963. this.visitExpr(s.value);
  10964. break;
  10965. case Pass:
  10966. case Break_:
  10967. case Continue_:
  10968. // nothing
  10969. break;
  10970. case With_:
  10971. this.newTmpname();
  10972. this.visitExpr(s.context_expr);
  10973. if (s.optional_vars)
  10974. {
  10975. this.newTmpname();
  10976. this.visitExpr(s.optional_vars);
  10977. }
  10978. this.SEQStmt(s.body);
  10979. break;
  10980. default:
  10981. goog.asserts.fail("Unhandled type " + s.constructor.name + " in visitStmt");
  10982. }
  10983. };
  10984. SymbolTable.prototype.visitExpr = function(e)
  10985. {
  10986. goog.asserts.assert(e !== undefined, "visitExpr called with undefined");
  10987. //print(" e: ", e.constructor.name);
  10988. switch (e.constructor)
  10989. {
  10990. case BoolOp:
  10991. this.SEQExpr(e.values);
  10992. break;
  10993. case BinOp:
  10994. this.visitExpr(e.left);
  10995. this.visitExpr(e.right);
  10996. break;
  10997. case UnaryOp:
  10998. this.visitExpr(e.operand);
  10999. break;
  11000. case Lambda:
  11001. this.addDef(new Sk.builtin.str("lambda"), DEF_LOCAL);
  11002. if (e.args.defaults)
  11003. this.SEQExpr(e.args.defaults);
  11004. this.enterBlock("lambda", FunctionBlock, e, e.lineno);
  11005. this.visitArguments(e.args);
  11006. this.visitExpr(e.body);
  11007. this.exitBlock();
  11008. break;
  11009. case IfExp:
  11010. this.visitExpr(e.test);
  11011. this.visitExpr(e.body);
  11012. this.visitExpr(e.orelse);
  11013. break;
  11014. case Dict:
  11015. this.SEQExpr(e.keys);
  11016. this.SEQExpr(e.values);
  11017. break;
  11018. case ListComp:
  11019. this.newTmpname();
  11020. this.visitExpr(e.elt);
  11021. this.visitComprehension(e.generators, 0);
  11022. break;
  11023. case GeneratorExp:
  11024. this.visitGenexp(e);
  11025. break;
  11026. case Yield:
  11027. if (e.value) this.visitExpr(e.value);
  11028. this.cur.generator = true;
  11029. if (this.cur.returnsValue)
  11030. throw new SyntaxError("'return' with argument inside generator");
  11031. break;
  11032. case Compare:
  11033. this.visitExpr(e.left);
  11034. this.SEQExpr(e.comparators);
  11035. break;
  11036. case Call:
  11037. this.visitExpr(e.func);
  11038. this.SEQExpr(e.args);
  11039. for (var i = 0; i < e.keywords.length; ++i)
  11040. this.visitExpr(e.keywords[i].value);
  11041. if (this.starargs) this.visitExpr(e.starargs);
  11042. if (this.kwargs) this.visitExpr(e.kwargs);
  11043. break;
  11044. case Num:
  11045. case Str:
  11046. break;
  11047. case Attribute:
  11048. this.visitExpr(e.value);
  11049. break;
  11050. case Subscript:
  11051. this.visitExpr(e.value);
  11052. this.visitSlice(e.slice);
  11053. break;
  11054. case Name:
  11055. this.addDef(e.id, e.ctx === Load ? USE : DEF_LOCAL);
  11056. break;
  11057. case List:
  11058. case Tuple:
  11059. this.SEQExpr(e.elts);
  11060. break;
  11061. default:
  11062. goog.asserts.fail("Unhandled type " + e.constructor.name + " in visitExpr");
  11063. }
  11064. };
  11065. SymbolTable.prototype.visitComprehension = function(lcs, startAt)
  11066. {
  11067. var len = lcs.length;
  11068. for (var i = startAt; i < len; ++i)
  11069. {
  11070. var lc = lcs[i];
  11071. this.visitExpr(lc.target);
  11072. this.visitExpr(lc.iter);
  11073. this.SEQExpr(lc.ifs);
  11074. }
  11075. };
  11076. SymbolTable.prototype.visitAlias = function(names)
  11077. {
  11078. /* Compute store_name, the name actually bound by the import
  11079. operation. It is diferent than a->name when a->name is a
  11080. dotted package name (e.g. spam.eggs)
  11081. */
  11082. for (var i = 0; i < names.length; ++i)
  11083. {
  11084. var a = names[i];
  11085. var name = a.asname === null ? a.name.v : a.asname.v;
  11086. var storename = name;
  11087. var dot = name.indexOf('.');
  11088. if (dot !== -1)
  11089. storename = name.substr(0, dot);
  11090. if (name !== "*")
  11091. this.addDef(new Sk.builtin.str(storename), DEF_IMPORT);
  11092. else
  11093. {
  11094. if (this.cur.blockType !== ModuleBlock)
  11095. throw new SyntaxError("import * only allowed at module level");
  11096. }
  11097. }
  11098. };
  11099. SymbolTable.prototype.visitGenexp = function(e)
  11100. {
  11101. var outermost = e.generators[0];
  11102. // outermost is evaled in current scope
  11103. this.visitExpr(outermost.iter);
  11104. this.enterBlock("genexpr", FunctionBlock, e, e.lineno);
  11105. this.cur.generator = true;
  11106. this.addDef(new Sk.builtin.str(".0"), DEF_PARAM);
  11107. this.visitExpr(outermost.target);
  11108. this.SEQExpr(outermost.ifs);
  11109. this.visitComprehension(e.generators, 1);
  11110. this.visitExpr(e.elt);
  11111. this.exitBlock();
  11112. };
  11113. SymbolTable.prototype.visitExcepthandler = function(handlers)
  11114. {
  11115. goog.asserts.fail("todo;");
  11116. };
  11117. function _dictUpdate(a, b)
  11118. {
  11119. for (var kb in b)
  11120. {
  11121. a[kb] = b[kb];
  11122. }
  11123. }
  11124. SymbolTable.prototype.analyzeBlock = function(ste, bound, free, global)
  11125. {
  11126. var local = {};
  11127. var scope = {};
  11128. var newglobal = {};
  11129. var newbound = {};
  11130. var newfree = {};
  11131. if (ste.blockType == ClassBlock)
  11132. {
  11133. _dictUpdate(newglobal, global);
  11134. if (bound)
  11135. _dictUpdate(newbound, bound);
  11136. }
  11137. for (var name in ste.symFlags)
  11138. {
  11139. var flags = ste.symFlags[name];
  11140. this.analyzeName(ste, scope, name, flags, bound, local, free, global);
  11141. }
  11142. if (ste.blockType !== ClassBlock)
  11143. {
  11144. if (ste.blockType === FunctionBlock)
  11145. _dictUpdate(newbound, local);
  11146. if (bound)
  11147. _dictUpdate(newbound, bound);
  11148. _dictUpdate(newglobal, global);
  11149. }
  11150. var allfree = {};
  11151. var childlen = ste.children.length;
  11152. for (var i = 0; i < childlen; ++i)
  11153. {
  11154. var c = ste.children[i];
  11155. this.analyzeChildBlock(c, newbound, newfree, newglobal, allfree);
  11156. if (c.hasFree || c.childHasFree)
  11157. ste.childHasFree = true;
  11158. }
  11159. _dictUpdate(newfree, allfree);
  11160. if (ste.blockType === FunctionBlock) this.analyzeCells(scope, newfree);
  11161. this.updateSymbols(ste.symFlags, scope, bound, newfree, ste.blockType === ClassBlock);
  11162. _dictUpdate(free, newfree);
  11163. };
  11164. SymbolTable.prototype.analyzeChildBlock = function(entry, bound, free, global, childFree)
  11165. {
  11166. var tempBound = {};
  11167. _dictUpdate(tempBound, bound);
  11168. var tempFree = {};
  11169. _dictUpdate(tempFree, free);
  11170. var tempGlobal = {};
  11171. _dictUpdate(tempGlobal, global);
  11172. this.analyzeBlock(entry, tempBound, tempFree, tempGlobal);
  11173. _dictUpdate(childFree, tempFree);
  11174. };
  11175. SymbolTable.prototype.analyzeCells = function(scope, free)
  11176. {
  11177. for (var name in scope)
  11178. {
  11179. var flags = scope[name];
  11180. if (flags !== LOCAL) continue;
  11181. if (free[name] === undefined) continue;
  11182. scope[name] = CELL;
  11183. delete free[name];
  11184. }
  11185. };
  11186. /**
  11187. * store scope info back into the st symbols dict. symbols is modified,
  11188. * others are not.
  11189. */
  11190. SymbolTable.prototype.updateSymbols = function(symbols, scope, bound, free, classflag)
  11191. {
  11192. for (var name in symbols)
  11193. {
  11194. var flags = symbols[name];
  11195. var w = scope[name];
  11196. flags |= w << SCOPE_OFF;
  11197. symbols[name] = flags;
  11198. }
  11199. var freeValue = FREE << SCOPE_OFF;
  11200. var pos = 0;
  11201. for (var name in free)
  11202. {
  11203. var o = symbols[name];
  11204. if (o !== undefined)
  11205. {
  11206. // it could be a free variable in a method of the class that has
  11207. // the same name as a local or global in the class scope
  11208. if (classflag && (o & (DEF_BOUND | DEF_GLOBAL)))
  11209. {
  11210. var i = o | DEF_FREE_CLASS;
  11211. symbols[name] = i;
  11212. }
  11213. // else it's not free, probably a cell
  11214. continue;
  11215. }
  11216. if (bound[name] === undefined) continue;
  11217. symbols[name] = freeValue;
  11218. }
  11219. };
  11220. SymbolTable.prototype.analyzeName = function(ste, dict, name, flags, bound, local, free, global)
  11221. {
  11222. if (flags & DEF_GLOBAL)
  11223. {
  11224. if (flags & DEF_PARAM) throw new Sk.builtin.SyntaxError("name '" + name + "' is local and global");
  11225. dict[name] = GLOBAL_EXPLICIT;
  11226. global[name] = null;
  11227. if (bound && bound[name] !== undefined) delete bound[name];
  11228. return;
  11229. }
  11230. if (flags & DEF_BOUND)
  11231. {
  11232. dict[name] = LOCAL;
  11233. local[name] = null;
  11234. delete global[name];
  11235. return;
  11236. }
  11237. if (bound && bound[name] !== undefined)
  11238. {
  11239. dict[name] = FREE;
  11240. ste.hasFree = true;
  11241. free[name] = null;
  11242. }
  11243. else if (global && global[name] !== undefined)
  11244. {
  11245. dict[name] = GLOBAL_IMPLICIT;
  11246. }
  11247. else
  11248. {
  11249. if (ste.isNested)
  11250. ste.hasFree = true;
  11251. dict[name] = GLOBAL_IMPLICIT;
  11252. }
  11253. };
  11254. SymbolTable.prototype.analyze = function()
  11255. {
  11256. var free = {};
  11257. var global = {};
  11258. this.analyzeBlock(this.top, null, free, global);
  11259. };
  11260. /**
  11261. * @param {Object} ast
  11262. * @param {string} filename
  11263. */
  11264. Sk.symboltable = function(ast, filename)
  11265. {
  11266. var ret = new SymbolTable(filename);
  11267. ret.enterBlock("top", ModuleBlock, ast, 0);
  11268. ret.top = ret.cur;
  11269. //print(Sk.astDump(ast));
  11270. for (var i = 0; i < ast.body.length; ++i)
  11271. ret.visitStmt(ast.body[i]);
  11272. ret.exitBlock();
  11273. ret.analyze();
  11274. return ret;
  11275. };
  11276. Sk.dumpSymtab = function(st)
  11277. {
  11278. var pyBoolStr = function(b) { return b ? "True" : "False"; }
  11279. var pyList = function(l) {
  11280. var ret = [];
  11281. for (var i = 0; i < l.length; ++i)
  11282. {
  11283. ret.push(new Sk.builtin.str(l[i]).tp$repr().v);
  11284. }
  11285. return '[' + ret.join(', ') + ']';
  11286. };
  11287. var getIdents = function(obj, indent)
  11288. {
  11289. if (indent === undefined) indent = "";
  11290. var ret = "";
  11291. ret += indent + "Sym_type: " + obj.get_type() + "\n";
  11292. ret += indent + "Sym_name: " + obj.get_name() + "\n";
  11293. ret += indent + "Sym_lineno: " + obj.get_lineno() + "\n";
  11294. ret += indent + "Sym_nested: " + pyBoolStr(obj.is_nested()) + "\n";
  11295. ret += indent + "Sym_haschildren: " + pyBoolStr(obj.has_children()) + "\n";
  11296. if (obj.get_type() === "class")
  11297. {
  11298. ret += indent + "Class_methods: " + pyList(obj.get_methods()) + "\n";
  11299. }
  11300. else if (obj.get_type() === "function")
  11301. {
  11302. ret += indent + "Func_params: " + pyList(obj.get_parameters()) + "\n";
  11303. ret += indent + "Func_locals: " + pyList(obj.get_locals()) + "\n";
  11304. ret += indent + "Func_globals: " + pyList(obj.get_globals()) + "\n";
  11305. ret += indent + "Func_frees: " + pyList(obj.get_frees()) + "\n";
  11306. }
  11307. ret += indent + "-- Identifiers --\n";
  11308. var objidents = obj.get_identifiers();
  11309. var objidentslen = objidents.length;
  11310. for (var i = 0; i < objidentslen; ++i)
  11311. {
  11312. var info = obj.lookup(objidents[i]);
  11313. ret += indent + "name: " + info.get_name() + "\n";
  11314. ret += indent + " is_referenced: " + pyBoolStr(info.is_referenced()) + "\n";
  11315. ret += indent + " is_imported: " + pyBoolStr(info.is_imported()) + "\n";
  11316. ret += indent + " is_parameter: " + pyBoolStr(info.is_parameter()) + "\n";
  11317. ret += indent + " is_global: " + pyBoolStr(info.is_global()) + "\n";
  11318. ret += indent + " is_declared_global: " + pyBoolStr(info.is_declared_global()) + "\n";
  11319. ret += indent + " is_local: " + pyBoolStr(info.is_local()) + "\n";
  11320. ret += indent + " is_free: " + pyBoolStr(info.is_free()) + "\n";
  11321. ret += indent + " is_assigned: " + pyBoolStr(info.is_assigned()) + "\n";
  11322. ret += indent + " is_namespace: " + pyBoolStr(info.is_namespace()) + "\n";
  11323. var nss = info.get_namespaces();
  11324. var nsslen = nss.length;
  11325. ret += indent + " namespaces: [\n";
  11326. var sub = [];
  11327. for (var j = 0; j < nsslen; ++j)
  11328. {
  11329. var ns = nss[j];
  11330. sub.push(getIdents(ns, indent + " "));
  11331. }
  11332. ret += sub.join('\n');
  11333. ret += indent + " ]\n";
  11334. }
  11335. return ret;
  11336. }
  11337. return getIdents(st.top, "");
  11338. };
  11339. goog.exportSymbol("Sk.symboltable", Sk.symboltable);
  11340. goog.exportSymbol("Sk.dumpSymtab", Sk.dumpSymtab);
  11341. /** @param {...*} x */
  11342. var out;
  11343. /**
  11344. * @constructor
  11345. * @param {string} filename
  11346. * @param {SymbolTable} st
  11347. * @param {number} flags
  11348. * @param {string=} sourceCodeForAnnotation used to add original source to listing if desired
  11349. */
  11350. function Compiler(filename, st, flags, sourceCodeForAnnotation)
  11351. {
  11352. this.filename = filename;
  11353. this.st = st;
  11354. this.flags = flags;
  11355. this.interactive = false;
  11356. this.nestlevel = 0;
  11357. this.u = null;
  11358. this.stack = [];
  11359. this.result = [];
  11360. this.gensymcount = 0;
  11361. this.allUnits = [];
  11362. this.source = sourceCodeForAnnotation ? sourceCodeForAnnotation.split("\n") : false;
  11363. }
  11364. /**
  11365. * @constructor
  11366. *
  11367. * Stuff that changes on entry/exit of code blocks. must be saved and restored
  11368. * when returning to a block.
  11369. *
  11370. * Corresponds to the body of a module, class, or function.
  11371. */
  11372. function CompilerUnit()
  11373. {
  11374. this.ste = null;
  11375. this.name = null;
  11376. this.private_ = null;
  11377. this.firstlineno = 0;
  11378. this.lineno = 0;
  11379. this.linenoSet = false;
  11380. this.localnames = [];
  11381. this.blocknum = 0;
  11382. this.blocks = [];
  11383. this.curblock = 0;
  11384. this.scopename = null;
  11385. this.prefixCode = '';
  11386. this.varDeclsCode = '';
  11387. this.switchCode = '';
  11388. this.suffixCode = '';
  11389. // stack of where to go on a break
  11390. this.breakBlocks = [];
  11391. // stack of where to go on a continue
  11392. this.continueBlocks = [];
  11393. }
  11394. CompilerUnit.prototype.activateScope = function()
  11395. {
  11396. var self = this;
  11397. out = function() {
  11398. var b = self.blocks[self.curblock];
  11399. for (var i = 0; i < arguments.length; ++i)
  11400. b.push(arguments[i]);
  11401. };
  11402. };
  11403. Compiler.prototype.getSourceLine = function(lineno)
  11404. {
  11405. goog.asserts.assert(this.source);
  11406. return this.source[lineno - 1];
  11407. };
  11408. Compiler.prototype.annotateSource = function(ast)
  11409. {
  11410. if (this.source)
  11411. {
  11412. var lineno = ast.lineno;
  11413. var col_offset = ast.col_offset;
  11414. out("\n//\n// line ", lineno, ":\n// ", this.getSourceLine(lineno), "\n// ");
  11415. for (var i = 0; i < col_offset; ++i) out(" ");
  11416. out("^\n//\n");
  11417. }
  11418. };
  11419. Compiler.prototype.gensym = function(hint)
  11420. {
  11421. hint = hint || '';
  11422. hint = '$' + hint;
  11423. hint += this.gensymcount++;
  11424. return hint;
  11425. };
  11426. Compiler.prototype.niceName = function(roughName)
  11427. {
  11428. return this.gensym(roughName.replace("<", "").replace(">", "").replace(" ", "_"));
  11429. }
  11430. var reservedWords_ = { 'abstract': true, 'as': true, 'boolean': true,
  11431. 'break': true, 'byte': true, 'case': true, 'catch': true, 'char': true,
  11432. 'class': true, 'continue': true, 'const': true, 'debugger': true,
  11433. 'default': true, 'delete': true, 'do': true, 'double': true, 'else': true,
  11434. 'enum': true, 'export': true, 'extends': true, 'false': true,
  11435. 'final': true, 'finally': true, 'float': true, 'for': true,
  11436. 'function': true, 'goto': true, 'if': true, 'implements': true,
  11437. 'import': true, 'in': true, 'instanceof': true, 'int': true,
  11438. 'interface': true, 'is': true, 'long': true, 'namespace': true,
  11439. 'native': true, 'new': true, 'null': true, 'package': true,
  11440. 'private': true, 'protected': true, 'public': true, 'return': true,
  11441. 'short': true, 'static': true, 'super': true, 'switch': true,
  11442. 'synchronized': true, 'this': true, 'throw': true, 'throws': true,
  11443. 'transient': true, 'true': true, 'try': true, 'typeof': true, 'use': true,
  11444. 'var': true, 'void': true, 'volatile': true, 'while': true, 'with': true
  11445. };
  11446. function fixReservedWords(name)
  11447. {
  11448. if (reservedWords_[name] !== true)
  11449. return name;
  11450. return name + "_$rw$";
  11451. }
  11452. function mangleName(priv, ident)
  11453. {
  11454. var name = ident.v;
  11455. if (priv === null || name === null || name.charAt(0) !== '_' || name.charAt(1) !== '_')
  11456. return ident;
  11457. // don't mangle __id__
  11458. if (name.charAt(name.length - 1) === '_' && name.charAt(name.length - 2) === '_')
  11459. return ident;
  11460. // don't mangle classes that are all _ (obscure much?)
  11461. if (priv.replace(/_/g, '') === '')
  11462. return ident;
  11463. priv = priv.replace(/^_*/, '');
  11464. return '_' + priv + name;
  11465. }
  11466. /**
  11467. * @param {string} hint basename for gensym
  11468. * @param {...*} rest
  11469. */
  11470. Compiler.prototype._gr = function(hint, rest)
  11471. {
  11472. var v = this.gensym(hint);
  11473. out("var ", v, "=");
  11474. for (var i = 1; i < arguments.length; ++i)
  11475. {
  11476. out(arguments[i]);
  11477. }
  11478. out(";");
  11479. return v;
  11480. }
  11481. Compiler.prototype._jumpfalse = function(test, block)
  11482. {
  11483. var cond = this._gr('jfalse', "(", test, "===false||!Sk.misceval.isTrue(", test, "))");
  11484. out("if(", cond, "){/*test failed */$blk=", block, ";continue;}");
  11485. };
  11486. Compiler.prototype._jumpundef = function(test, block)
  11487. {
  11488. out("if(", test, "===undefined){$blk=", block, ";continue;}");
  11489. };
  11490. Compiler.prototype._jumptrue = function(test, block)
  11491. {
  11492. var cond = this._gr('jtrue', "(", test, "===true||Sk.misceval.isTrue(", test, "))");
  11493. out("if(", cond, "){/*test passed */$blk=", block, ";continue;}");
  11494. };
  11495. Compiler.prototype._jump = function(block)
  11496. {
  11497. out("$blk=", block, ";/* jump */continue;");
  11498. };
  11499. Compiler.prototype.ctupleorlist = function(e, data, tuporlist)
  11500. {
  11501. goog.asserts.assert(tuporlist === 'tuple' || tuporlist === 'list');
  11502. if (e.ctx === Store)
  11503. {
  11504. for (var i = 0; i < e.elts.length; ++i)
  11505. {
  11506. this.vexpr(e.elts[i], data + ".mp$subscript(" + i + ")");
  11507. }
  11508. }
  11509. else if (e.ctx === Load)
  11510. {
  11511. var items = [];
  11512. for (var i = 0; i < e.elts.length; ++i)
  11513. {
  11514. items.push(this._gr('elem', this.vexpr(e.elts[i])));
  11515. }
  11516. return this._gr('load'+tuporlist, "new Sk.builtin.", tuporlist, "([", items, "])");
  11517. }
  11518. };
  11519. Compiler.prototype.cdict = function(e)
  11520. {
  11521. goog.asserts.assert(e.values.length === e.keys.length);
  11522. var items = [];
  11523. for (var i = 0; i < e.values.length; ++i)
  11524. {
  11525. var v = this.vexpr(e.values[i]); // "backwards" to match order in cpy
  11526. items.push(this.vexpr(e.keys[i]));
  11527. items.push(v);
  11528. }
  11529. return this._gr('loaddict', "new Sk.builtin.dict([", items, "])");
  11530. };
  11531. Compiler.prototype.clistcompgen = function(tmpname, generators, genIndex, elt)
  11532. {
  11533. var start = this.newBlock('list gen start');
  11534. var skip = this.newBlock('list gen skip');
  11535. var anchor = this.newBlock('list gen anchor');
  11536. var l = generators[genIndex];
  11537. var toiter = this.vexpr(l.iter);
  11538. var iter = this._gr("iter", toiter, ".tp$iter()");
  11539. this._jump(start);
  11540. this.setBlock(start);
  11541. // load targets
  11542. var nexti = this._gr('next', iter, ".tp$iternext()");
  11543. this._jumpundef(nexti, anchor); // todo; this should be handled by StopIteration
  11544. var target = this.vexpr(l.target, nexti);
  11545. var n = l.ifs.length;
  11546. for (var i = 0; i < n; ++i)
  11547. {
  11548. var ifres = this.vexpr(l.ifs[i]);
  11549. this._jumpfalse(ifres, start);
  11550. }
  11551. if (++genIndex < generators.length)
  11552. {
  11553. this.clistcompgen(tmpname, generators, genIndex, elt);
  11554. }
  11555. if (genIndex >= generators.length)
  11556. {
  11557. var velt = this.vexpr(elt);
  11558. out(tmpname, ".v.push(", velt, ");"); // todo;
  11559. this._jump(skip);
  11560. this.setBlock(skip);
  11561. }
  11562. this._jump(start);
  11563. this.setBlock(anchor);
  11564. return tmpname;
  11565. };
  11566. Compiler.prototype.clistcomp = function(e)
  11567. {
  11568. goog.asserts.assert(e instanceof ListComp);
  11569. var tmp = this._gr("_compr", "new Sk.builtin.list([])"); // note: _ is impt. for hack in name mangling (same as cpy)
  11570. return this.clistcompgen(tmp, e.generators, 0, e.elt);
  11571. };
  11572. Compiler.prototype.cyield = function(e)
  11573. {
  11574. if (this.u.ste.blockType !== FunctionBlock)
  11575. throw new SyntaxError("'yield' outside function");
  11576. var val = 'null';
  11577. if (e.value)
  11578. val = this.vexpr(e.value);
  11579. var nextBlock = this.newBlock('after yield');
  11580. // return a pair: resume target block and yielded value
  11581. out("return [/*resume*/", nextBlock, ",/*ret*/", val, "];");
  11582. this.setBlock(nextBlock);
  11583. return 'null'; // todo; sends from outside
  11584. }
  11585. Compiler.prototype.ccompare = function(e)
  11586. {
  11587. var left = this.vexpr(e.left);
  11588. goog.asserts.assert(e.ops.length === 1 && e.comparators.length === 1, "todo; >1 compares");
  11589. goog.asserts.assert(e.ops.length === e.comparators.length);
  11590. return this._gr('compare', "Sk.misceval.richCompareBool(", left, ",", this.vexpr(e.comparators[0]), ",'", e.ops[0]._astname, "')");
  11591. };
  11592. Compiler.prototype.ccall = function(e)
  11593. {
  11594. var func = this.vexpr(e.func);
  11595. var args = this.vseqexpr(e.args);
  11596. goog.asserts.assert(!e.starargs, "todo;");
  11597. goog.asserts.assert(!e.kwargs, "todo;");
  11598. var keywords = "undefined";
  11599. if (e.keywords.length > 0)
  11600. {
  11601. var kwarray = [];
  11602. for (var i = 0; i < e.keywords.length; ++i)
  11603. {
  11604. kwarray.push("'" + e.keywords[i].arg.v + "'");
  11605. kwarray.push(this.vexpr(e.keywords[i].value));
  11606. }
  11607. keywords = "[" + kwarray.join(",") + "]";
  11608. }
  11609. return this._gr('call', "Sk.misceval.call(", func, ",", keywords, args.length > 0 ? "," : "", args, ")");
  11610. };
  11611. Compiler.prototype.csimpleslice = function(s, ctx, obj, dataToStore)
  11612. {
  11613. goog.asserts.assert(s.step === null);
  11614. var lower = 'null', upper = 'null';
  11615. if (s.lower)
  11616. lower = this.vexpr(s.lower);
  11617. if (s.upper)
  11618. upper = this.vexpr(s.upper);
  11619. // todo; don't require making a slice obj, and move logic into general sequence place
  11620. switch (ctx)
  11621. {
  11622. case AugLoad:
  11623. case Load:
  11624. return this._gr("simpsliceload", "Sk.misceval.applySlice(", obj, ",", lower, ",", upper, ")");
  11625. case AugStore:
  11626. case Store:
  11627. out("Sk.misceval.assignSlice(", obj, ",", lower, ",", upper, ",", dataToStore, ");");
  11628. break;
  11629. case Del:
  11630. out("Sk.misceval.assignSlice(", obj, ",", lower, ",", upper, ",null);");
  11631. break;
  11632. case Param:
  11633. default:
  11634. goog.asserts.fail("invalid simple slice");
  11635. }
  11636. };
  11637. Compiler.prototype.cslice = function(s, ctx, obj, dataToStore)
  11638. {
  11639. goog.asserts.assert(s instanceof Slice);
  11640. var low = s.lower ? this.vexpr(s.lower) : 'null';
  11641. var high = s.upper ? this.vexpr(s.upper) : 'null';
  11642. var step = s.step ? this.vexpr(s.step) : 'null';
  11643. return this._gr('slice', "new Sk.builtin.slice(", low, ",", high, ",", step, ")");
  11644. };
  11645. Compiler.prototype.vslice = function(s, ctx, obj, dataToStore)
  11646. {
  11647. var kindname = null;
  11648. var subs;
  11649. switch (s.constructor)
  11650. {
  11651. case Index:
  11652. kindname = "index";
  11653. subs = this.vexpr(s.value);
  11654. break;
  11655. case Slice:
  11656. if (!s.step)
  11657. return this.csimpleslice(s, ctx, obj, dataToStore);
  11658. if (ctx !== AugStore)
  11659. subs = this.cslice(s, ctx, obj, dataToStore);
  11660. break;
  11661. case Ellipsis:
  11662. case ExtSlice:
  11663. goog.asserts.fail("todo;");
  11664. break;
  11665. default:
  11666. goog.asserts.fail("invalid subscript kind");
  11667. }
  11668. return this.chandlesubscr(kindname, ctx, obj, subs, dataToStore);
  11669. };
  11670. Compiler.prototype.chandlesubscr = function(kindname, ctx, obj, subs, data)
  11671. {
  11672. if (ctx === Load || ctx === AugLoad)
  11673. return this._gr('lsubscr', "Sk.abstr.objectGetItem(", obj, ",", subs, ")");
  11674. else if (ctx === Store || ctx === AugStore)
  11675. out("Sk.abstr.objectSetItem(", obj, ",", subs, ",", data, ");");
  11676. else if (ctx === Del)
  11677. out("Sk.abstr.objectDelItem(", obj, ",", subs, ");");
  11678. else
  11679. goog.asserts.fail("handlesubscr fail");
  11680. };
  11681. Compiler.prototype.cboolop = function(e)
  11682. {
  11683. goog.asserts.assert(e instanceof BoolOp);
  11684. var jtype;
  11685. var ifFailed;
  11686. if (e.op === And)
  11687. jtype = this._jumpfalse;
  11688. else
  11689. jtype = this._jumptrue;
  11690. var end = this.newBlock('end of boolop');
  11691. var retval = this._gr('boolopsucc', e.op !== And);
  11692. var s = e.values;
  11693. var n = s.length;
  11694. for (var i = 0; i < n; ++i)
  11695. {
  11696. jtype.call(this, this.vexpr(s[i]), end);
  11697. }
  11698. out(retval, "=", e.op === And, ";");
  11699. this.setBlock(end);
  11700. return retval;
  11701. };
  11702. /**
  11703. *
  11704. * compiles an expression. to 'return' something, it'll gensym a var and store
  11705. * into that var so that the calling code doesn't have avoid just pasting the
  11706. * returned name.
  11707. *
  11708. * @param {Object} e
  11709. * @param {string=} data data to store in a store operation
  11710. * @param {Object=} augstoreval value to store to for an aug operation (not
  11711. * vexpr'd yet)
  11712. */
  11713. Compiler.prototype.vexpr = function(e, data, augstoreval)
  11714. {
  11715. if (e.lineno > this.u.lineno)
  11716. {
  11717. this.u.lineno = e.lineno;
  11718. this.u.linenoSet = false;
  11719. }
  11720. //this.annotateSource(e);
  11721. switch (e.constructor)
  11722. {
  11723. case BoolOp:
  11724. return this.cboolop(e);
  11725. case BinOp:
  11726. return this._gr('binop', "Sk.abstr.numberBinOp(", this.vexpr(e.left), ",", this.vexpr(e.right), ",'", e.op._astname, "')");
  11727. case UnaryOp:
  11728. return this._gr('unaryop', "Sk.abstr.numberUnaryOp(", this.vexpr(e.operand), ",'", e.op._astname, "')");
  11729. case Lambda:
  11730. return this.clambda(e);
  11731. case IfExp:
  11732. goog.asserts.fail();
  11733. //return this.cifexp(e);
  11734. case Dict:
  11735. return this.cdict(e);
  11736. case ListComp:
  11737. return this.clistcomp(e);
  11738. case GeneratorExp:
  11739. return this.cgenexp(e);
  11740. case Yield:
  11741. return this.cyield(e);
  11742. case Compare:
  11743. return this.ccompare(e);
  11744. case Call:
  11745. return this.ccall(e);
  11746. case Num:
  11747. if (typeof e.n === "number")
  11748. return e.n;
  11749. else if (e.n instanceof Sk.builtin.lng)
  11750. return "Sk.longFromStr('" + e.n.tp$str().v + "')";
  11751. goog.asserts.fail("unhandled Num type");
  11752. case Str:
  11753. return this._gr('str', "new Sk.builtin.str(", e.s.tp$repr().v, ")");
  11754. case Attribute:
  11755. var val;
  11756. if (e.ctx !== AugStore)
  11757. val = this.vexpr(e.value);
  11758. switch (e.ctx)
  11759. {
  11760. case AugLoad:
  11761. case Load:
  11762. return this._gr("lattr", val, ".tp$getattr(", e.attr.tp$repr().v, ")");
  11763. case AugStore:
  11764. out("if(", data, "!==undefined){"); // special case to avoid re-store if inplace worked
  11765. val = this.vexpr(augstoreval || null); // the || null can never happen, but closure thinks we can get here with it being undef
  11766. out(val, ".tp$setattr(", e.attr.tp$repr().v, ",", data, ");");
  11767. out("}");
  11768. break;
  11769. case Store:
  11770. out(val, ".tp$setattr(", e.attr.tp$repr().v, ",", data, ");");
  11771. break;
  11772. case Del:
  11773. goog.asserts.fail("todo;");
  11774. break;
  11775. case Param:
  11776. default:
  11777. goog.asserts.fail("invalid attribute expression");
  11778. }
  11779. break;
  11780. case Subscript:
  11781. var val;
  11782. switch (e.ctx)
  11783. {
  11784. case AugLoad:
  11785. case Load:
  11786. case Store:
  11787. case Del:
  11788. return this.vslice(e.slice, e.ctx, this.vexpr(e.value), data);
  11789. case AugStore:
  11790. out("if(", data, "!==undefined){"); // special case to avoid re-store if inplace worked
  11791. val = this.vexpr(augstoreval || null); // the || null can never happen, but closure thinks we can get here with it being undef
  11792. this.vslice(e.slice, e.ctx, val, data);
  11793. out("}");
  11794. break;
  11795. case Param:
  11796. default:
  11797. goog.asserts.fail("invalid subscript expression");
  11798. }
  11799. break;
  11800. case Name:
  11801. return this.nameop(e.id, e.ctx, data);
  11802. case List:
  11803. return this.ctupleorlist(e, data, 'list');
  11804. case Tuple:
  11805. return this.ctupleorlist(e, data, 'tuple');
  11806. default:
  11807. goog.asserts.fail("unhandled case in vexpr");
  11808. }
  11809. };
  11810. /**
  11811. * @param {Array.<Object>} exprs
  11812. * @param {Array.<string>=} data
  11813. */
  11814. Compiler.prototype.vseqexpr = function(exprs, data)
  11815. {
  11816. goog.asserts.assert(data === undefined || exprs.length === data.length);
  11817. var ret = [];
  11818. for (var i = 0; i < exprs.length; ++i)
  11819. ret.push(this.vexpr(exprs[i], data === undefined ? undefined : data[i]));
  11820. return ret;
  11821. };
  11822. Compiler.prototype.caugassign = function(s)
  11823. {
  11824. goog.asserts.assert(s instanceof AugAssign);
  11825. var e = s.target;
  11826. switch (e.constructor)
  11827. {
  11828. case Attribute:
  11829. var auge = new Attribute(e.value, e.attr, AugLoad, e.lineno, e.col_offset);
  11830. var aug = this.vexpr(auge);
  11831. var val = this.vexpr(s.value);
  11832. var res = this._gr('inplbinopattr', "Sk.abstr.numberInplaceBinOp(", aug, ",", val, ",'", s.op._astname, "')");
  11833. auge.ctx = AugStore;
  11834. return this.vexpr(auge, res, e.value)
  11835. case Subscript:
  11836. var auge = new Subscript(e.value, e.slice, AugLoad, e.lineno, e.col_offset);
  11837. var aug = this.vexpr(auge);
  11838. var val = this.vexpr(s.value);
  11839. var res = this._gr('inplbinopsubscr', "Sk.abstr.numberInplaceBinOp(", aug, ",", val, ",'", s.op._astname, "')");
  11840. auge.ctx = AugStore;
  11841. return this.vexpr(auge, res, e.value)
  11842. case Name:
  11843. var to = this.nameop(e.id, Load);
  11844. var val = this.vexpr(s.value);
  11845. var res = this._gr('inplbinop', "Sk.abstr.numberInplaceBinOp(", to, ",", val, ",'", s.op._astname, "')");
  11846. return this.nameop(e.id, Store, res);
  11847. default:
  11848. goog.asserts.fail("unhandled case in augassign");
  11849. }
  11850. };
  11851. /**
  11852. * optimize some constant exprs. returns 0 if always 0, 1 if always 1 or -1 otherwise.
  11853. */
  11854. Compiler.prototype.exprConstant = function(e)
  11855. {
  11856. switch (e.constructor)
  11857. {
  11858. case Num:
  11859. return Sk.misceval.isTrue(e.n);
  11860. case Str:
  11861. return Sk.misceval.isTrue(e.s);
  11862. case Name:
  11863. // todo; do __debug__ test here if opt
  11864. default:
  11865. return -1;
  11866. }
  11867. };
  11868. Compiler.prototype.newBlock = function(name)
  11869. {
  11870. var ret = this.u.blocknum++;
  11871. this.u.blocks[ret] = [];
  11872. this.u.blocks[ret]._name = name || '<unnamed>';
  11873. return ret;
  11874. };
  11875. Compiler.prototype.setBlock = function(n)
  11876. {
  11877. goog.asserts.assert(n >= 0 && n < this.u.blocknum);
  11878. this.u.curblock = n;
  11879. };
  11880. Compiler.prototype.pushBreakBlock = function(n)
  11881. {
  11882. goog.asserts.assert(n >= 0 && n < this.u.blocknum);
  11883. this.u.breakBlocks.push(n);
  11884. };
  11885. Compiler.prototype.popBreakBlock = function()
  11886. {
  11887. this.u.breakBlocks.pop();
  11888. };
  11889. Compiler.prototype.pushContinueBlock = function(n)
  11890. {
  11891. goog.asserts.assert(n >= 0 && n < this.u.blocknum);
  11892. this.u.continueBlocks.push(n);
  11893. };
  11894. Compiler.prototype.popContinueBlock = function()
  11895. {
  11896. this.u.continueBlocks.pop();
  11897. };
  11898. Compiler.prototype.outputLocals = function(unit)
  11899. {
  11900. var have = {};
  11901. //print("args", unit.name.v, JSON.stringify(unit.argnames));
  11902. for (var i = 0; unit.argnames && i < unit.argnames.length; ++i)
  11903. have[unit.argnames[i]] = true;
  11904. unit.localnames.sort();
  11905. var output = [];
  11906. for (var i = 0; i < unit.localnames.length; ++i)
  11907. {
  11908. var name = unit.localnames[i];
  11909. if (have[name] === undefined)
  11910. {
  11911. output.push(name);
  11912. have[name] = true;
  11913. }
  11914. }
  11915. if (output.length > 0)
  11916. return "var " + output.join(",") + "; /* locals */";
  11917. return "";
  11918. };
  11919. Compiler.prototype.outputAllUnits = function()
  11920. {
  11921. var ret = '';
  11922. for (var j = 0; j < this.allUnits.length; ++j)
  11923. {
  11924. var unit = this.allUnits[j];
  11925. ret += unit.prefixCode;
  11926. ret += this.outputLocals(unit);
  11927. ret += unit.varDeclsCode;
  11928. ret += unit.switchCode;
  11929. var blocks = unit.blocks;
  11930. for (var i = 0; i < blocks.length; ++i)
  11931. {
  11932. ret += "case " + i + ": /* --- " + blocks[i]._name + " --- */";
  11933. ret += blocks[i].join('');
  11934. ret += "goog.asserts.fail('unterminated block');";
  11935. }
  11936. ret += unit.suffixCode;
  11937. }
  11938. return ret;
  11939. };
  11940. Compiler.prototype.cif = function(s)
  11941. {
  11942. goog.asserts.assert(s instanceof If_);
  11943. var constant = this.exprConstant(s.test);
  11944. if (constant === 0)
  11945. {
  11946. if (s.orelse)
  11947. this.vseqstmt(s.orelse);
  11948. }
  11949. else if (constant === 1)
  11950. {
  11951. this.vseqstmt(s.body);
  11952. }
  11953. else
  11954. {
  11955. var end = this.newBlock('end of if');
  11956. var next = this.newBlock('next branch of if');
  11957. var test = this.vexpr(s.test);
  11958. this._jumpfalse(this.vexpr(s.test), next);
  11959. this.vseqstmt(s.body);
  11960. this._jump(end);
  11961. this.setBlock(next);
  11962. if (s.orelse)
  11963. this.vseqstmt(s.orelse);
  11964. this._jump(end);
  11965. }
  11966. this.setBlock(end);
  11967. };
  11968. Compiler.prototype.cwhile = function(s)
  11969. {
  11970. var constant = this.exprConstant(s.test);
  11971. if (constant === 0)
  11972. {
  11973. if (s.orelse)
  11974. this.vseqstmt(s.orelse);
  11975. }
  11976. else
  11977. {
  11978. var top = this.newBlock('while test');
  11979. this._jump(top);
  11980. this.setBlock(top);
  11981. var next = this.newBlock('after while');
  11982. var orelse = s.orelse.length > 0 ? this.newBlock('while orelse') : null;
  11983. var body = this.newBlock('while body');
  11984. this._jumpfalse(this.vexpr(s.test), orelse ? orelse : next);
  11985. this._jump(body);
  11986. this.pushBreakBlock(next);
  11987. this.pushContinueBlock(top);
  11988. this.setBlock(body);
  11989. this.vseqstmt(s.body);
  11990. this._jump(top);
  11991. this.popContinueBlock();
  11992. this.popBreakBlock();
  11993. if (s.orelse.length > 0)
  11994. {
  11995. this.setBlock(orelse);
  11996. this.vseqstmt(s.orelse);
  11997. }
  11998. this.setBlock(next);
  11999. }
  12000. };
  12001. Compiler.prototype.cfor = function(s)
  12002. {
  12003. var start = this.newBlock('for start');
  12004. var cleanup = this.newBlock('for cleanup');
  12005. var end = this.newBlock('for end');
  12006. this.pushBreakBlock(end);
  12007. this.pushContinueBlock(start);
  12008. // get the iterator
  12009. var toiter = this.vexpr(s.iter);
  12010. var iter;
  12011. if (this.u.ste.generator)
  12012. {
  12013. // if we're in a generator, we have to store the iterator to a local
  12014. // so it's preserved (as we cross blocks here and assume it survives)
  12015. iter = "$loc." + this.gensym("iter");
  12016. out(iter, "=", toiter, ".tp$iter();");
  12017. }
  12018. else
  12019. iter = this._gr("iter", toiter, ".tp$iter()");
  12020. this._jump(start);
  12021. this.setBlock(start);
  12022. // load targets
  12023. var nexti = this._gr('next', iter, ".tp$iternext()");
  12024. this._jumpundef(nexti, cleanup); // todo; this should be handled by StopIteration
  12025. var target = this.vexpr(s.target, nexti);
  12026. // execute body
  12027. this.vseqstmt(s.body);
  12028. // jump to top of loop
  12029. this._jump(start);
  12030. this.setBlock(cleanup);
  12031. this.popContinueBlock();
  12032. this.popBreakBlock();
  12033. this.vseqstmt(s.orelse);
  12034. this._jump(end);
  12035. this.setBlock(end);
  12036. };
  12037. Compiler.prototype.craise = function(s)
  12038. {
  12039. // currently, we only handle StopIteration, and all it does it return
  12040. // undefined which is what our iterator protocol requires.
  12041. //
  12042. // totally hacky, but good enough for now.
  12043. goog.asserts.assert(s.type.id.v === "StopIteration", "only support 'raise' of StopIteration currently");
  12044. out("return undefined;");
  12045. };
  12046. Compiler.prototype.cassert = function(s)
  12047. {
  12048. /* todo; warnings method
  12049. if (s.test instanceof Tuple && s.test.elts.length > 0)
  12050. Sk.warn("assertion is always true, perhaps remove parentheses?");
  12051. */
  12052. var test = this.vexpr(s.test);
  12053. var end = this.newBlock("end");
  12054. this._jumptrue(test, end);
  12055. // todo; exception handling
  12056. out("throw new Sk.builtin.AssertionError(", s.msg ? this.vexpr(s.msg) : "", ");");
  12057. this.setBlock(end);
  12058. };
  12059. Compiler.prototype.cimportas = function(name, asname, mod)
  12060. {
  12061. var src = name.v;
  12062. var dotLoc = src.indexOf(".");
  12063. //print("src", src);
  12064. //print("dotLoc", dotLoc);
  12065. var cur = mod;
  12066. if (dotLoc !== -1)
  12067. {
  12068. // if there's dots in the module name, __import__ will have returned
  12069. // the top-level module. so, we need to extract the actual module by
  12070. // getattr'ing up through the names, and then storing the leaf under
  12071. // the name it was to be imported as.
  12072. src = src.substr(dotLoc + 1);
  12073. //print("src now", src);
  12074. while (dotLoc !== -1)
  12075. {
  12076. dotLoc = src.indexOf(".");
  12077. var attr = dotLoc !== -1 ? src.substr(0, dotLoc) : src;
  12078. cur = this._gr('lattr', cur, ".tp$getattr('", attr, "')");
  12079. src = src.substr(dotLoc + 1);
  12080. }
  12081. }
  12082. return this.nameop(asname, Store, cur);
  12083. };
  12084. Compiler.prototype.cimport = function(s)
  12085. {
  12086. var n = s.names.length;
  12087. for (var i = 0; i < n; ++i)
  12088. {
  12089. var alias = s.names[i];
  12090. var mod = this._gr('module', "Sk.builtin.__import__(", alias.name.tp$repr().v, ",$gbl,$loc,[])");
  12091. if (alias.asname)
  12092. {
  12093. this.cimportas(alias.name, alias.asname, mod);
  12094. }
  12095. else
  12096. {
  12097. var tmp = alias.name;
  12098. var lastDot = tmp.v.indexOf('.');
  12099. if (lastDot !== -1)
  12100. tmp = new Sk.builtin.str(tmp.v.substr(0, lastDot));
  12101. this.nameop(tmp, Store, mod);
  12102. }
  12103. }
  12104. };
  12105. Compiler.prototype.cfromimport = function(s)
  12106. {
  12107. var n = s.names.length;
  12108. var names = [];
  12109. for (var i = 0; i < n; ++i)
  12110. names[i] = s.names[i].name.tp$repr().v;
  12111. var mod = this._gr('module', "Sk.builtin.__import__(", s.module.tp$repr().v, ",$gbl,$loc,[", names, "])");
  12112. for (var i = 0; i < n; ++i)
  12113. {
  12114. var alias = s.names[i];
  12115. if (i === 0 && alias.name === "*")
  12116. {
  12117. goog.asserts.assert(n === 1);
  12118. out("Sk.importStar(", mod, ");");
  12119. return;
  12120. }
  12121. var got = this._gr('item', mod, ".tp$getattr(", alias.name.tp$repr().v, ")");
  12122. var storeName = alias.name;
  12123. if (alias.asname)
  12124. storeName = alias.asname;
  12125. this.nameop(storeName, Store, got);
  12126. }
  12127. };
  12128. /**
  12129. * builds a code object (js function) for various constructs. used by def,
  12130. * lambda, generator expressions. it isn't used for class because it seemed
  12131. * different enough.
  12132. *
  12133. * handles:
  12134. * - setting up a new scope
  12135. * - decorators (if any)
  12136. * - defaults setup
  12137. * - setup for cell and free vars
  12138. * - setup and modification for generators
  12139. *
  12140. * @param {Object} n ast node to build for
  12141. * @param {Sk.builtin.str} coname name of code object to build
  12142. * @param {Array} decorator_list ast of decorators if any
  12143. * @param {arguments_} args arguments to function, if any
  12144. * @param {Function} callback called after setup to do actual work of function
  12145. *
  12146. * @returns the name of the newly created function or generator object.
  12147. *
  12148. */
  12149. Compiler.prototype.buildcodeobj = function(n, coname, decorator_list, args, callback)
  12150. {
  12151. var decos = [];
  12152. var defaults = [];
  12153. // decorators and defaults have to be evaluated out here before we enter
  12154. // the new scope. we output the defaults and attach them to this code
  12155. // object, but only once we know the name of it (so we do it after we've
  12156. // exited the scope near the end of this function).
  12157. if (decorator_list)
  12158. decos = this.vseqexpr(decorator_list);
  12159. if (args && args.defaults)
  12160. defaults = this.vseqexpr(args.defaults);
  12161. //
  12162. // enter the new scope, and create the first block
  12163. //
  12164. var scopename = this.enterScope(coname, n, n.lineno);
  12165. var isGenerator = this.u.ste.generator;
  12166. var hasFree = this.u.ste.hasFree;
  12167. var hasCell = this.u.ste.childHasFree;
  12168. var entryBlock = this.newBlock('codeobj entry');
  12169. //
  12170. // the header of the function, and arguments
  12171. //
  12172. this.u.prefixCode = "var " + scopename + "=(function " + this.niceName(coname.v) + "$(";
  12173. var funcArgs = [];
  12174. if (isGenerator)
  12175. funcArgs.push("$gen");
  12176. else
  12177. {
  12178. for (var i = 0; args && i < args.args.length; ++i)
  12179. funcArgs.push(this.nameop(args.args[i].id, Param));
  12180. }
  12181. if (hasFree)
  12182. funcArgs.push("$free");
  12183. this.u.prefixCode += funcArgs.join(",");
  12184. this.u.prefixCode += "){";
  12185. if (isGenerator) this.u.prefixCode += "\n// generator\n";
  12186. if (hasFree) this.u.prefixCode += "\n// has free\n";
  12187. if (hasCell) this.u.prefixCode += "\n// has cell\n";
  12188. //
  12189. // set up standard dicts/variables
  12190. //
  12191. var locals = "{}";
  12192. if (isGenerator)
  12193. {
  12194. entryBlock = "$gen.gi$resumeat";
  12195. locals = "$gen.gi$locals";
  12196. }
  12197. var cells = "";
  12198. if (hasCell)
  12199. cells = ",$cell={}";
  12200. // note special usage of 'this' to avoid having to slice globals into
  12201. // all function invocations in call
  12202. this.u.varDeclsCode += "var $blk=" + entryBlock + ",$loc=" + locals + cells + ",$gbl=this;";
  12203. //
  12204. // copy all parameters that are also cells into the cells dict. this is so
  12205. // they can be accessed correctly by nested scopes.
  12206. //
  12207. for (var i = 0; args && i < args.args.length; ++i)
  12208. {
  12209. var id = args.args[i].id;
  12210. if (this.isCell(id))
  12211. this.u.varDeclsCode += "$cell." + id.v + "=" + id.v + ";";
  12212. }
  12213. //
  12214. // initialize default arguments. we store the values of the defaults to
  12215. // this code object as .$defaults just below after we exit this scope.
  12216. //
  12217. if (defaults.length > 0)
  12218. {
  12219. // defaults have to be "right justified" so if there's less defaults
  12220. // than args we offset to make them match up (we don't need another
  12221. // correlation in the ast)
  12222. var offset = args.args.length - defaults.length;
  12223. for (var i = 0; i < defaults.length; ++i)
  12224. {
  12225. var argname = this.nameop(args.args[i + offset].id, Param);
  12226. this.u.varDeclsCode += "if(" + argname + "===undefined)" + argname +"=" + scopename+".$defaults[" + i + "];";
  12227. }
  12228. }
  12229. //
  12230. // finally, set up the block switch that the jump code expects
  12231. //
  12232. this.u.switchCode += "while(true){switch($blk){";
  12233. this.u.suffixCode = "}break;}});";
  12234. //
  12235. // jump back to the handler so it can do the main actual work of the
  12236. // function
  12237. //
  12238. callback.call(this, scopename);
  12239. //
  12240. // get a list of all the argument names (used to attach to the code
  12241. // object, and also to allow us to declare only locals that aren't also
  12242. // parameters).
  12243. var argnames;
  12244. if (args && args.args.length > 0)
  12245. {
  12246. var argnamesarr = [];
  12247. for (var i = 0; i < args.args.length; ++i)
  12248. argnamesarr.push(args.args[i].id.v);
  12249. argnames = argnamesarr.join("', '");
  12250. // store to unit so we know what local variables not to declare
  12251. this.u.argnames = argnamesarr;
  12252. }
  12253. //
  12254. // and exit the code object scope
  12255. //
  12256. this.exitScope();
  12257. //
  12258. // attach the default values we evaluated at the beginning to the code
  12259. // object so that it can get at them to set any arguments that are left
  12260. // unset.
  12261. //
  12262. if (defaults.length > 0)
  12263. out(scopename, ".$defaults=[", defaults.join(','), "];");
  12264. //
  12265. // attach co_varnames (only the argument names) for keyword argument
  12266. // binding.
  12267. //
  12268. if (argnames)
  12269. {
  12270. out(scopename, ".co_varnames=['", argnames, "'];");
  12271. }
  12272. //
  12273. // build either a 'function' or 'generator'. the function is just a simple
  12274. // constructor call. the generator is more complicated. it needs to make a
  12275. // new generator every time it's called, so the thing that's returned is
  12276. // actually a function that makes the generator (and passes arguments to
  12277. // the function onwards to the generator). this should probably actually
  12278. // be a function object, rather than a js function like it is now. we also
  12279. // have to build the argument names to pass to the generator because it
  12280. // needs to store all locals into itself so that they're maintained across
  12281. // yields.
  12282. //
  12283. // todo; possibly this should be outside?
  12284. //
  12285. var frees = "";
  12286. if (hasFree)
  12287. {
  12288. frees = ",$cell";
  12289. // if the scope we're in where we're defining this one has free
  12290. // vars, they may also be cell vars, so we pass those to the
  12291. // closure too.
  12292. var containingHasFree = this.u.ste.hasFree;
  12293. if (containingHasFree)
  12294. frees += ",$free";
  12295. }
  12296. if (isGenerator)
  12297. if (args && args.args.length > 0)
  12298. return this._gr("gener", "(function(){var $origargs=Array.prototype.slice.call(arguments);return new Sk.builtin.generator(", scopename, ",$gbl,$origargs", frees, ");})");
  12299. else
  12300. return this._gr("gener", "(function(){return new Sk.builtin.generator(", scopename, ",$gbl,[]", frees, ");})");
  12301. else
  12302. return this._gr("funcobj", "new Sk.builtin.func(", scopename, ",$gbl", frees ,")");
  12303. };
  12304. Compiler.prototype.cfunction = function(s)
  12305. {
  12306. goog.asserts.assert(s instanceof FunctionDef);
  12307. var funcorgen = this.buildcodeobj(s, s.name, s.decorator_list, s.args, function(scopename)
  12308. {
  12309. this.vseqstmt(s.body);
  12310. out("return null;"); // if we fall off the bottom, we want the ret to be None
  12311. });
  12312. this.nameop(s.name, Store, funcorgen);
  12313. };
  12314. Compiler.prototype.clambda = function(e)
  12315. {
  12316. goog.asserts.assert(e instanceof Lambda);
  12317. var func = this.buildcodeobj(e, new Sk.builtin.str("<lambda>"), null, e.args, function(scopename)
  12318. {
  12319. var val = this.vexpr(e.body);
  12320. out("return ", val, ";");
  12321. });
  12322. return func;
  12323. };
  12324. Compiler.prototype.cgenexpgen = function(generators, genIndex, elt)
  12325. {
  12326. var start = this.newBlock('start for ' + genIndex);
  12327. var skip = this.newBlock('skip for ' + genIndex);
  12328. var ifCleanup = this.newBlock('if cleanup for ' + genIndex);
  12329. var end = this.newBlock('end for ' + genIndex);
  12330. var ge = generators[genIndex];
  12331. var iter;
  12332. if (genIndex === 0)
  12333. {
  12334. // the outer most iterator is evaluated in the scope outside so we
  12335. // have to evaluate it outside and store it into the generator as a
  12336. // local, which we retrieve here.
  12337. iter = "$loc.$iter0";
  12338. }
  12339. else
  12340. {
  12341. var toiter = this.vexpr(ge.iter);
  12342. iter = "$loc." + this.gensym("iter");
  12343. out(iter, "=", toiter, ".tp$iter();");
  12344. }
  12345. this._jump(start);
  12346. this.setBlock(start);
  12347. // load targets
  12348. var nexti = this._gr('next', iter, ".tp$iternext()");
  12349. this._jumpundef(nexti, end); // todo; this should be handled by StopIteration
  12350. var target = this.vexpr(ge.target, nexti);
  12351. var n = ge.ifs.length;
  12352. for (var i = 0; i < n; ++i)
  12353. {
  12354. var ifres = this.vexpr(ge.ifs[i]);
  12355. this._jumpfalse(ifres, start);
  12356. }
  12357. if (++genIndex < generators.length)
  12358. {
  12359. this.cgenexpgen(generators, genIndex, elt);
  12360. }
  12361. if (genIndex >= generators.length)
  12362. {
  12363. var velt = this.vexpr(elt);
  12364. out("return [", skip, "/*resume*/,", velt, "/*ret*/];");
  12365. this.setBlock(skip);
  12366. }
  12367. this._jump(start);
  12368. this.setBlock(end);
  12369. if (genIndex === 1)
  12370. out("return null;");
  12371. };
  12372. Compiler.prototype.cgenexp = function(e)
  12373. {
  12374. var gen = this.buildcodeobj(e, new Sk.builtin.str("<genexpr>"), null, null, function(scopename)
  12375. {
  12376. this.cgenexpgen(e.generators, 0, e.elt);
  12377. });
  12378. // call the generator maker to get the generator. this is kind of dumb,
  12379. // but the code builder builds a wrapper that makes generators for normal
  12380. // function generators, so we just do it outside (even just new'ing it
  12381. // inline would be fine).
  12382. var gener = this._gr("gener", gen, "()");
  12383. // stuff the outermost iterator into the generator after evaluating it
  12384. // outside of the function. it's retrieved by the fixed name above.
  12385. out(gener, ".gi$locals.$iter0=", this.vexpr(e.generators[0].iter), ".tp$iter();");
  12386. return gener;
  12387. };
  12388. Compiler.prototype.cclass = function(s)
  12389. {
  12390. goog.asserts.assert(s instanceof ClassDef);
  12391. var decos = s.decorator_list;
  12392. // decorators and bases need to be eval'd out here
  12393. //this.vseqexpr(decos);
  12394. var bases = this.vseqexpr(s.bases);
  12395. var scopename = this.enterScope(s.name, s, s.lineno);
  12396. var entryBlock = this.newBlock('class entry');
  12397. this.u.prefixCode = "var " + scopename + "=(function $" + s.name.v + "$class_outer($globals,$locals,$rest){var $gbl=$globals,$loc=$locals;";
  12398. this.u.switchCode += "return(function " + s.name.v + "(){";
  12399. this.u.switchCode += "var $blk=" + entryBlock + ";while(true){switch($blk){";
  12400. this.u.suffixCode = "}break;}}).apply(null,$rest);});";
  12401. this.u.private_ = s.name;
  12402. this.cbody(s.body);
  12403. out("break;");
  12404. // build class
  12405. // apply decorators
  12406. this.exitScope();
  12407. // todo; metaclass
  12408. var wrapped = this._gr("built", "Sk.misceval.buildClass($gbl,", scopename, ",", s.name.tp$repr().v, ",[", bases, "])");
  12409. // store our new class under the right name
  12410. this.nameop(s.name, Store, wrapped);
  12411. };
  12412. Compiler.prototype.ccontinue = function(s)
  12413. {
  12414. if (this.u.continueBlocks.length === 0)
  12415. throw new SyntaxError("'continue' outside loop");
  12416. // todo; continue out of exception blocks
  12417. this._jump(this.u.continueBlocks[this.u.continueBlocks.length - 1]);
  12418. };
  12419. /**
  12420. * compiles a statement
  12421. */
  12422. Compiler.prototype.vstmt = function(s)
  12423. {
  12424. this.u.lineno = s.lineno;
  12425. this.u.linenoSet = false;
  12426. this.annotateSource(s);
  12427. switch (s.constructor)
  12428. {
  12429. case FunctionDef:
  12430. this.cfunction(s);
  12431. break;
  12432. case ClassDef:
  12433. this.cclass(s);
  12434. break;
  12435. case Return_:
  12436. if (this.u.ste.blockType !== FunctionBlock)
  12437. throw new SyntaxError("'return' outside function");
  12438. if (s.value)
  12439. out("return ", this.vexpr(s.value), ";");
  12440. else
  12441. out("return null;");
  12442. break;
  12443. case Delete_:
  12444. this.vseqexpr(s.targets);
  12445. break;
  12446. case Assign:
  12447. var n = s.targets.length;
  12448. var val = this.vexpr(s.value);
  12449. for (var i = 0; i < n; ++i)
  12450. this.vexpr(s.targets[i], val);
  12451. break;
  12452. case AugAssign:
  12453. return this.caugassign(s);
  12454. case Print:
  12455. this.cprint(s);
  12456. break;
  12457. case For_:
  12458. return this.cfor(s);
  12459. case While_:
  12460. return this.cwhile(s);
  12461. case If_:
  12462. return this.cif(s);
  12463. case Raise:
  12464. return this.craise(s);
  12465. case Assert:
  12466. return this.cassert(s);
  12467. case Import_:
  12468. return this.cimport(s);
  12469. case ImportFrom:
  12470. return this.cfromimport(s);
  12471. case Global:
  12472. break;
  12473. case Expr:
  12474. this.vexpr(s.value);
  12475. break;
  12476. case Pass:
  12477. break;
  12478. case Break_:
  12479. if (this.u.breakBlocks.length === 0)
  12480. throw new SyntaxError("'break' outside loop");
  12481. this._jump(this.u.breakBlocks[this.u.breakBlocks.length - 1]);
  12482. break;
  12483. case Continue_:
  12484. this.ccontinue(s);
  12485. break;
  12486. default:
  12487. goog.asserts.fail("unhandled case in vstmt");
  12488. }
  12489. };
  12490. Compiler.prototype.vseqstmt = function(stmts)
  12491. {
  12492. for (var i = 0; i < stmts.length; ++i) this.vstmt(stmts[i]);
  12493. };
  12494. var OP_FAST = 0;
  12495. var OP_GLOBAL = 1;
  12496. var OP_DEREF = 2;
  12497. var OP_NAME = 3;
  12498. var D_NAMES = 0;
  12499. var D_FREEVARS = 1;
  12500. var D_CELLVARS = 2;
  12501. Compiler.prototype.isCell = function(name)
  12502. {
  12503. var mangled = mangleName(this.u.private_, name).v;
  12504. var scope = this.u.ste.getScope(mangled);
  12505. var dict = null;
  12506. if (scope === CELL)
  12507. return true;
  12508. return false;
  12509. };
  12510. /**
  12511. * @param {Sk.builtin.str} name
  12512. * @param {Object} ctx
  12513. * @param {string=} dataToStore
  12514. */
  12515. Compiler.prototype.nameop = function(name, ctx, dataToStore)
  12516. {
  12517. if ((ctx === Store || ctx === AugStore || ctx === Del) && name.v === "__debug__")
  12518. this.error("can not assign to __debug__");
  12519. if ((ctx === Store || ctx === AugStore || ctx === Del) && name.v === "None")
  12520. this.error("can not assign to None");
  12521. if (name.v === "None") return "null";
  12522. if (name.v === "True") return "true";
  12523. if (name.v === "False") return "false";
  12524. var mangled = mangleName(this.u.private_, name).v;
  12525. var op = 0;
  12526. var optype = OP_NAME;
  12527. var scope = this.u.ste.getScope(mangled);
  12528. var dict = null;
  12529. switch (scope)
  12530. {
  12531. case FREE:
  12532. dict = "$free";
  12533. optype = OP_DEREF;
  12534. break;
  12535. case CELL:
  12536. dict = "$cell";
  12537. optype = OP_DEREF;
  12538. break;
  12539. case LOCAL:
  12540. // can't do FAST in generators or at module/class scope
  12541. if (this.u.ste.blockType === FunctionBlock && !this.u.ste.generator)
  12542. optype = OP_FAST;
  12543. break;
  12544. case GLOBAL_IMPLICIT:
  12545. if (this.u.ste.blockType === FunctionBlock)
  12546. optype = OP_GLOBAL;
  12547. break;
  12548. case GLOBAL_EXPLICIT:
  12549. optype = OP_GLOBAL;
  12550. default:
  12551. break;
  12552. }
  12553. // have to do this after looking it up in the scope
  12554. mangled = fixReservedWords(mangled);
  12555. //print("mangled", mangled);
  12556. goog.asserts.assert(scope || name.v.charAt(1) === '_');
  12557. // in generator or at module scope, we need to store to $loc, rather that
  12558. // to actual JS stack variables.
  12559. var mangledNoPre = mangled;
  12560. if (this.u.ste.generator || this.u.ste.blockType !== FunctionBlock)
  12561. mangled = "$loc." + mangled;
  12562. else if (optype === OP_FAST || optype === OP_NAME)
  12563. this.u.localnames.push(mangled);
  12564. switch (optype)
  12565. {
  12566. case OP_FAST:
  12567. switch (ctx)
  12568. {
  12569. case Load:
  12570. case Param:
  12571. return mangled;
  12572. case Store:
  12573. out(mangled, "=", dataToStore, ";");
  12574. break;
  12575. case Del:
  12576. out("delete ", mangled, ";");
  12577. break;
  12578. default:
  12579. goog.asserts.fail("unhandled");
  12580. }
  12581. break;
  12582. case OP_NAME:
  12583. switch (ctx)
  12584. {
  12585. case Load:
  12586. var v = this.gensym('loadname');
  12587. // can't be || for loc.x = 0 or null
  12588. out("var ", v, "=", mangled, "!==undefined?",mangled,":Sk.misceval.loadname('",mangledNoPre,"',$gbl);");
  12589. return v;
  12590. case Store:
  12591. out(mangled, "=", dataToStore, ";");
  12592. break;
  12593. case Del:
  12594. out("delete ", mangled, ";");
  12595. break;
  12596. case Param:
  12597. return mangled;
  12598. default:
  12599. goog.asserts.fail("unhandled");
  12600. }
  12601. break;
  12602. case OP_GLOBAL:
  12603. switch (ctx)
  12604. {
  12605. case Load:
  12606. return this._gr("loadgbl", "Sk.misceval.loadname('", mangledNoPre, "',$gbl)");
  12607. case Store:
  12608. out("$gbl.", mangledNoPre, "=", dataToStore, ';');
  12609. break;
  12610. case Del:
  12611. out("delete $gbl.", mangledNoPre);
  12612. break;
  12613. default:
  12614. goog.asserts.fail("unhandled case in name op_global");
  12615. }
  12616. break;
  12617. case OP_DEREF:
  12618. switch (ctx)
  12619. {
  12620. case Load:
  12621. return dict + "." + mangledNoPre;
  12622. case Store:
  12623. out(dict, ".", mangledNoPre, "=", dataToStore, ";");
  12624. break;
  12625. case Param:
  12626. return mangledNoPre;
  12627. default:
  12628. goog.asserts.fail("unhandled case in name op_deref");
  12629. }
  12630. break;
  12631. default:
  12632. goog.asserts.fail("unhandled case");
  12633. }
  12634. };
  12635. Compiler.prototype.enterScope = function(name, key, lineno)
  12636. {
  12637. var u = new CompilerUnit();
  12638. u.ste = this.st.getStsForAst(key);
  12639. u.name = name;
  12640. u.firstlineno = lineno;
  12641. this.stack.push(this.u);
  12642. this.allUnits.push(u);
  12643. var scopeName = this.gensym('scope');
  12644. u.scopename = scopeName;
  12645. this.u = u;
  12646. this.u.activateScope();
  12647. this.nestlevel++;
  12648. return scopeName;
  12649. };
  12650. Compiler.prototype.exitScope = function()
  12651. {
  12652. var prev = this.u;
  12653. this.nestlevel--;
  12654. if (this.stack.length - 1 >= 0)
  12655. this.u = this.stack.pop();
  12656. else
  12657. this.u = null;
  12658. if (this.u)
  12659. this.u.activateScope();
  12660. if (prev.name.v !== "<module>") // todo; hacky
  12661. out(prev.scopename, ".co_name=new Sk.builtin.str(", prev.name.tp$repr().v, ");");
  12662. };
  12663. Compiler.prototype.cbody = function(stmts)
  12664. {
  12665. for (var i = 0; i < stmts.length; ++i)
  12666. this.vstmt(stmts[i]);
  12667. };
  12668. Compiler.prototype.cprint = function(s)
  12669. {
  12670. goog.asserts.assert(s instanceof Print);
  12671. var dest = 'null';
  12672. if (s.dest)
  12673. dest = this.vexpr(s.dest);
  12674. var n = s.values.length;
  12675. // todo; dest disabled
  12676. for (var i = 0; i < n; ++i)
  12677. out('Sk.misceval.print_(', /*dest, ',',*/ "new Sk.builtin.str(", this.vexpr(s.values[i]), ').v);');
  12678. if (s.nl)
  12679. out('Sk.misceval.print_(', /*dest, ',*/ '"\\n");');
  12680. };
  12681. Compiler.prototype.cmod = function(mod)
  12682. {
  12683. //print("-----");
  12684. //print(Sk.astDump(mod));
  12685. var modf = this.enterScope(new Sk.builtin.str("<module>"), mod, 0);
  12686. var entryBlock = this.newBlock('module entry');
  12687. this.u.prefixCode = "var " + modf + "=(function($modname){";
  12688. this.u.varDeclsCode = "var $blk=" + entryBlock + ",$gbl={},$loc=$gbl;$gbl.__name__=$modname;";
  12689. this.u.switchCode = "while(true){switch($blk){";
  12690. this.u.suffixCode = "}}});";
  12691. switch (mod.constructor)
  12692. {
  12693. case Module:
  12694. this.cbody(mod.body);
  12695. out("return $loc;");
  12696. break;
  12697. default:
  12698. goog.asserts.fail("todo; unhandled case in compilerMod");
  12699. }
  12700. this.exitScope();
  12701. this.result.push(this.outputAllUnits());
  12702. return modf;
  12703. };
  12704. /**
  12705. * @param {string} source the code
  12706. * @param {string} filename where it came from
  12707. * @param {string} mode one of 'exec', 'eval', or 'single'
  12708. */
  12709. Sk.compile = function(source, filename, mode)
  12710. {
  12711. //print("FILE:", filename);
  12712. var cst = Sk.parse(filename, source);
  12713. var ast = Sk.astFromParse(cst, filename);
  12714. var st = Sk.symboltable(ast, filename);
  12715. var c = new Compiler(filename, st, 0, source); // todo; CO_xxx
  12716. var funcname = c.cmod(ast);
  12717. var ret = c.result.join('');
  12718. return {
  12719. funcname: funcname,
  12720. code: ret
  12721. };
  12722. };
  12723. goog.exportSymbol("Sk.compile", Sk.compile);
  12724. // this is stored into sys specially, rather than created by sys
  12725. Sk.sysmodules = new Sk.builtin.dict([]);
  12726. /**
  12727. * @param {string} name to look for
  12728. * @param {string} ext extension to use (.py or .js)
  12729. * @param {boolean=} failok will throw if not true
  12730. */
  12731. Sk.importSearchPathForName = function(name, ext, failok)
  12732. {
  12733. var L = Sk.realsyspath;
  12734. for (var it = L.tp$iter(), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext())
  12735. {
  12736. var nameAsPath = name.replace(/\./g, "/");
  12737. var fns = [
  12738. i.v + "/" + nameAsPath + ext, // module
  12739. i.v + "/" + nameAsPath + "/__init__" + ext // package
  12740. ];
  12741. for (var j = 0; j < fns.length; ++j)
  12742. {
  12743. var fn = fns[j];
  12744. Sk.debugout(" import search, trying", fn);
  12745. try {
  12746. // todo; lame, this is the only way we have to test existence right now
  12747. Sk.read(fn);
  12748. //print("import search, found at", name, "type", ext, "at", fn);
  12749. return fn;
  12750. } catch (e) {};
  12751. }
  12752. }
  12753. if (!failok)
  12754. throw new Sk.builtin.ImportError("No module named " + name);
  12755. //print("import search, nothing found, but failure was ok");
  12756. };
  12757. Sk.loadClosureModule = function(name, filename)
  12758. {
  12759. var rawSrc = "goog.require('" + name + "');";
  12760. if (document !== undefined)
  12761. {
  12762. //goog.global.eval(rawSrc);
  12763. rawSrc = "";
  12764. }
  12765. // we can't just return the closure object as the locals dict because it
  12766. // gets assigned to inst$dict. When a submodule or subpackage is imported,
  12767. // it'll be assigned to the parent module under that name, which would
  12768. // overwrite itself. For example, if we returned the 'goog' object when
  12769. // importing goog (as it's an object that contains all the locals), then
  12770. // when we import goog.json, the goog.json-Sk.module would be assigned
  12771. // over top of goog.json (the JS object), which means that goog.json
  12772. // wouldn't be accessible from JS any more (only via tp$getattr). So, we
  12773. // do a shallow copy of the 'module' here to create a new object for the
  12774. // module's inst$dict.
  12775. var wrap = "\n" +
  12776. "var $closuremodule = function(name) { /*" + name + "*/" +
  12777. "var $loc = {};\n" +
  12778. "for (var nat in " + name + "){" +
  12779. "$loc[nat] = " + name + "[nat];\n" +
  12780. "if(typeof $loc[nat] === 'function'){\n" +
  12781. "$loc[nat].$isnative=true;\n" +
  12782. "}}" +
  12783. "return $loc;\n" +
  12784. "};";
  12785. print(wrap);
  12786. return { funcname: "$closuremodule", code: rawSrc + wrap };
  12787. };
  12788. if (COMPILED)
  12789. {
  12790. var print = function(x) {};
  12791. var js_beautify = function(x) {};
  12792. }
  12793. Sk.doOneTimeInitialization = function()
  12794. {
  12795. // can't fill these out when making the type because tuple/dict aren't
  12796. // defined yet.
  12797. Sk.builtin.type.basesStr_ = new Sk.builtin.str("__bases__");
  12798. Sk.builtin.type.mroStr_ = new Sk.builtin.str("__mro__");
  12799. Sk.builtin.object.inst$dict = new Sk.builtin.dict([]);
  12800. Sk.builtin.object.inst$dict.mp$ass_subscript(Sk.builtin.type.basesStr_, new Sk.builtin.tuple([]));
  12801. Sk.builtin.object.inst$dict.mp$ass_subscript(Sk.builtin.type.mroStr_, new Sk.builtin.tuple([Sk.builtin.object]));
  12802. };
  12803. /**
  12804. * currently only pull once from Sk.syspath. User might want to change
  12805. * from js or from py.
  12806. */
  12807. Sk.importSetUpPath = function()
  12808. {
  12809. if (!Sk.realsyspath)
  12810. {
  12811. var paths = [
  12812. new Sk.builtin.str("src/builtin"),
  12813. new Sk.builtin.str("src/lib"),
  12814. new Sk.builtin.str(".")
  12815. ];
  12816. for (var i = 0; i < Sk.syspath.length; ++i)
  12817. paths.push(new Sk.builtin.str(Sk.syspath[i]));
  12818. Sk.realsyspath = new Sk.builtin.list(paths);
  12819. Sk.doOneTimeInitialization();
  12820. }
  12821. };
  12822. /**
  12823. * @param {string} name name of module to import
  12824. * @param {boolean=} dumpJS whether to output the generated js code
  12825. * @param {string=} modname what to call the module after it's imported if
  12826. * it's to be renamed (i.e. __main__)
  12827. * @param {string=} suppliedPyBody use as the body of the text for the module
  12828. * rather than Sk.read'ing it.
  12829. */
  12830. Sk.importModuleInternal_ = function(name, dumpJS, modname, suppliedPyBody)
  12831. {
  12832. //dumpJS = true;
  12833. Sk.importSetUpPath();
  12834. // if no module name override, supplied, use default name
  12835. if (modname === undefined) modname = name;
  12836. var toReturn = null;
  12837. var modNameSplit = modname.split(".");
  12838. var parentModName;
  12839. // if leaf is already in sys.modules, early out
  12840. var prev = Sk.sysmodules.mp$subscript(modname);
  12841. if (prev !== undefined)
  12842. {
  12843. // if we're a dotted module, return the top level, otherwise ourselves
  12844. if (modNameSplit.length > 1)
  12845. return Sk.sysmodules.mp$subscript(modNameSplit[0]);
  12846. else
  12847. return prev;
  12848. }
  12849. if (modNameSplit.length > 1)
  12850. {
  12851. // if we're a module inside a package (i.e. a.b.c), then we'll need to return the
  12852. // top-level package ('a'). recurse upwards on our parent, importing
  12853. // all parent packages. so, here we're importing 'a.b', which will in
  12854. // turn import 'a', and then return 'a' eventually.
  12855. parentModName = modNameSplit.slice(0, modNameSplit.length - 1).join(".");
  12856. toReturn = Sk.importModuleInternal_(parentModName, dumpJS);
  12857. }
  12858. // otherwise:
  12859. // - create module object
  12860. // - add module object to sys.modules
  12861. // - compile source to (function(){...});
  12862. // - run module and set the module locals returned to the module __dict__
  12863. var module = new Sk.builtin.module();
  12864. Sk.sysmodules.mp$ass_subscript(name, module);
  12865. var filename, co, googClosure;
  12866. if (suppliedPyBody)
  12867. {
  12868. filename = name + ".py";
  12869. co = Sk.compile(suppliedPyBody, filename, "exec");
  12870. }
  12871. else
  12872. {
  12873. // if we have it as a builtin (i.e. already in JS) module then load that.
  12874. var builtinfn = Sk.importSearchPathForName(name, ".js", true);
  12875. if (builtinfn)
  12876. {
  12877. filename = builtinfn;
  12878. co = { funcname: "$builtinmodule", code: Sk.read(filename) };
  12879. }
  12880. else
  12881. {
  12882. filename = Sk.importSearchPathForName(name, ".py");
  12883. co = Sk.compile(Sk.read(filename), filename, "exec");
  12884. }
  12885. }
  12886. module.$js = co.code; // todo; only in DEBUG?
  12887. var finalcode = co.code;
  12888. if (!COMPILED)
  12889. {
  12890. if (dumpJS)
  12891. {
  12892. print("-----");
  12893. var withLineNumbers = function(code)
  12894. {
  12895. var beaut = js_beautify(co.code);
  12896. var lines = beaut.split("\n");
  12897. for (var i = 1; i <= lines.length; ++i)
  12898. {
  12899. var width = ("" + i).length;
  12900. var pad = "";
  12901. for (var j = width; j < 5; ++j) pad += " ";
  12902. lines[i - 1] = "/* " + pad + i + " */ " + lines[i - 1];
  12903. }
  12904. return lines.join("\n");
  12905. };
  12906. finalcode = withLineNumbers(co.code);
  12907. print(finalcode);
  12908. }
  12909. }
  12910. var namestr = "new Sk.builtin.str('" + modname + "')";
  12911. finalcode += "\n" + co.funcname + "(" + namestr + ");";
  12912. var modlocs = goog.global.eval(finalcode);
  12913. // pass in __name__ so the module can set it (so that the code can access
  12914. // it), but also set it after we're done so that builtins don't have to
  12915. // remember to do it.
  12916. if (!modlocs.__name__)
  12917. modlocs.__name__ = new Sk.builtin.str(modname);
  12918. module.inst$dict = modlocs;
  12919. if (toReturn)
  12920. {
  12921. // if we were a dotted name, then we want to return the top-most
  12922. // package. we store ourselves into our parent as an attribute
  12923. var parentModule = Sk.sysmodules.mp$subscript(parentModName);
  12924. parentModule.tp$setattr(modNameSplit[modNameSplit.length - 1], module);
  12925. //print("import returning parent module, modname", modname, "__name__", toReturn.tp$getattr("__name__").v);
  12926. return toReturn;
  12927. }
  12928. //print("name", name, "modname", modname, "returning leaf");
  12929. // otherwise we return the actual module that we just imported
  12930. return module;
  12931. };
  12932. /**
  12933. * @param {string} name the module name
  12934. * @param {boolean=} dumpJS print out the js code after compilation for debugging
  12935. */
  12936. Sk.importModule = function(name, dumpJS)
  12937. {
  12938. return Sk.importModuleInternal_(name, dumpJS);
  12939. };
  12940. Sk.importMain = function(name, dumpJS)
  12941. {
  12942. return Sk.importModuleInternal_(name, dumpJS, "__main__");
  12943. };
  12944. Sk.importMainWithBody = function(name, dumpJS, body)
  12945. {
  12946. return Sk.importModuleInternal_(name, dumpJS, "__main__", body);
  12947. };
  12948. Sk.builtin.__import__ = function(name, globals, locals, fromlist)
  12949. {
  12950. var ret = Sk.importModuleInternal_(name);
  12951. if (!fromlist || fromlist.length === 0)
  12952. return ret;
  12953. // if there's a fromlist we want to return the actual module, not the
  12954. // toplevel namespace
  12955. ret = Sk.sysmodules.mp$subscript(name);
  12956. goog.asserts.assert(ret);
  12957. return ret;
  12958. };
  12959. goog.exportSymbol("Sk.importMain", Sk.importMain);
  12960. /*jslint onevar: false, plusplus: false */
  12961. /*
  12962. JS Beautifier
  12963. ---------------
  12964. Written by Einar Lielmanis, <einar@jsbeautifier.org>
  12965. http://jsbeautifier.org/
  12966. Originally converted to javascript by Vital, <vital76@gmail.com>
  12967. You are free to use this in any way you want, in case you find this useful or working for you.
  12968. Usage:
  12969. js_beautify(js_source_text);
  12970. js_beautify(js_source_text, options);
  12971. The options are:
  12972. indent_size (default 4) — indentation size,
  12973. indent_char (default space) — character to indent with,
  12974. preserve_newlines (default true) — whether existing line breaks should be preserved,
  12975. indent_level (default 0) — initial indentation level, you probably won't need this ever,
  12976. space_after_anon_function (default false) — if true, then space is added between "function ()"
  12977. (jslint is happy about this); if false, then the common "function()" output is used.
  12978. braces_on_own_line (default false) - ANSI / Allman brace style, each opening/closing brace gets its own line.
  12979. e.g
  12980. js_beautify(js_source_text, {indent_size: 1, indent_char: '\t'});
  12981. */
  12982. function js_beautify(js_source_text, options) {
  12983. var input, output, token_text, last_type, last_text, last_last_text, last_word, flags, flag_store, indent_string;
  12984. var whitespace, wordchar, punct, parser_pos, line_starters, digits;
  12985. var prefix, token_type, do_block_just_closed;
  12986. var wanted_newline, just_added_newline, n_newlines;
  12987. // Some interpreters have unexpected results with foo = baz || bar;
  12988. options = options ? options : {};
  12989. var opt_braces_on_own_line = options.braces_on_own_line ? options.braces_on_own_line : false;
  12990. var opt_indent_size = options.indent_size ? options.indent_size : 4;
  12991. var opt_indent_char = options.indent_char ? options.indent_char : ' ';
  12992. var opt_preserve_newlines = typeof options.preserve_newlines === 'undefined' ? true : options.preserve_newlines;
  12993. var opt_indent_level = options.indent_level ? options.indent_level : 0; // starting indentation
  12994. var opt_space_after_anon_function = options.space_after_anon_function === 'undefined' ? false : options.space_after_anon_function;
  12995. var opt_keep_array_indentation = typeof options.keep_array_indentation === 'undefined' ? true : options.keep_array_indentation;
  12996. just_added_newline = false;
  12997. // cache the source's length.
  12998. var input_length = js_source_text.length;
  12999. function trim_output() {
  13000. while (output.length && (output[output.length - 1] === ' ' || output[output.length - 1] === indent_string)) {
  13001. output.pop();
  13002. }
  13003. }
  13004. function is_array(mode) {
  13005. return mode === '[EXPRESSION]' || mode === '[INDENTED-EXPRESSION]';
  13006. }
  13007. function print_newline(ignore_repeated) {
  13008. flags.eat_next_space = false;
  13009. if (opt_keep_array_indentation && is_array(flags.mode)) {
  13010. return;
  13011. }
  13012. ignore_repeated = typeof ignore_repeated === 'undefined' ? true : ignore_repeated;
  13013. flags.if_line = false;
  13014. trim_output();
  13015. if (!output.length) {
  13016. return; // no newline on start of file
  13017. }
  13018. if (output[output.length - 1] !== "\n" || !ignore_repeated) {
  13019. just_added_newline = true;
  13020. output.push("\n");
  13021. }
  13022. for (var i = 0; i < flags.indentation_level; i += 1) {
  13023. output.push(indent_string);
  13024. }
  13025. if (flags.var_line && flags.var_line_reindented) {
  13026. if (opt_indent_char === ' ') {
  13027. output.push(' '); // var_line always pushes 4 spaces, so that the variables would be one under another
  13028. } else {
  13029. output.push(indent_string); // skip space-stuffing, if indenting with a tab
  13030. }
  13031. }
  13032. }
  13033. function print_single_space() {
  13034. if (flags.eat_next_space) {
  13035. flags.eat_next_space = false;
  13036. return;
  13037. }
  13038. var last_output = ' ';
  13039. if (output.length) {
  13040. last_output = output[output.length - 1];
  13041. }
  13042. if (last_output !== ' ' && last_output !== '\n' && last_output !== indent_string) { // prevent occassional duplicate space
  13043. output.push(' ');
  13044. }
  13045. }
  13046. function print_token() {
  13047. just_added_newline = false;
  13048. flags.eat_next_space = false;
  13049. output.push(token_text);
  13050. }
  13051. function indent() {
  13052. flags.indentation_level += 1;
  13053. }
  13054. function remove_indent() {
  13055. if (output.length && output[output.length - 1] === indent_string) {
  13056. output.pop();
  13057. }
  13058. }
  13059. function set_mode(mode) {
  13060. if (flags) {
  13061. flag_store.push(flags);
  13062. }
  13063. flags = {
  13064. previous_mode: flags ? flags.mode : 'BLOCK',
  13065. mode: mode,
  13066. var_line: false,
  13067. var_line_tainted: false,
  13068. var_line_reindented: false,
  13069. in_html_comment: false,
  13070. if_line: false,
  13071. in_case: false,
  13072. eat_next_space: false,
  13073. indentation_baseline: -1,
  13074. indentation_level: (flags ? flags.indentation_level + ((flags.var_line && flags.var_line_reindented) ? 1 : 0) : opt_indent_level)
  13075. };
  13076. }
  13077. function is_array(mode) {
  13078. return mode === '[EXPRESSION]' || mode === '[INDENTED-EXPRESSION]';
  13079. }
  13080. function is_expression(mode) {
  13081. return mode === '[EXPRESSION]' || mode === '[INDENTED-EXPRESSION]' || mode === '(EXPRESSION)';
  13082. }
  13083. function restore_mode() {
  13084. do_block_just_closed = flags.mode === 'DO_BLOCK';
  13085. if (flag_store.length > 0) {
  13086. flags = flag_store.pop();
  13087. }
  13088. }
  13089. function in_array(what, arr) {
  13090. for (var i = 0; i < arr.length; i += 1) {
  13091. if (arr[i] === what) {
  13092. return true;
  13093. }
  13094. }
  13095. return false;
  13096. }
  13097. // Walk backwards from the colon to find a '?' (colon is part of a ternary op)
  13098. // or a '{' (colon is part of a class literal). Along the way, keep track of
  13099. // the blocks and expressions we pass so we only trigger on those chars in our
  13100. // own level, and keep track of the colons so we only trigger on the matching '?'.
  13101. function is_ternary_op() {
  13102. var level = 0,
  13103. colon_count = 0;
  13104. for (var i = output.length - 1; i >= 0; i--) {
  13105. switch (output[i]) {
  13106. case ':':
  13107. if (level === 0) {
  13108. colon_count++;
  13109. }
  13110. break;
  13111. case '?':
  13112. if (level === 0) {
  13113. if (colon_count === 0) {
  13114. return true;
  13115. } else {
  13116. colon_count--;
  13117. }
  13118. }
  13119. break;
  13120. case '{':
  13121. if (level === 0) {
  13122. return false;
  13123. }
  13124. level--;
  13125. break;
  13126. case '(':
  13127. case '[':
  13128. level--;
  13129. break;
  13130. case ')':
  13131. case ']':
  13132. case '}':
  13133. level++;
  13134. break;
  13135. }
  13136. }
  13137. }
  13138. function get_next_token() {
  13139. n_newlines = 0;
  13140. if (parser_pos >= input_length) {
  13141. return ['', 'TK_EOF'];
  13142. }
  13143. wanted_newline = false;
  13144. var c = input.charAt(parser_pos);
  13145. parser_pos += 1;
  13146. var keep_whitespace = opt_keep_array_indentation && is_array(flags.mode);
  13147. if (keep_whitespace) {
  13148. //
  13149. // slight mess to allow nice preservation of array indentation and reindent that correctly
  13150. // first time when we get to the arrays:
  13151. // var a = [
  13152. // ....'something'
  13153. // we make note of whitespace_count = 4 into flags.indentation_baseline
  13154. // so we know that 4 whitespaces in original source match indent_level of reindented source
  13155. //
  13156. // and afterwards, when we get to
  13157. // 'something,
  13158. // .......'something else'
  13159. // we know that this should be indented to indent_level + (7 - indentation_baseline) spaces
  13160. //
  13161. var whitespace_count = 0;
  13162. while (in_array(c, whitespace)) {
  13163. if (c === "\n") {
  13164. trim_output();
  13165. output.push("\n");
  13166. just_added_newline = true;
  13167. whitespace_count = 0;
  13168. } else {
  13169. if (c === '\t') {
  13170. whitespace_count += 4;
  13171. } else {
  13172. whitespace_count += 1;
  13173. }
  13174. }
  13175. if (parser_pos >= input_length) {
  13176. return ['', 'TK_EOF'];
  13177. }
  13178. c = input.charAt(parser_pos);
  13179. parser_pos += 1;
  13180. }
  13181. if (flags.indentation_baseline === -1) {
  13182. flags.indentation_baseline = whitespace_count;
  13183. }
  13184. if (just_added_newline) {
  13185. var i;
  13186. for (i = 0; i < flags.indentation_level + 1; i += 1) {
  13187. output.push(indent_string);
  13188. }
  13189. if (flags.indentation_baseline !== -1) {
  13190. for (i = 0; i < whitespace_count - flags.indentation_baseline; i++) {
  13191. output.push(' ');
  13192. }
  13193. }
  13194. }
  13195. } else {
  13196. while (in_array(c, whitespace)) {
  13197. if (c === "\n") {
  13198. n_newlines += 1;
  13199. }
  13200. if (parser_pos >= input_length) {
  13201. return ['', 'TK_EOF'];
  13202. }
  13203. c = input.charAt(parser_pos);
  13204. parser_pos += 1;
  13205. }
  13206. if (opt_preserve_newlines) {
  13207. if (n_newlines > 1) {
  13208. for (i = 0; i < n_newlines; i += 1) {
  13209. print_newline(i === 0);
  13210. just_added_newline = true;
  13211. }
  13212. }
  13213. }
  13214. wanted_newline = n_newlines > 0;
  13215. }
  13216. if (in_array(c, wordchar)) {
  13217. if (parser_pos < input_length) {
  13218. while (in_array(input.charAt(parser_pos), wordchar)) {
  13219. c += input.charAt(parser_pos);
  13220. parser_pos += 1;
  13221. if (parser_pos === input_length) {
  13222. break;
  13223. }
  13224. }
  13225. }
  13226. // small and surprisingly unugly hack for 1E-10 representation
  13227. if (parser_pos !== input_length && c.match(/^[0-9]+[Ee]$/) && (input.charAt(parser_pos) === '-' || input.charAt(parser_pos) === '+')) {
  13228. var sign = input.charAt(parser_pos);
  13229. parser_pos += 1;
  13230. var t = get_next_token(parser_pos);
  13231. c += sign + t[0];
  13232. return [c, 'TK_WORD'];
  13233. }
  13234. if (c === 'in') { // hack for 'in' operator
  13235. return [c, 'TK_OPERATOR'];
  13236. }
  13237. if (wanted_newline && last_type !== 'TK_OPERATOR' && !flags.if_line && (opt_preserve_newlines || last_text !== 'var')) {
  13238. print_newline();
  13239. }
  13240. return [c, 'TK_WORD'];
  13241. }
  13242. if (c === '(' || c === '[') {
  13243. return [c, 'TK_START_EXPR'];
  13244. }
  13245. if (c === ')' || c === ']') {
  13246. return [c, 'TK_END_EXPR'];
  13247. }
  13248. if (c === '{') {
  13249. return [c, 'TK_START_BLOCK'];
  13250. }
  13251. if (c === '}') {
  13252. return [c, 'TK_END_BLOCK'];
  13253. }
  13254. if (c === ';') {
  13255. return [c, 'TK_SEMICOLON'];
  13256. }
  13257. if (c === '/') {
  13258. var comment = '';
  13259. // peek for comment /* ... */
  13260. var inline_comment = true;
  13261. if (input.charAt(parser_pos) === '*') {
  13262. parser_pos += 1;
  13263. if (parser_pos < input_length) {
  13264. while (! (input.charAt(parser_pos) === '*' && input.charAt(parser_pos + 1) && input.charAt(parser_pos + 1) === '/') && parser_pos < input_length) {
  13265. c = input.charAt(parser_pos);
  13266. comment += c;
  13267. if (c === '\x0d' || c === '\x0a') {
  13268. inline_comment = false;
  13269. }
  13270. parser_pos += 1;
  13271. if (parser_pos >= input_length) {
  13272. break;
  13273. }
  13274. }
  13275. }
  13276. parser_pos += 2;
  13277. if (inline_comment) {
  13278. return ['/*' + comment + '*/', 'TK_INLINE_COMMENT'];
  13279. } else {
  13280. return ['/*' + comment + '*/', 'TK_BLOCK_COMMENT'];
  13281. }
  13282. }
  13283. // peek for comment // ...
  13284. if (input.charAt(parser_pos) === '/') {
  13285. comment = c;
  13286. while (input.charAt(parser_pos) !== "\x0d" && input.charAt(parser_pos) !== "\x0a") {
  13287. comment += input.charAt(parser_pos);
  13288. parser_pos += 1;
  13289. if (parser_pos >= input_length) {
  13290. break;
  13291. }
  13292. }
  13293. parser_pos += 1;
  13294. if (wanted_newline) {
  13295. print_newline();
  13296. }
  13297. return [comment, 'TK_COMMENT'];
  13298. }
  13299. }
  13300. if (c === "'" || // string
  13301. c === '"' || // string
  13302. (c === '/' && ((last_type === 'TK_WORD' && in_array(last_text, ['return', 'do'])) || (last_type === 'TK_START_EXPR' || last_type === 'TK_START_BLOCK' || last_type === 'TK_END_BLOCK' || last_type === 'TK_OPERATOR' || last_type === 'TK_EQUALS' || last_type === 'TK_EOF' || last_type === 'TK_SEMICOLON')))) { // regexp
  13303. var sep = c;
  13304. var esc = false;
  13305. var resulting_string = c;
  13306. if (parser_pos < input_length) {
  13307. if (sep === '/') {
  13308. //
  13309. // handle regexp separately...
  13310. //
  13311. var in_char_class = false;
  13312. while (esc || in_char_class || input.charAt(parser_pos) !== sep) {
  13313. resulting_string += input.charAt(parser_pos);
  13314. if (!esc) {
  13315. esc = input.charAt(parser_pos) === '\\';
  13316. if (input.charAt(parser_pos) === '[') {
  13317. in_char_class = true;
  13318. } else if (input.charAt(parser_pos) === ']') {
  13319. in_char_class = false;
  13320. }
  13321. } else {
  13322. esc = false;
  13323. }
  13324. parser_pos += 1;
  13325. if (parser_pos >= input_length) {
  13326. // incomplete string/rexp when end-of-file reached.
  13327. // bail out with what had been received so far.
  13328. return [resulting_string, 'TK_STRING'];
  13329. }
  13330. }
  13331. } else {
  13332. //
  13333. // and handle string also separately
  13334. //
  13335. while (esc || input.charAt(parser_pos) !== sep) {
  13336. resulting_string += input.charAt(parser_pos);
  13337. if (!esc) {
  13338. esc = input.charAt(parser_pos) === '\\';
  13339. } else {
  13340. esc = false;
  13341. }
  13342. parser_pos += 1;
  13343. if (parser_pos >= input_length) {
  13344. // incomplete string/rexp when end-of-file reached.
  13345. // bail out with what had been received so far.
  13346. return [resulting_string, 'TK_STRING'];
  13347. }
  13348. }
  13349. }
  13350. }
  13351. parser_pos += 1;
  13352. resulting_string += sep;
  13353. if (sep === '/') {
  13354. // regexps may have modifiers /regexp/MOD , so fetch those, too
  13355. while (parser_pos < input_length && in_array(input.charAt(parser_pos), wordchar)) {
  13356. resulting_string += input.charAt(parser_pos);
  13357. parser_pos += 1;
  13358. }
  13359. }
  13360. return [resulting_string, 'TK_STRING'];
  13361. }
  13362. if (c === '#') {
  13363. // Spidermonkey-specific sharp variables for circular references
  13364. // https://developer.mozilla.org/En/Sharp_variables_in_JavaScript
  13365. // http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp around line 1935
  13366. var sharp = '#';
  13367. if (parser_pos < input_length && in_array(input.charAt(parser_pos), digits)) {
  13368. do {
  13369. c = input.charAt(parser_pos);
  13370. sharp += c;
  13371. parser_pos += 1;
  13372. } while (parser_pos < input_length && c !== '#' && c !== '=');
  13373. if (c === '#') {
  13374. //
  13375. } else if (input.charAt(parser_pos) === '[' && input.charAt(parser_pos + 1) === ']') {
  13376. sharp += '[]';
  13377. parser_pos += 2;
  13378. } else if (input.charAt(parser_pos) === '{' && input.charAt(parser_pos + 1) === '}') {
  13379. sharp += '{}';
  13380. parser_pos += 2;
  13381. }
  13382. return [sharp, 'TK_WORD'];
  13383. }
  13384. }
  13385. if (c === '<' && input.substring(parser_pos - 1, parser_pos + 3) === '<!--') {
  13386. parser_pos += 3;
  13387. flags.in_html_comment = true;
  13388. return ['<!--', 'TK_COMMENT'];
  13389. }
  13390. if (c === '-' && flags.in_html_comment && input.substring(parser_pos - 1, parser_pos + 2) === '-->') {
  13391. flags.in_html_comment = false;
  13392. parser_pos += 2;
  13393. if (wanted_newline) {
  13394. print_newline();
  13395. }
  13396. return ['-->', 'TK_COMMENT'];
  13397. }
  13398. if (in_array(c, punct)) {
  13399. while (parser_pos < input_length && in_array(c + input.charAt(parser_pos), punct)) {
  13400. c += input.charAt(parser_pos);
  13401. parser_pos += 1;
  13402. if (parser_pos >= input_length) {
  13403. break;
  13404. }
  13405. }
  13406. if (c === '=') {
  13407. return [c, 'TK_EQUALS'];
  13408. } else {
  13409. return [c, 'TK_OPERATOR'];
  13410. }
  13411. }
  13412. return [c, 'TK_UNKNOWN'];
  13413. }
  13414. //----------------------------------
  13415. indent_string = '';
  13416. while (opt_indent_size > 0) {
  13417. indent_string += opt_indent_char;
  13418. opt_indent_size -= 1;
  13419. }
  13420. input = js_source_text;
  13421. last_word = ''; // last 'TK_WORD' passed
  13422. last_type = 'TK_START_EXPR'; // last token type
  13423. last_text = ''; // last token text
  13424. last_last_text = ''; // pre-last token text
  13425. output = [];
  13426. do_block_just_closed = false;
  13427. whitespace = "\n\r\t ".split('');
  13428. wordchar = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$'.split('');
  13429. digits = '0123456789'.split('');
  13430. punct = '+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! !! , : ? ^ ^= |= ::'.split(' ');
  13431. // words which should always start on new line.
  13432. line_starters = 'continue,try,throw,return,var,if,switch,case,default,for,while,break,function'.split(',');
  13433. // states showing if we are currently in expression (i.e. "if" case) - 'EXPRESSION', or in usual block (like, procedure), 'BLOCK'.
  13434. // some formatting depends on that.
  13435. flag_store = [];
  13436. set_mode('BLOCK');
  13437. parser_pos = 0;
  13438. while (true) {
  13439. var t = get_next_token(parser_pos);
  13440. token_text = t[0];
  13441. token_type = t[1];
  13442. if (token_type === 'TK_EOF') {
  13443. break;
  13444. }
  13445. switch (token_type) {
  13446. case 'TK_START_EXPR':
  13447. if (token_text === '[') {
  13448. if (last_type === 'TK_WORD' || last_text === ')') {
  13449. // this is array index specifier, break immediately
  13450. // a[x], fn()[x]
  13451. if (in_array(last_text, line_starters)) {
  13452. print_single_space();
  13453. }
  13454. set_mode('(EXPRESSION)');
  13455. print_token();
  13456. break;
  13457. }
  13458. if (flags.mode === '[EXPRESSION]' || flags.mode === '[INDENTED-EXPRESSION]') {
  13459. if (last_last_text === ']' && last_text === ',') {
  13460. // ], [ goes to new line
  13461. if (flags.mode === '[EXPRESSION]') {
  13462. flags.mode = '[INDENTED-EXPRESSION]';
  13463. if (!opt_keep_array_indentation) {
  13464. indent();
  13465. }
  13466. }
  13467. set_mode('[EXPRESSION]');
  13468. if (!opt_keep_array_indentation) {
  13469. print_newline();
  13470. }
  13471. } else if (last_text === '[') {
  13472. if (flags.mode === '[EXPRESSION]') {
  13473. flags.mode = '[INDENTED-EXPRESSION]';
  13474. if (!opt_keep_array_indentation) {
  13475. indent();
  13476. }
  13477. }
  13478. set_mode('[EXPRESSION]');
  13479. if (!opt_keep_array_indentation) {
  13480. print_newline();
  13481. }
  13482. } else {
  13483. set_mode('[EXPRESSION]');
  13484. }
  13485. } else {
  13486. set_mode('[EXPRESSION]');
  13487. }
  13488. } else {
  13489. set_mode('(EXPRESSION)');
  13490. }
  13491. if (last_text === ';' || last_type === 'TK_START_BLOCK') {
  13492. print_newline();
  13493. } else if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || last_text === '.') {
  13494. // do nothing on (( and )( and ][ and ]( and .(
  13495. } else if (last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') {
  13496. print_single_space();
  13497. } else if (last_word === 'function') {
  13498. // function() vs function ()
  13499. if (opt_space_after_anon_function) {
  13500. print_single_space();
  13501. }
  13502. } else if (in_array(last_text, line_starters) || last_text === 'catch') {
  13503. print_single_space();
  13504. }
  13505. print_token();
  13506. break;
  13507. case 'TK_END_EXPR':
  13508. if (token_text === ']') {
  13509. if (opt_keep_array_indentation) {
  13510. if (last_text === '}') {
  13511. // trim_output();
  13512. // print_newline(true);
  13513. remove_indent();
  13514. print_token();
  13515. restore_mode();
  13516. break;
  13517. }
  13518. } else {
  13519. if (flags.mode === '[INDENTED-EXPRESSION]') {
  13520. if (last_text === ']') {
  13521. restore_mode();
  13522. print_newline();
  13523. print_token();
  13524. break;
  13525. }
  13526. }
  13527. }
  13528. }
  13529. restore_mode();
  13530. print_token();
  13531. break;
  13532. case 'TK_START_BLOCK':
  13533. if (last_word === 'do') {
  13534. set_mode('DO_BLOCK');
  13535. } else {
  13536. set_mode('BLOCK');
  13537. }
  13538. if (opt_braces_on_own_line) {
  13539. if (last_type !== 'TK_OPERATOR') {
  13540. if (last_text == 'return') {
  13541. print_single_space();
  13542. } else {
  13543. print_newline(true);
  13544. }
  13545. }
  13546. print_token();
  13547. indent();
  13548. } else {
  13549. if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') {
  13550. if (last_type === 'TK_START_BLOCK') {
  13551. print_newline();
  13552. } else {
  13553. print_single_space();
  13554. }
  13555. } else {
  13556. // if TK_OPERATOR or TK_START_EXPR
  13557. if (is_array(flags.previous_mode) && last_text === ',') {
  13558. print_newline(); // [a, b, c, {
  13559. }
  13560. }
  13561. indent();
  13562. print_token();
  13563. }
  13564. break;
  13565. case 'TK_END_BLOCK':
  13566. restore_mode();
  13567. if (opt_braces_on_own_line) {
  13568. print_newline();
  13569. print_token();
  13570. } else {
  13571. if (last_type === 'TK_START_BLOCK') {
  13572. // nothing
  13573. if (just_added_newline) {
  13574. remove_indent();
  13575. } else {
  13576. // {}
  13577. trim_output();
  13578. }
  13579. } else {
  13580. print_newline();
  13581. }
  13582. print_token();
  13583. }
  13584. break;
  13585. case 'TK_WORD':
  13586. // no, it's not you. even I have problems understanding how this works
  13587. // and what does what.
  13588. if (do_block_just_closed) {
  13589. // do {} ## while ()
  13590. print_single_space();
  13591. print_token();
  13592. print_single_space();
  13593. do_block_just_closed = false;
  13594. break;
  13595. }
  13596. if (token_text === 'function') {
  13597. if ((just_added_newline || last_text === ';') && last_text !== '{') {
  13598. // make sure there is a nice clean space of at least one blank line
  13599. // before a new function definition
  13600. n_newlines = just_added_newline ? n_newlines : 0;
  13601. for (var i = 0; i < 2 - n_newlines; i++) {
  13602. print_newline(false);
  13603. }
  13604. }
  13605. }
  13606. if (token_text === 'case' || token_text === 'default') {
  13607. if (last_text === ':') {
  13608. // switch cases following one another
  13609. remove_indent();
  13610. } else {
  13611. // case statement starts in the same line where switch
  13612. flags.indentation_level--;
  13613. print_newline();
  13614. flags.indentation_level++;
  13615. }
  13616. print_token();
  13617. flags.in_case = true;
  13618. break;
  13619. }
  13620. prefix = 'NONE';
  13621. if (last_type === 'TK_END_BLOCK') {
  13622. if (!in_array(token_text.toLowerCase(), ['else', 'catch', 'finally'])) {
  13623. prefix = 'NEWLINE';
  13624. } else {
  13625. if (opt_braces_on_own_line) {
  13626. prefix = 'NEWLINE';
  13627. } else {
  13628. prefix = 'SPACE';
  13629. print_single_space();
  13630. }
  13631. }
  13632. } else if (last_type === 'TK_SEMICOLON' && (flags.mode === 'BLOCK' || flags.mode === 'DO_BLOCK')) {
  13633. prefix = 'NEWLINE';
  13634. } else if (last_type === 'TK_SEMICOLON' && is_expression(flags.mode)) {
  13635. prefix = 'SPACE';
  13636. } else if (last_type === 'TK_STRING') {
  13637. prefix = 'NEWLINE';
  13638. } else if (last_type === 'TK_WORD') {
  13639. prefix = 'SPACE';
  13640. } else if (last_type === 'TK_START_BLOCK') {
  13641. prefix = 'NEWLINE';
  13642. } else if (last_type === 'TK_END_EXPR') {
  13643. print_single_space();
  13644. prefix = 'NEWLINE';
  13645. }
  13646. if (last_type !== 'TK_END_BLOCK' && in_array(token_text.toLowerCase(), ['else', 'catch', 'finally'])) {
  13647. print_newline();
  13648. } else if (in_array(token_text, line_starters) || prefix === 'NEWLINE') {
  13649. if (last_text === 'else') {
  13650. // no need to force newline on else break
  13651. print_single_space();
  13652. } else if ((last_type === 'TK_START_EXPR' || last_text === '=' || last_text === ',') && token_text === 'function') {
  13653. // no need to force newline on 'function': (function
  13654. // DONOTHING
  13655. } else if (last_text === 'return' || last_text === 'throw') {
  13656. // no newline between 'return nnn'
  13657. print_single_space();
  13658. } else if (last_type !== 'TK_END_EXPR') {
  13659. if ((last_type !== 'TK_START_EXPR' || token_text !== 'var') && last_text !== ':') {
  13660. // no need to force newline on 'var': for (var x = 0...)
  13661. if (token_text === 'if' && last_word === 'else' && last_text !== '{') {
  13662. // no newline for } else if {
  13663. print_single_space();
  13664. } else {
  13665. print_newline();
  13666. }
  13667. }
  13668. } else {
  13669. if (in_array(token_text, line_starters) && last_text !== ')') {
  13670. print_newline();
  13671. }
  13672. }
  13673. } else if (is_array(flags.mode) && last_text === ',' && last_last_text === '}') {
  13674. print_newline(); // }, in lists get a newline treatment
  13675. } else if (prefix === 'SPACE') {
  13676. print_single_space();
  13677. }
  13678. print_token();
  13679. last_word = token_text;
  13680. if (token_text === 'var') {
  13681. flags.var_line = true;
  13682. flags.var_line_reindented = false;
  13683. flags.var_line_tainted = false;
  13684. }
  13685. if (token_text === 'if' || token_text === 'else') {
  13686. flags.if_line = true;
  13687. }
  13688. break;
  13689. case 'TK_SEMICOLON':
  13690. print_token();
  13691. flags.var_line = false;
  13692. flags.var_line_reindented = false;
  13693. break;
  13694. case 'TK_STRING':
  13695. if (last_type === 'TK_START_BLOCK' || last_type === 'TK_END_BLOCK' || last_type === 'TK_SEMICOLON') {
  13696. print_newline();
  13697. } else if (last_type === 'TK_WORD') {
  13698. print_single_space();
  13699. }
  13700. print_token();
  13701. break;
  13702. case 'TK_EQUALS':
  13703. if (flags.var_line) {
  13704. // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done
  13705. flags.var_line_tainted = true;
  13706. }
  13707. print_single_space();
  13708. print_token();
  13709. print_single_space();
  13710. break;
  13711. case 'TK_OPERATOR':
  13712. var space_before = true;
  13713. var space_after = true;
  13714. if (flags.var_line && token_text === ',' && (is_expression(flags.mode))) {
  13715. // do not break on comma, for(var a = 1, b = 2)
  13716. flags.var_line_tainted = false;
  13717. }
  13718. if (flags.var_line) {
  13719. if (token_text === ',') {
  13720. if (flags.var_line_tainted) {
  13721. print_token();
  13722. flags.var_line_reindented = true;
  13723. flags.var_line_tainted = false;
  13724. print_newline();
  13725. break;
  13726. } else {
  13727. flags.var_line_tainted = false;
  13728. }
  13729. // } else if (token_text === ':') {
  13730. // hmm, when does this happen? tests don't catch this
  13731. // flags.var_line = false;
  13732. }
  13733. }
  13734. if (last_text === 'return' || last_text === 'throw') {
  13735. // "return" had a special handling in TK_WORD. Now we need to return the favor
  13736. print_single_space();
  13737. print_token();
  13738. break;
  13739. }
  13740. if (token_text === ':' && flags.in_case) {
  13741. print_token(); // colon really asks for separate treatment
  13742. print_newline();
  13743. flags.in_case = false;
  13744. break;
  13745. }
  13746. if (token_text === '::') {
  13747. // no spaces around exotic namespacing syntax operator
  13748. print_token();
  13749. break;
  13750. }
  13751. if (token_text === ',') {
  13752. if (flags.var_line) {
  13753. if (flags.var_line_tainted) {
  13754. print_token();
  13755. print_newline();
  13756. flags.var_line_tainted = false;
  13757. } else {
  13758. print_token();
  13759. print_single_space();
  13760. }
  13761. } else if (last_type === 'TK_END_BLOCK' && flags.mode !== "(EXPRESSION)") {
  13762. print_token();
  13763. if (flags.mode === 'OBJECT' && last_text === '}') {
  13764. print_newline();
  13765. } else {
  13766. print_single_space();
  13767. }
  13768. } else {
  13769. if (flags.mode === 'OBJECT') {
  13770. print_token();
  13771. print_newline();
  13772. } else {
  13773. // EXPR or DO_BLOCK
  13774. print_token();
  13775. print_single_space();
  13776. }
  13777. }
  13778. break;
  13779. // } else if (in_array(token_text, ['--', '++', '!']) || (in_array(token_text, ['-', '+']) && (in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS']) || in_array(last_text, line_starters) || in_array(last_text, ['==', '!=', '+=', '-=', '*=', '/=', '+', '-'])))) {
  13780. } else if (in_array(token_text, ['--', '++', '!']) || (in_array(token_text, ['-', '+']) && (in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']) || in_array(last_text, line_starters)))) {
  13781. // unary operators (and binary +/- pretending to be unary) special cases
  13782. space_before = false;
  13783. space_after = false;
  13784. if (last_text === ';' && is_expression(flags.mode)) {
  13785. // for (;; ++i)
  13786. // ^^^
  13787. space_before = true;
  13788. }
  13789. if (last_type === 'TK_WORD' && in_array(last_text, line_starters)) {
  13790. space_before = true;
  13791. }
  13792. if (flags.mode === 'BLOCK' && (last_text === '{' || last_text === ';')) {
  13793. // { foo; --i }
  13794. // foo(); --bar;
  13795. print_newline();
  13796. }
  13797. } else if (token_text === '.') {
  13798. // decimal digits or object.property
  13799. space_before = false;
  13800. } else if (token_text === ':') {
  13801. if (!is_ternary_op()) {
  13802. flags.mode = 'OBJECT';
  13803. space_before = false;
  13804. }
  13805. }
  13806. if (space_before) {
  13807. print_single_space();
  13808. }
  13809. print_token();
  13810. if (space_after) {
  13811. print_single_space();
  13812. }
  13813. if (token_text === '!') {
  13814. // flags.eat_next_space = true;
  13815. }
  13816. break;
  13817. case 'TK_BLOCK_COMMENT':
  13818. var lines = token_text.split(/\x0a|\x0d\x0a/);
  13819. if (/^\/\*\*/.test(token_text)) {
  13820. // javadoc: reformat and reindent
  13821. print_newline();
  13822. output.push(lines[0]);
  13823. for (i = 1; i < lines.length; i++) {
  13824. print_newline();
  13825. output.push(' ');
  13826. output.push(lines[i].replace(/^\s\s*|\s\s*$/, ''));
  13827. }
  13828. } else {
  13829. // simple block comment: leave intact
  13830. if (lines.length > 1) {
  13831. // multiline comment block starts with a new line
  13832. print_newline();
  13833. trim_output();
  13834. } else {
  13835. // single-line /* comment */ stays where it is
  13836. print_single_space();
  13837. }
  13838. for (i = 0; i < lines.length; i++) {
  13839. output.push(lines[i]);
  13840. output.push('\n');
  13841. }
  13842. }
  13843. print_newline();
  13844. break;
  13845. case 'TK_INLINE_COMMENT':
  13846. print_single_space();
  13847. print_token();
  13848. if (is_expression(flags.mode)) {
  13849. print_single_space();
  13850. } else {
  13851. print_newline();
  13852. }
  13853. break;
  13854. case 'TK_COMMENT':
  13855. // print_newline();
  13856. if (wanted_newline) {
  13857. print_newline();
  13858. } else {
  13859. print_single_space();
  13860. }
  13861. print_token();
  13862. print_newline();
  13863. break;
  13864. case 'TK_UNKNOWN':
  13865. print_token();
  13866. break;
  13867. }
  13868. last_last_text = last_text;
  13869. last_type = token_type;
  13870. last_text = token_text;
  13871. }
  13872. return output.join('').replace(/[\n ]+$/, '');
  13873. }
  13874. // MIT-licensed
  13875. function sprintf ( ) {
  13876. // Return a formatted string
  13877. //
  13878. // version: 909.322
  13879. // discuss at: http://phpjs.org/functions/sprintf
  13880. // + original by: Ash Searle (http://hexmen.com/blog/)
  13881. // + namespaced by: Michael White (http://getsprink.com)
  13882. // + tweaked by: Jack
  13883. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  13884. // + input by: Paulo Ricardo F. Santos
  13885. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  13886. // + input by: Brett Zamir (http://brett-zamir.me)
  13887. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  13888. // * example 1: sprintf("%01.2f", 123.1);
  13889. // * returns 1: 123.10
  13890. // * example 2: sprintf("[%10s]", 'monkey');
  13891. // * returns 2: '[ monkey]'
  13892. // * example 3: sprintf("[%'#10s]", 'monkey');
  13893. // * returns 3: '[####monkey]'
  13894. var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
  13895. var a = arguments, i = 0, format = a[i++];
  13896. // pad()
  13897. var pad = function (str, len, chr, leftJustify) {
  13898. if (!chr) {chr = ' ';}
  13899. var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
  13900. return leftJustify ? str + padding : padding + str;
  13901. };
  13902. // justify()
  13903. var justify = function (value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
  13904. var diff = minWidth - value.length;
  13905. if (diff > 0) {
  13906. if (leftJustify || !zeroPad) {
  13907. value = pad(value, minWidth, customPadChar, leftJustify);
  13908. } else {
  13909. value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
  13910. }
  13911. }
  13912. return value;
  13913. };
  13914. // formatBaseX()
  13915. var formatBaseX = function (value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
  13916. // Note: casts negative numbers to positive ones
  13917. var number = value >>> 0;
  13918. prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
  13919. value = prefix + pad(number.toString(base), precision || 0, '0', false);
  13920. return justify(value, prefix, leftJustify, minWidth, zeroPad);
  13921. };
  13922. // formatString()
  13923. var formatString = function (value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
  13924. if (precision != null) {
  13925. value = value.slice(0, precision);
  13926. }
  13927. return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
  13928. };
  13929. // doFormat()
  13930. var doFormat = function (substring, valueIndex, flags, minWidth, _, precision, type) {
  13931. var number;
  13932. var prefix;
  13933. var method;
  13934. var textTransform;
  13935. var value;
  13936. if (substring == '%%') {return '%';}
  13937. // parse flags
  13938. var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, customPadChar = ' ';
  13939. var flagsl = flags.length;
  13940. for (var j = 0; flags && j < flagsl; j++) {
  13941. switch (flags.charAt(j)) {
  13942. case ' ': positivePrefix = ' '; break;
  13943. case '+': positivePrefix = '+'; break;
  13944. case '-': leftJustify = true; break;
  13945. case "'": customPadChar = flags.charAt(j+1); break;
  13946. case '0': zeroPad = true; break;
  13947. case '#': prefixBaseX = true; break;
  13948. }
  13949. }
  13950. // parameters may be null, undefined, empty-string or real valued
  13951. // we want to ignore null, undefined and empty-string values
  13952. if (!minWidth) {
  13953. minWidth = 0;
  13954. } else if (minWidth == '*') {
  13955. minWidth = +a[i++];
  13956. } else if (minWidth.charAt(0) == '*') {
  13957. minWidth = +a[minWidth.slice(1, -1)];
  13958. } else {
  13959. minWidth = +minWidth;
  13960. }
  13961. // Note: undocumented perl feature:
  13962. if (minWidth < 0) {
  13963. minWidth = -minWidth;
  13964. leftJustify = true;
  13965. }
  13966. if (!isFinite(minWidth)) {
  13967. throw new Error('sprintf: (minimum-)width must be finite');
  13968. }
  13969. if (!precision) {
  13970. precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : undefined;
  13971. } else if (precision == '*') {
  13972. precision = +a[i++];
  13973. } else if (precision.charAt(0) == '*') {
  13974. precision = +a[precision.slice(1, -1)];
  13975. } else {
  13976. precision = +precision;
  13977. }
  13978. // grab value using valueIndex if required?
  13979. value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
  13980. switch (type) {
  13981. case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
  13982. case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
  13983. case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  13984. case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  13985. case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  13986. case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
  13987. case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  13988. case 'i':
  13989. case 'd':
  13990. number = parseInt(+value, 10);
  13991. prefix = number < 0 ? '-' : positivePrefix;
  13992. value = prefix + pad(String(Math.abs(number)), precision, '0', false);
  13993. return justify(value, prefix, leftJustify, minWidth, zeroPad);
  13994. case 'e':
  13995. case 'E':
  13996. case 'f':
  13997. case 'F':
  13998. case 'g':
  13999. case 'G':
  14000. number = +value;
  14001. prefix = number < 0 ? '-' : positivePrefix;
  14002. method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
  14003. textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
  14004. value = prefix + Math.abs(number)[method](precision);
  14005. return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
  14006. default: return substring;
  14007. }
  14008. };
  14009. return format.replace(regex, doFormat);
  14010. }
  14011. /*
  14012. http://www.JSON.org/json2.js
  14013. 2009-06-29
  14014. Public Domain.
  14015. NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
  14016. See http://www.JSON.org/js.html
  14017. This file creates a global JSON object containing two methods: stringify
  14018. and parse.
  14019. JSON.stringify(value, replacer, space)
  14020. value any JavaScript value, usually an object or array.
  14021. replacer an optional parameter that determines how object
  14022. values are stringified for objects. It can be a
  14023. function or an array of strings.
  14024. space an optional parameter that specifies the indentation
  14025. of nested structures. If it is omitted, the text will
  14026. be packed without extra whitespace. If it is a number,
  14027. it will specify the number of spaces to indent at each
  14028. level. If it is a string (such as '\t' or '&nbsp;'),
  14029. it contains the characters used to indent at each level.
  14030. This method produces a JSON text from a JavaScript value.
  14031. When an object value is found, if the object contains a toJSON
  14032. method, its toJSON method will be called and the result will be
  14033. stringified. A toJSON method does not serialize: it returns the
  14034. value represented by the name/value pair that should be serialized,
  14035. or undefined if nothing should be serialized. The toJSON method
  14036. will be passed the key associated with the value, and this will be
  14037. bound to the object holding the key.
  14038. For example, this would serialize Dates as ISO strings.
  14039. Date.prototype.toJSON = function (key) {
  14040. function f(n) {
  14041. // Format integers to have at least two digits.
  14042. return n < 10 ? '0' + n : n;
  14043. }
  14044. return this.getUTCFullYear() + '-' +
  14045. f(this.getUTCMonth() + 1) + '-' +
  14046. f(this.getUTCDate()) + 'T' +
  14047. f(this.getUTCHours()) + ':' +
  14048. f(this.getUTCMinutes()) + ':' +
  14049. f(this.getUTCSeconds()) + 'Z';
  14050. };
  14051. You can provide an optional replacer method. It will be passed the
  14052. key and value of each member, with this bound to the containing
  14053. object. The value that is returned from your method will be
  14054. serialized. If your method returns undefined, then the member will
  14055. be excluded from the serialization.
  14056. If the replacer parameter is an array of strings, then it will be
  14057. used to select the members to be serialized. It filters the results
  14058. such that only members with keys listed in the replacer array are
  14059. stringified.
  14060. Values that do not have JSON representations, such as undefined or
  14061. functions, will not be serialized. Such values in objects will be
  14062. dropped; in arrays they will be replaced with null. You can use
  14063. a replacer function to replace those with JSON values.
  14064. JSON.stringify(undefined) returns undefined.
  14065. The optional space parameter produces a stringification of the
  14066. value that is filled with line breaks and indentation to make it
  14067. easier to read.
  14068. If the space parameter is a non-empty string, then that string will
  14069. be used for indentation. If the space parameter is a number, then
  14070. the indentation will be that many spaces.
  14071. Example:
  14072. text = JSON.stringify(['e', {pluribus: 'unum'}]);
  14073. // text is '["e",{"pluribus":"unum"}]'
  14074. text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
  14075. // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
  14076. text = JSON.stringify([new Date()], function (key, value) {
  14077. return this[key] instanceof Date ?
  14078. 'Date(' + this[key] + ')' : value;
  14079. });
  14080. // text is '["Date(---current time---)"]'
  14081. JSON.parse(text, reviver)
  14082. This method parses a JSON text to produce an object or array.
  14083. It can throw a SyntaxError exception.
  14084. The optional reviver parameter is a function that can filter and
  14085. transform the results. It receives each of the keys and values,
  14086. and its return value is used instead of the original value.
  14087. If it returns what it received, then the structure is not modified.
  14088. If it returns undefined then the member is deleted.
  14089. Example:
  14090. // Parse the text. Values that look like ISO date strings will
  14091. // be converted to Date objects.
  14092. myData = JSON.parse(text, function (key, value) {
  14093. var a;
  14094. if (typeof value === 'string') {
  14095. a =
  14096. /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
  14097. if (a) {
  14098. return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
  14099. +a[5], +a[6]));
  14100. }
  14101. }
  14102. return value;
  14103. });
  14104. myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
  14105. var d;
  14106. if (typeof value === 'string' &&
  14107. value.slice(0, 5) === 'Date(' &&
  14108. value.slice(-1) === ')') {
  14109. d = new Date(value.slice(5, -1));
  14110. if (d) {
  14111. return d;
  14112. }
  14113. }
  14114. return value;
  14115. });
  14116. This is a reference implementation. You are free to copy, modify, or
  14117. redistribute.
  14118. This code should be minified before deployment.
  14119. See http://javascript.crockford.com/jsmin.html
  14120. USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
  14121. NOT CONTROL.
  14122. */
  14123. /*jslint evil: true */
  14124. /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
  14125. call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
  14126. getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
  14127. lastIndex, length, parse, prototype, push, replace, slice, stringify,
  14128. test, toJSON, toString, valueOf
  14129. */
  14130. // Create a JSON object only if one does not already exist. We create the
  14131. // methods in a closure to avoid creating global variables.
  14132. var JSON2 = JSON2 || {};
  14133. (function () {
  14134. function f(n) {
  14135. // Format integers to have at least two digits.
  14136. return n < 10 ? '0' + n : n;
  14137. }
  14138. if (typeof Date.prototype.toJSON !== 'function') {
  14139. Date.prototype.toJSON = function (key) {
  14140. return isFinite(this.valueOf()) ?
  14141. this.getUTCFullYear() + '-' +
  14142. f(this.getUTCMonth() + 1) + '-' +
  14143. f(this.getUTCDate()) + 'T' +
  14144. f(this.getUTCHours()) + ':' +
  14145. f(this.getUTCMinutes()) + ':' +
  14146. f(this.getUTCSeconds()) + 'Z' : null;
  14147. };
  14148. String.prototype.toJSON =
  14149. Number.prototype.toJSON =
  14150. Boolean.prototype.toJSON = function (key) {
  14151. return this.valueOf();
  14152. };
  14153. }
  14154. var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  14155. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  14156. gap,
  14157. indent,
  14158. meta = { // table of character substitutions
  14159. '\b': '\\b',
  14160. '\t': '\\t',
  14161. '\n': '\\n',
  14162. '\f': '\\f',
  14163. '\r': '\\r',
  14164. '"' : '\\"',
  14165. '\\': '\\\\'
  14166. },
  14167. rep;
  14168. function quote(string) {
  14169. // If the string contains no control characters, no quote characters, and no
  14170. // backslash characters, then we can safely slap some quotes around it.
  14171. // Otherwise we must also replace the offending characters with safe escape
  14172. // sequences.
  14173. escapable.lastIndex = 0;
  14174. return escapable.test(string) ?
  14175. '"' + string.replace(escapable, function (a) {
  14176. var c = meta[a];
  14177. return typeof c === 'string' ? c :
  14178. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  14179. }) + '"' :
  14180. '"' + string + '"';
  14181. }
  14182. function str(key, holder) {
  14183. // Produce a string from holder[key].
  14184. var i, // The loop counter.
  14185. k, // The member key.
  14186. v, // The member value.
  14187. length,
  14188. mind = gap,
  14189. partial,
  14190. value = holder[key];
  14191. // If the value has a toJSON method, call it to obtain a replacement value.
  14192. if (value && typeof value === 'object' &&
  14193. typeof value.toJSON === 'function') {
  14194. value = value.toJSON(key);
  14195. }
  14196. // If we were called with a replacer function, then call the replacer to
  14197. // obtain a replacement value.
  14198. if (typeof rep === 'function') {
  14199. value = rep.call(holder, key, value);
  14200. }
  14201. // What happens next depends on the value's type.
  14202. switch (typeof value) {
  14203. case 'string':
  14204. return quote(value);
  14205. case 'number':
  14206. // JSON numbers must be finite. Encode non-finite numbers as null.
  14207. return isFinite(value) ? String(value) : 'null';
  14208. case 'boolean':
  14209. case 'null':
  14210. // If the value is a boolean or null, convert it to a string. Note:
  14211. // typeof null does not produce 'null'. The case is included here in
  14212. // the remote chance that this gets fixed someday.
  14213. return String(value);
  14214. // If the type is 'object', we might be dealing with an object or an array or
  14215. // null.
  14216. case 'object':
  14217. // Due to a specification blunder in ECMAScript, typeof null is 'object',
  14218. // so watch out for that case.
  14219. if (!value) {
  14220. return 'null';
  14221. }
  14222. // Make an array to hold the partial results of stringifying this object value.
  14223. gap += indent;
  14224. partial = [];
  14225. // Is the value an array?
  14226. if (Object.prototype.toString.apply(value) === '[object Array]') {
  14227. // The value is an array. Stringify every element. Use null as a placeholder
  14228. // for non-JSON values.
  14229. length = value.length;
  14230. for (i = 0; i < length; i += 1) {
  14231. partial[i] = str(i, value) || 'null';
  14232. }
  14233. // Join all of the elements together, separated with commas, and wrap them in
  14234. // brackets.
  14235. v = partial.length === 0 ? '[]' :
  14236. gap ? '[\n' + gap +
  14237. partial.join(',\n' + gap) + '\n' +
  14238. mind + ']' :
  14239. '[' + partial.join(',') + ']';
  14240. gap = mind;
  14241. return v;
  14242. }
  14243. // If the replacer is an array, use it to select the members to be stringified.
  14244. if (rep && typeof rep === 'object') {
  14245. length = rep.length;
  14246. for (i = 0; i < length; i += 1) {
  14247. k = rep[i];
  14248. if (typeof k === 'string') {
  14249. v = str(k, value);
  14250. if (v) {
  14251. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  14252. }
  14253. }
  14254. }
  14255. } else {
  14256. // Otherwise, iterate through all of the keys in the object.
  14257. // sgraham, hack to canonicalize, as we're using for regression tests
  14258. var keys = [];
  14259. for (k in value) {
  14260. keys.push(k);
  14261. }
  14262. keys.sort();
  14263. for (i in keys) {
  14264. k = keys[i];
  14265. if (Object.hasOwnProperty.call(value, k)) {
  14266. v = str(k, value);
  14267. if (v) {
  14268. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  14269. }
  14270. }
  14271. }
  14272. }
  14273. // Join all of the member texts together, separated with commas,
  14274. // and wrap them in braces.
  14275. v = partial.length === 0 ? '{}' :
  14276. gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
  14277. mind + '}' : '{' + partial.join(',') + '}';
  14278. gap = mind;
  14279. return v;
  14280. default: return '';
  14281. }
  14282. }
  14283. // If the JSON object does not yet have a stringify method, give it one.
  14284. if (typeof JSON2.stringify !== 'function') {
  14285. JSON2.stringify = function (value, replacer, space) {
  14286. // The stringify method takes a value and an optional replacer, and an optional
  14287. // space parameter, and returns a JSON text. The replacer can be a function
  14288. // that can replace values, or an array of strings that will select the keys.
  14289. // A default replacer method can be provided. Use of the space parameter can
  14290. // produce text that is more easily readable.
  14291. var i;
  14292. gap = '';
  14293. indent = '';
  14294. // If the space parameter is a number, make an indent string containing that
  14295. // many spaces.
  14296. if (typeof space === 'number') {
  14297. for (i = 0; i < space; i += 1) {
  14298. indent += ' ';
  14299. }
  14300. // If the space parameter is a string, it will be used as the indent string.
  14301. } else if (typeof space === 'string') {
  14302. indent = space;
  14303. }
  14304. // If there is a replacer, it must be a function or an array.
  14305. // Otherwise, throw an error.
  14306. rep = replacer;
  14307. if (replacer && typeof replacer !== 'function' &&
  14308. (typeof replacer !== 'object' ||
  14309. typeof replacer.length !== 'number')) {
  14310. throw new Error('JSON2.stringify');
  14311. }
  14312. // Make a fake root object containing our value under the key of ''.
  14313. // Return the result of stringifying the value.
  14314. return str('', {'': value});
  14315. };
  14316. }
  14317. // If the JSON object does not yet have a parse method, give it one.
  14318. if (typeof JSON2.parse !== 'function') {
  14319. JSON2.parse = function (text, reviver) {
  14320. // The parse method takes a text and an optional reviver function, and returns
  14321. // a JavaScript value if the text is a valid JSON text.
  14322. var j;
  14323. function walk(holder, key) {
  14324. // The walk method is used to recursively walk the resulting structure so
  14325. // that modifications can be made.
  14326. var k, v, value = holder[key];
  14327. if (value && typeof value === 'object') {
  14328. for (k in keys) {
  14329. if (Object.hasOwnProperty.call(value, k)) {
  14330. v = walk(value, k);
  14331. if (v !== undefined) {
  14332. value[k] = v;
  14333. } else {
  14334. delete value[k];
  14335. }
  14336. }
  14337. }
  14338. }
  14339. return reviver.call(holder, key, value);
  14340. }
  14341. // Parsing happens in four stages. In the first stage, we replace certain
  14342. // Unicode characters with escape sequences. JavaScript handles many characters
  14343. // incorrectly, either silently deleting them, or treating them as line endings.
  14344. cx.lastIndex = 0;
  14345. if (cx.test(text)) {
  14346. text = text.replace(cx, function (a) {
  14347. return '\\u' +
  14348. ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  14349. });
  14350. }
  14351. // In the second stage, we run the text against regular expressions that look
  14352. // for non-JSON patterns. We are especially concerned with '()' and 'new'
  14353. // because they can cause invocation, and '=' because it can cause mutation.
  14354. // But just to be safe, we want to reject all unexpected forms.
  14355. // We split the second stage into 4 regexp operations in order to work around
  14356. // crippling inefficiencies in IE's and Safari's regexp engines. First we
  14357. // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
  14358. // replace all simple value tokens with ']' characters. Third, we delete all
  14359. // open brackets that follow a colon or comma or that begin the text. Finally,
  14360. // we look to see that the remaining characters are only whitespace or ']' or
  14361. // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
  14362. if (/^[\],:{}\s]*$/.
  14363. test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
  14364. replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
  14365. replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
  14366. // In the third stage we use the eval function to compile the text into a
  14367. // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
  14368. // in JavaScript: it can begin a block or an object literal. We wrap the text
  14369. // in parens to eliminate the ambiguity.
  14370. j = eval('(' + text + ')');
  14371. // In the optional fourth stage, we recursively walk the new structure, passing
  14372. // each name/value pair to a reviver function for possible transformation.
  14373. return typeof reviver === 'function' ?
  14374. walk({'': j}, '') : j;
  14375. }
  14376. // If the text is not JSON parseable, then a SyntaxError is thrown.
  14377. throw new SyntaxError('JSON2.parse');
  14378. };
  14379. }
  14380. }());
  14381. if (Sk.inBrowser)
  14382. {
  14383. goog.require('goog.dom');
  14384. goog.require('goog.ui.ComboBox');
  14385. }
  14386. var tokenizefail = 0;
  14387. var tokenizepass = 0;
  14388. function dump_tokens(fn, input)
  14389. {
  14390. var uneval = function(t)
  14391. {
  14392. return new Sk.builtin.str(t).tp$repr().v;
  14393. };
  14394. var ret = '',
  14395. lines = input.split("\n"),
  14396. curIndex = 0,
  14397. printer = function (type, token, st, en, line)
  14398. {
  14399. var srow = st[0],
  14400. scol = st[1],
  14401. erow = en[0],
  14402. ecol = en[1];
  14403. var data = sprintf("%-12.12s %-13.13s (%d, %d) (%d, %d)", Sk.Tokenizer.tokenNames[type], uneval(token), srow, scol, erow, ecol);
  14404. //print("DUMP:"+data);
  14405. ret += data;
  14406. ret += "\n";
  14407. };
  14408. var tokenizer = new Sk.Tokenizer(fn, false, printer);
  14409. var done = false;
  14410. for (var i = 0; i < lines.length && !done; ++i)
  14411. {
  14412. done = tokenizer.generateTokens(lines[i] + ((i === lines.length - 1) ? "" : "\n"));
  14413. }
  14414. if (!done) tokenizer.generateTokens();
  14415. return ret;
  14416. }
  14417. function testTokenize(name)
  14418. {
  14419. try { var input = read(name + ".py"); }
  14420. catch (e) { return; }
  14421. if (input.charAt(input.length - 1) !== "\n")
  14422. {
  14423. throw "input wasn't nl term";
  14424. }
  14425. input = input.substring(0, input.length - 1);
  14426. if (input.charAt(input.length - 1) === "\r")
  14427. {
  14428. input = input.substring(0, input.length - 1);
  14429. }
  14430. var expect = read(name + ".expect");
  14431. var got = '';
  14432. try
  14433. {
  14434. got = dump_tokens(name + ".py", input);
  14435. }
  14436. catch (e)
  14437. {
  14438. got += new Sk.builtin.str(e).v;
  14439. }
  14440. if (expect !== got)
  14441. {
  14442. print("FAILED: (" + name + ".py)\n-----");
  14443. print(input);
  14444. print("-----\nGOT:\n-----");
  14445. print(got);
  14446. print("-----\nWANTED:\n-----");
  14447. print(expect);
  14448. tokenizefail += 1;
  14449. }
  14450. else
  14451. {
  14452. tokenizepass += 1;
  14453. }
  14454. }
  14455. var parsefail = 0;
  14456. var parsepass = 0;
  14457. function testParse(name)
  14458. {
  14459. try { var input = read(name + ".py"); }
  14460. catch (e) { return; }
  14461. var expect = read(name + ".expect");
  14462. var got;
  14463. try
  14464. {
  14465. got = Sk.parseTreeDump(Sk.parse(name + ".py", input));
  14466. }
  14467. catch (e)
  14468. {
  14469. got = "EXCEPTION\n";
  14470. got += e.constructor.name + "\n";
  14471. got += JSON.stringify(e) + "\n";
  14472. }
  14473. if (expect !== got)
  14474. {
  14475. print("FAILED: (" + name + ".py)\n-----");
  14476. print(input);
  14477. print("-----\nGOT:\n-----");
  14478. print(got);
  14479. print("-----\nWANTED:\n-----");
  14480. print(expect);
  14481. parsefail += 1;
  14482. }
  14483. else
  14484. {
  14485. parsepass += 1;
  14486. }
  14487. }
  14488. var transformpass = 0;
  14489. var transformfail = 0;
  14490. function testTransform(name)
  14491. {
  14492. try { var input = read(name + ".py"); }
  14493. catch (e) { return; }
  14494. var expect = 'NO_.TRANS_FILE';
  14495. try { expect = read(name + ".trans"); }
  14496. catch (e) {}
  14497. var cst = Sk.parse(name + ".py", input);
  14498. var got = Sk.astDump(Sk.astFromParse(cst)) + "\n";
  14499. if (expect !== got)
  14500. {
  14501. print("FAILED: (" + name + ".py)\n-----");
  14502. print(input);
  14503. print("-----\nGOT:\n-----");
  14504. print(got);
  14505. print("-----\nWANTED:\n-----");
  14506. print(expect);
  14507. //print("-----\nCST:\n-----");
  14508. //print(parseTestDump(cst));
  14509. transformfail += 1;
  14510. }
  14511. else
  14512. {
  14513. transformpass += 1;
  14514. }
  14515. }
  14516. var symtabpass = 0;
  14517. var symtabfail = 0;
  14518. function testSymtab(name)
  14519. {
  14520. try { var input = read(name + ".py"); }
  14521. catch (e) { return; }
  14522. //print(name);
  14523. var expect = 'NO_.SYMTAB_FILE';
  14524. try { expect = read(name + ".py.symtab"); }
  14525. catch (e) {}
  14526. var cst = Sk.parse(name + ".py", input);
  14527. var ast = Sk.astFromParse(cst);
  14528. var st = Sk.symboltable(ast, name + ".py");
  14529. var got = Sk.dumpSymtab(st);
  14530. if (expect !== got)
  14531. {
  14532. print("FAILED: (" + name + ".py)\n-----");
  14533. print(input);
  14534. print("-----\nGOT:\n-----");
  14535. print(got);
  14536. print("-----\nWANTED:\n-----");
  14537. print(expect);
  14538. symtabfail += 1;
  14539. }
  14540. else
  14541. {
  14542. symtabpass += 1;
  14543. }
  14544. }
  14545. var AllRunTests = [];
  14546. var runpass = 0;
  14547. var runfail = 0;
  14548. var rundisabled = 0;
  14549. function testRun(name, nocatch)
  14550. {
  14551. Sk.debugout("name is", name);
  14552. try { var input = read(name + ".py"); }
  14553. catch (e) {
  14554. try { read(name + ".py.disabled"); rundisabled += 1;}
  14555. catch (e) {}
  14556. return;
  14557. }
  14558. Sk.debugout("here0");
  14559. AllRunTests.unshift(name);
  14560. var got = '';
  14561. Sk.output = function(str) { got += str; }
  14562. Sk.sysargv = [ name + '.py' ];
  14563. var justpath = name.substr(0, name.lastIndexOf('/'));
  14564. Sk.debugout("here1");
  14565. Sk.syspath = [justpath];
  14566. // reset these so that we force reload all imports for each run
  14567. Sk.realsyspath = undefined;
  14568. Sk.sysmodules = new Sk.builtin.dict([]);
  14569. Sk.debugout("here2");
  14570. var expect = read(name + ".py.real");
  14571. var expectalt;
  14572. try { expectalt = read(name + ".py.real.alt"); }
  14573. catch (e) {}
  14574. var module;
  14575. Sk.debugout("here3");
  14576. if (nocatch)
  14577. {
  14578. var justname = name.substr(name.lastIndexOf('/') + 1);
  14579. module = Sk.importMain(justname);
  14580. print(got);
  14581. }
  14582. else
  14583. {
  14584. try {
  14585. var justname = name.substr(name.lastIndexOf('/') + 1);
  14586. module = Sk.importMain(justname);
  14587. }
  14588. catch (e)
  14589. {
  14590. if (e.name !== undefined)
  14591. {
  14592. // js exception, currently happens for del'd objects. shouldn't
  14593. // really though.
  14594. got = "EXCEPTION: " + e.name + "\n";
  14595. }
  14596. else
  14597. {
  14598. got = "EXCEPTION: " + e.tp$name + ": " + e.args.v[0].v + "\n";
  14599. }
  14600. }
  14601. if (expect !== got && (expectalt !== undefined || expectalt !== got))
  14602. {
  14603. print("FAILED: (" + name + ".py)\n-----");
  14604. print(input);
  14605. print("-----\nGOT:\n-----");
  14606. print(got);
  14607. print("-----\nWANTED:\n-----");
  14608. print(expect);
  14609. if (module)
  14610. {
  14611. print("-----\nJS:\n-----");
  14612. var beaut = js_beautify(module.$js);
  14613. print(beaut);
  14614. }
  14615. runfail += 1;
  14616. //throw "dying on first run fail";
  14617. }
  14618. else
  14619. {
  14620. runpass += 1;
  14621. }
  14622. }
  14623. }
  14624. var interactivepass = 0;
  14625. var interactivefail = 0;
  14626. var interactivedisabled = 0;
  14627. function testInteractive(name)
  14628. {
  14629. try { var input = read(name + ".py"); }
  14630. catch (e) {
  14631. try { read(name + ".py.disabled"); interactivedisabled += 1;}
  14632. catch (e) {}
  14633. return;
  14634. }
  14635. var expect = read(name + ".py.real");
  14636. var got = '';
  14637. sk$output = function(str) { got += str; }
  14638. var lines = input.split("\n");
  14639. var ic = new Skulpt.InteractiveContext();
  14640. for (var i = 0; i < lines.length; ++i)
  14641. {
  14642. //print("LINE:"+lines[i]);
  14643. js = ic.evalLine(lines[i] + "\n");
  14644. //print("JS now:'"+js+"'");
  14645. if (js !== false)
  14646. {
  14647. try {
  14648. var ret = eval(js);
  14649. if (ret && ret.tp$repr !== undefined)
  14650. got += ret.tp$repr().v + "\n";
  14651. }
  14652. catch (e) { got += "EXCEPTION: " + e.name + "\n" }
  14653. //print("made new context");
  14654. ic = new Skulpt.InteractiveContext();
  14655. }
  14656. }
  14657. if (expect !== got)
  14658. {
  14659. print("FAILED: (" + name + ".py)\n-----");
  14660. print(input);
  14661. print("-----\nGOT:\n-----");
  14662. print(got);
  14663. print("-----\nWANTED:\n-----");
  14664. print(expect);
  14665. interactivefail += 1;
  14666. }
  14667. else
  14668. {
  14669. interactivepass += 1;
  14670. }
  14671. }
  14672. function testsMain()
  14673. {
  14674. var i;
  14675. // these use internal symbols so they can't run when fully
  14676. // compiled/minimized
  14677. //if (0)
  14678. {
  14679. for (i = 0; i <= 100; i += 1)
  14680. {
  14681. testTokenize(sprintf("test/tokenize/t%02d", i));
  14682. }
  14683. print(sprintf("tokenize: %d/%d", tokenizepass, tokenizepass + tokenizefail));
  14684. for (i = 0; i <= 10; i += 1)
  14685. {
  14686. testParse(sprintf("test/parse/t%02d", i));
  14687. }
  14688. print(sprintf("parse: %d/%d", parsepass, parsepass + parsefail));
  14689. for (i = 0; i <= 300; ++i)
  14690. {
  14691. testTransform(sprintf("test/run/t%02d", i));
  14692. }
  14693. print(sprintf("transform: %d/%d", transformpass, transformpass + transformfail));
  14694. for (i = 0; i <= 300; ++i)
  14695. {
  14696. testSymtab(sprintf("test/run/t%02d", i));
  14697. }
  14698. print(sprintf("symtab: %d/%d", symtabpass, symtabpass + symtabfail));
  14699. }
  14700. for (i = 0; i <= 300; ++i)
  14701. {
  14702. testRun(sprintf("test/run/t%02d", i));
  14703. }
  14704. print(sprintf("run: %d/%d (+%d disabled)", runpass, runpass + runfail, rundisabled));
  14705. {
  14706. var origrunfail = runfail;
  14707. runpass = runfail = rundisabled = 0;
  14708. for (i = 0; i <= 20; ++i)
  14709. {
  14710. testRun(sprintf("test/closure-cmd/t%02d", i));
  14711. }
  14712. print(sprintf("closure-cmd: %d/%d", runpass, runpass + runfail));
  14713. runfail += origrunfail; // for exit code
  14714. }
  14715. if (Sk.inBrowser)
  14716. {
  14717. var origrunfail = runfail;
  14718. runpass = runfail = rundisabled = 0;
  14719. for (i = 0; i <= 20; ++i)
  14720. {
  14721. testRun(sprintf("test/closure/t%02d", i));
  14722. }
  14723. print(sprintf("closure: %d/%d", runpass, runpass + runfail));
  14724. runfail += origrunfail; // for exit code
  14725. // make a combobox of all tests so we can run just one
  14726. var el = goog.dom.getElement('one-test');
  14727. var cb = new goog.ui.ComboBox();
  14728. cb.setUseDropdownArrow(true);
  14729. cb.setDefaultText('Run one test...');
  14730. for (var i = 0; i < AllRunTests.length; ++i)
  14731. {
  14732. cb.addItem(new goog.ui.ComboBoxItem(AllRunTests[i]));
  14733. }
  14734. cb.render(el);
  14735. goog.events.listen(cb, 'change', function(e) {
  14736. goog.dom.setTextContent(goog.dom.getElement('output'), "");
  14737. print("running", e.target.getValue());
  14738. testRun(e.target.getValue(), true);
  14739. });
  14740. }
  14741. else
  14742. {
  14743. print("closure: skipped");
  14744. }
  14745. return;
  14746. for (i = 0; i <= 100; ++i)
  14747. {
  14748. testInteractive(sprintf("test/interactive/t%02d", i));
  14749. }
  14750. print(sprintf("interactive: %d/%d (+%d disabled)", interactivepass, interactivepass + interactivefail, interactivedisabled));
  14751. quit(tokenizefail + parsefail + transformfail + symtabfail + runfail + interactivefail);
  14752. }
  14753. if (!Sk.inBrowser)
  14754. {
  14755. testsMain();
  14756. }
  14757. });