bundle.js 1.4 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572485734857448575485764857748578485794858048581485824858348584485854858648587485884858948590485914859248593485944859548596485974859848599486004860148602486034860448605486064860748608486094861048611486124861348614486154861648617486184861948620486214862248623486244862548626486274862848629486304863148632486334863448635486364863748638486394864048641486424864348644486454864648647486484864948650486514865248653486544865548656486574865848659486604866148662486634866448665486664866748668486694867048671486724867348674486754867648677486784867948680486814868248683486844868548686486874868848689486904869148692486934869448695486964869748698486994870048701487024870348704487054870648707487084870948710487114871248713487144871548716487174871848719487204872148722487234872448725487264872748728487294873048731487324873348734487354873648737487384873948740487414874248743487444874548746487474874848749487504875148752487534875448755487564875748758487594876048761487624876348764487654876648767487684876948770487714877248773487744877548776487774877848779487804878148782487834878448785487864878748788487894879048791487924879348794487954879648797487984879948800488014880248803488044880548806488074880848809488104881148812488134881448815488164881748818488194882048821488224882348824488254882648827488284882948830488314883248833488344883548836488374883848839488404884148842488434884448845488464884748848488494885048851488524885348854488554885648857488584885948860488614886248863488644886548866488674886848869488704887148872488734887448875488764887748878488794888048881488824888348884488854888648887488884888948890488914889248893488944889548896488974889848899489004890148902489034890448905489064890748908489094891048911489124891348914489154891648917489184891948920489214892248923489244892548926489274892848929489304893148932489334893448935489364893748938489394894048941489424894348944489454894648947489484894948950489514895248953489544895548956489574895848959489604896148962489634896448965489664896748968489694897048971489724897348974489754897648977489784897948980489814898248983489844898548986489874898848989489904899148992489934899448995489964899748998489994900049001490024900349004490054900649007490084900949010490114901249013490144901549016490174901849019490204902149022490234902449025490264902749028490294903049031490324903349034490354903649037490384903949040490414904249043490444904549046490474904849049490504905149052490534905449055490564905749058490594906049061490624906349064490654906649067490684906949070490714907249073490744907549076490774907849079490804908149082490834908449085490864908749088490894909049091490924909349094490954909649097490984909949100491014910249103491044910549106491074910849109491104911149112491134911449115491164911749118491194912049121491224912349124491254912649127491284912949130491314913249133491344913549136491374913849139491404914149142491434914449145491464914749148491494915049151491524915349154491554915649157491584915949160491614916249163491644916549166491674916849169491704917149172491734917449175491764917749178491794918049181491824918349184491854918649187491884918949190491914919249193491944919549196491974919849199492004920149202492034920449205492064920749208492094921049211492124921349214492154921649217492184921949220492214922249223492244922549226492274922849229492304923149232492334923449235492364923749238492394924049241492424924349244492454924649247492484924949250492514925249253492544925549256492574925849259492604926149262492634926449265492664926749268492694927049271492724927349274492754927649277492784927949280492814928249283492844928549286492874928849289492904929149292492934929449295492964929749298492994930049301493024930349304493054930649307493084930949310493114931249313493144931549316493174931849319493204932149322493234932449325493264932749328493294933049331493324933349334493354933649337493384933949340493414934249343493444934549346493474934849349493504935149352493534935449355493564935749358493594936049361493624936349364493654936649367493684936949370493714937249373493744937549376493774937849379493804938149382493834938449385493864938749388493894939049391493924939349394493954939649397493984939949400494014940249403494044940549406494074940849409494104941149412494134941449415494164941749418494194942049421494224942349424494254942649427494284942949430494314943249433494344943549436494374943849439494404944149442494434944449445494464944749448494494945049451494524945349454494554945649457494584945949460494614946249463494644946549466494674946849469494704947149472494734947449475494764947749478494794948049481494824948349484494854948649487494884948949490494914949249493494944949549496494974949849499495004950149502495034950449505495064950749508495094951049511495124951349514495154951649517495184951949520495214952249523495244952549526495274952849529495304953149532495334953449535495364953749538495394954049541495424954349544495454954649547495484954949550495514955249553495544955549556495574955849559495604956149562495634956449565495664956749568495694957049571495724957349574495754957649577495784957949580495814958249583495844958549586495874958849589495904959149592495934959449595495964959749598495994960049601496024960349604496054960649607496084960949610496114961249613496144961549616496174961849619496204962149622496234962449625496264962749628496294963049631496324963349634496354963649637496384963949640496414964249643496444964549646496474964849649496504965149652496534965449655496564965749658496594966049661496624966349664496654966649667496684966949670496714967249673496744967549676496774967849679496804968149682496834968449685496864968749688496894969049691496924969349694496954969649697496984969949700497014970249703497044970549706497074970849709497104971149712497134971449715497164971749718497194972049721497224972349724497254972649727497284972949730497314973249733497344973549736497374973849739497404974149742497434974449745497464974749748497494975049751497524975349754497554975649757497584975949760497614976249763497644976549766497674976849769497704977149772497734977449775497764977749778497794978049781497824978349784497854978649787497884978949790497914979249793497944979549796497974979849799498004980149802498034980449805498064980749808498094981049811498124981349814498154981649817498184981949820498214982249823498244982549826498274982849829498304983149832498334983449835498364983749838498394984049841498424984349844498454984649847498484984949850498514985249853498544985549856498574985849859498604986149862498634986449865498664986749868498694987049871498724987349874498754987649877498784987949880498814988249883498844988549886498874988849889498904989149892498934989449895498964989749898498994990049901499024990349904499054990649907499084990949910499114991249913499144991549916499174991849919499204992149922499234992449925499264992749928499294993049931499324993349934499354993649937499384993949940499414994249943499444994549946499474994849949499504995149952499534995449955499564995749958499594996049961499624996349964499654996649967499684996949970499714997249973499744997549976499774997849979499804998149982499834998449985499864998749988499894999049991499924999349994499954999649997499984999950000500015000250003500045000550006500075000850009500105001150012500135001450015500165001750018500195002050021500225002350024500255002650027500285002950030500315003250033500345003550036500375003850039500405004150042500435004450045500465004750048500495005050051500525005350054500555005650057500585005950060500615006250063500645006550066500675006850069500705007150072500735007450075500765007750078500795008050081500825008350084500855008650087500885008950090500915009250093500945009550096500975009850099501005010150102501035010450105501065010750108501095011050111501125011350114501155011650117501185011950120501215012250123501245012550126501275012850129501305013150132501335013450135501365013750138501395014050141501425014350144501455014650147501485014950150501515015250153501545015550156501575015850159501605016150162501635016450165501665016750168501695017050171501725017350174501755017650177501785017950180501815018250183501845018550186501875018850189501905019150192501935019450195501965019750198501995020050201502025020350204502055020650207502085020950210502115021250213502145021550216502175021850219502205022150222502235022450225502265022750228502295023050231502325023350234502355023650237502385023950240502415024250243502445024550246502475024850249502505025150252502535025450255502565025750258502595026050261502625026350264502655026650267502685026950270502715027250273502745027550276502775027850279502805028150282502835028450285502865028750288502895029050291502925029350294502955029650297502985029950300503015030250303503045030550306503075030850309503105031150312503135031450315503165031750318503195032050321503225032350324503255032650327503285032950330503315033250333503345033550336503375033850339503405034150342503435034450345503465034750348503495035050351503525035350354503555035650357503585035950360503615036250363503645036550366503675036850369503705037150372503735037450375503765037750378503795038050381503825038350384503855038650387503885038950390503915039250393503945039550396503975039850399504005040150402504035040450405504065040750408504095041050411504125041350414504155041650417504185041950420504215042250423504245042550426504275042850429504305043150432504335043450435504365043750438504395044050441504425044350444504455044650447504485044950450504515045250453504545045550456504575045850459504605046150462504635046450465504665046750468504695047050471504725047350474504755047650477504785047950480504815048250483504845048550486504875048850489504905049150492504935049450495504965049750498504995050050501505025050350504505055050650507505085050950510505115051250513505145051550516505175051850519505205052150522505235052450525505265052750528505295053050531505325053350534505355053650537505385053950540505415054250543505445054550546505475054850549505505055150552505535055450555505565055750558505595056050561505625056350564505655056650567505685056950570505715057250573505745057550576505775057850579505805058150582505835058450585505865058750588505895059050591505925059350594505955059650597505985059950600506015060250603506045060550606506075060850609506105061150612506135061450615506165061750618506195062050621506225062350624506255062650627506285062950630506315063250633506345063550636506375063850639506405064150642506435064450645506465064750648506495065050651506525065350654506555065650657506585065950660506615066250663506645066550666506675066850669506705067150672506735067450675506765067750678506795068050681506825068350684506855068650687506885068950690506915069250693506945069550696506975069850699507005070150702507035070450705507065070750708507095071050711507125071350714507155071650717507185071950720507215072250723507245072550726507275072850729507305073150732507335073450735507365073750738507395074050741507425074350744507455074650747507485074950750507515075250753507545075550756507575075850759507605076150762507635076450765507665076750768507695077050771507725077350774507755077650777507785077950780507815078250783507845078550786507875078850789507905079150792507935079450795507965079750798507995080050801508025080350804508055080650807508085080950810508115081250813508145081550816508175081850819508205082150822508235082450825508265082750828508295083050831508325083350834508355083650837508385083950840508415084250843508445084550846508475084850849508505085150852508535085450855508565085750858508595086050861508625086350864508655086650867508685086950870508715087250873508745087550876508775087850879508805088150882508835088450885508865088750888508895089050891508925089350894508955089650897508985089950900509015090250903509045090550906509075090850909509105091150912509135091450915509165091750918509195092050921509225092350924509255092650927509285092950930509315093250933509345093550936509375093850939509405094150942509435094450945509465094750948509495095050951509525095350954509555095650957509585095950960509615096250963509645096550966509675096850969509705097150972509735097450975509765097750978509795098050981509825098350984509855098650987509885098950990509915099250993509945099550996509975099850999510005100151002510035100451005510065100751008510095101051011510125101351014510155101651017510185101951020510215102251023510245102551026510275102851029510305103151032510335103451035510365103751038510395104051041510425104351044510455104651047510485104951050510515105251053510545105551056510575105851059510605106151062510635106451065510665106751068510695107051071510725107351074510755107651077510785107951080510815108251083510845108551086510875108851089510905109151092510935109451095510965109751098510995110051101511025110351104511055110651107511085110951110511115111251113511145111551116511175111851119511205112151122511235112451125511265112751128511295113051131511325113351134511355113651137511385113951140511415114251143511445114551146511475114851149511505115151152511535115451155511565115751158511595116051161511625116351164511655116651167511685116951170511715117251173511745117551176511775117851179511805118151182511835118451185511865118751188511895119051191511925119351194511955119651197511985119951200512015120251203512045120551206512075120851209512105121151212512135121451215512165121751218512195122051221512225122351224512255122651227512285122951230512315123251233512345123551236512375123851239512405124151242512435124451245512465124751248512495125051251512525125351254512555125651257512585125951260512615126251263512645126551266512675126851269512705127151272512735127451275512765127751278512795128051281512825128351284512855128651287512885128951290512915129251293512945129551296512975129851299513005130151302513035130451305513065130751308513095131051311513125131351314513155131651317513185131951320513215132251323513245132551326513275132851329513305133151332513335133451335513365133751338513395134051341513425134351344513455134651347513485134951350513515135251353513545135551356513575135851359513605136151362513635136451365513665136751368513695137051371513725137351374513755137651377513785137951380513815138251383513845138551386513875138851389513905139151392513935139451395513965139751398513995140051401514025140351404514055140651407514085140951410514115141251413514145141551416514175141851419514205142151422514235142451425514265142751428514295143051431514325143351434514355143651437514385143951440514415144251443514445144551446514475144851449514505145151452514535145451455514565145751458514595146051461514625146351464514655146651467514685146951470514715147251473514745147551476514775147851479514805148151482514835148451485514865148751488514895149051491514925149351494514955149651497514985149951500515015150251503515045150551506515075150851509515105151151512515135151451515515165151751518515195152051521515225152351524515255152651527515285152951530515315153251533515345153551536515375153851539515405154151542515435154451545515465154751548515495155051551515525155351554515555155651557515585155951560515615156251563515645156551566515675156851569515705157151572515735157451575515765157751578515795158051581515825158351584515855158651587515885158951590515915159251593515945159551596515975159851599516005160151602516035160451605516065160751608516095161051611516125161351614516155161651617516185161951620516215162251623516245162551626516275162851629516305163151632516335163451635516365163751638516395164051641516425164351644516455164651647516485164951650516515165251653516545165551656516575165851659516605166151662516635166451665516665166751668516695167051671516725167351674516755167651677516785167951680516815168251683516845168551686516875168851689516905169151692516935169451695516965169751698516995170051701517025170351704517055170651707517085170951710517115171251713517145171551716517175171851719517205172151722517235172451725517265172751728517295173051731517325173351734517355173651737517385173951740517415174251743517445174551746517475174851749517505175151752517535175451755517565175751758517595176051761517625176351764517655176651767517685176951770517715177251773517745177551776517775177851779517805178151782517835178451785517865178751788517895179051791517925179351794517955179651797517985179951800518015180251803518045180551806518075180851809518105181151812518135181451815518165181751818518195182051821518225182351824518255182651827518285182951830518315183251833518345183551836518375183851839518405184151842518435184451845518465184751848518495185051851518525185351854518555185651857518585185951860518615186251863518645186551866518675186851869518705187151872518735187451875518765187751878518795188051881518825188351884518855188651887518885188951890518915189251893518945189551896518975189851899519005190151902519035190451905519065190751908519095191051911519125191351914519155191651917519185191951920519215192251923519245192551926519275192851929519305193151932519335193451935519365193751938519395194051941519425194351944519455194651947519485194951950519515195251953519545195551956519575195851959519605196151962519635196451965519665196751968519695197051971519725197351974519755197651977519785197951980519815198251983519845198551986519875198851989519905199151992519935199451995519965199751998519995200052001520025200352004520055200652007520085200952010520115201252013520145201552016520175201852019520205202152022520235202452025520265202752028520295203052031520325203352034520355203652037520385203952040520415204252043520445204552046520475204852049520505205152052520535205452055520565205752058520595206052061520625206352064520655206652067520685206952070520715207252073520745207552076520775207852079520805208152082520835208452085520865208752088520895209052091520925209352094520955209652097520985209952100521015210252103521045210552106521075210852109521105211152112521135211452115521165211752118521195212052121521225212352124521255212652127521285212952130521315213252133521345213552136521375213852139521405214152142521435214452145521465214752148521495215052151521525215352154521555215652157521585215952160521615216252163521645216552166521675216852169521705217152172521735217452175521765217752178521795218052181521825218352184521855218652187521885218952190521915219252193521945219552196521975219852199522005220152202522035220452205522065220752208522095221052211522125221352214522155221652217522185221952220
  1. /******/ (function(modules) { // webpackBootstrap
  2. /******/ // The module cache
  3. /******/ var installedModules = {};
  4. /******/ // The require function
  5. /******/ function __webpack_require__(moduleId) {
  6. /******/ // Check if module is in cache
  7. /******/ if(installedModules[moduleId])
  8. /******/ return installedModules[moduleId].exports;
  9. /******/ // Create a new module (and put it into the cache)
  10. /******/ var module = installedModules[moduleId] = {
  11. /******/ i: moduleId,
  12. /******/ l: false,
  13. /******/ exports: {}
  14. /******/ };
  15. /******/ // Execute the module function
  16. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  17. /******/ // Flag the module as loaded
  18. /******/ module.l = true;
  19. /******/ // Return the exports of the module
  20. /******/ return module.exports;
  21. /******/ }
  22. /******/ // expose the modules object (__webpack_modules__)
  23. /******/ __webpack_require__.m = modules;
  24. /******/ // expose the module cache
  25. /******/ __webpack_require__.c = installedModules;
  26. /******/ // identity function for calling harmony imports with the correct context
  27. /******/ __webpack_require__.i = function(value) { return value; };
  28. /******/ // define getter function for harmony exports
  29. /******/ __webpack_require__.d = function(exports, name, getter) {
  30. /******/ if(!__webpack_require__.o(exports, name)) {
  31. /******/ Object.defineProperty(exports, name, {
  32. /******/ configurable: false,
  33. /******/ enumerable: true,
  34. /******/ get: getter
  35. /******/ });
  36. /******/ }
  37. /******/ };
  38. /******/ // getDefaultExport function for compatibility with non-harmony modules
  39. /******/ __webpack_require__.n = function(module) {
  40. /******/ var getter = module && module.__esModule ?
  41. /******/ function getDefault() { return module['default']; } :
  42. /******/ function getModuleExports() { return module; };
  43. /******/ __webpack_require__.d(getter, 'a', getter);
  44. /******/ return getter;
  45. /******/ };
  46. /******/ // Object.prototype.hasOwnProperty.call
  47. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  48. /******/ // __webpack_public_path__
  49. /******/ __webpack_require__.p = "";
  50. /******/ // Load entry module and return exports
  51. /******/ return __webpack_require__(__webpack_require__.s = 187);
  52. /******/ })
  53. /************************************************************************/
  54. /******/ ([
  55. /* 0 */
  56. /***/ (function(module, exports, __webpack_require__) {
  57. /* WEBPACK VAR INJECTION */(function(module) {//! moment.js
  58. //! version : 2.17.1
  59. //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
  60. //! license : MIT
  61. //! momentjs.com
  62. ;(function (global, factory) {
  63. true ? module.exports = factory() :
  64. typeof define === 'function' && define.amd ? define(factory) :
  65. global.moment = factory()
  66. }(this, (function () { 'use strict';
  67. var hookCallback;
  68. function hooks () {
  69. return hookCallback.apply(null, arguments);
  70. }
  71. // This is done to register the method called with moment()
  72. // without creating circular dependencies.
  73. function setHookCallback (callback) {
  74. hookCallback = callback;
  75. }
  76. function isArray(input) {
  77. return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
  78. }
  79. function isObject(input) {
  80. // IE8 will treat undefined and null as object if it wasn't for
  81. // input != null
  82. return input != null && Object.prototype.toString.call(input) === '[object Object]';
  83. }
  84. function isObjectEmpty(obj) {
  85. var k;
  86. for (k in obj) {
  87. // even if its not own property I'd still call it non-empty
  88. return false;
  89. }
  90. return true;
  91. }
  92. function isNumber(input) {
  93. return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
  94. }
  95. function isDate(input) {
  96. return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
  97. }
  98. function map(arr, fn) {
  99. var res = [], i;
  100. for (i = 0; i < arr.length; ++i) {
  101. res.push(fn(arr[i], i));
  102. }
  103. return res;
  104. }
  105. function hasOwnProp(a, b) {
  106. return Object.prototype.hasOwnProperty.call(a, b);
  107. }
  108. function extend(a, b) {
  109. for (var i in b) {
  110. if (hasOwnProp(b, i)) {
  111. a[i] = b[i];
  112. }
  113. }
  114. if (hasOwnProp(b, 'toString')) {
  115. a.toString = b.toString;
  116. }
  117. if (hasOwnProp(b, 'valueOf')) {
  118. a.valueOf = b.valueOf;
  119. }
  120. return a;
  121. }
  122. function createUTC (input, format, locale, strict) {
  123. return createLocalOrUTC(input, format, locale, strict, true).utc();
  124. }
  125. function defaultParsingFlags() {
  126. // We need to deep clone this object.
  127. return {
  128. empty : false,
  129. unusedTokens : [],
  130. unusedInput : [],
  131. overflow : -2,
  132. charsLeftOver : 0,
  133. nullInput : false,
  134. invalidMonth : null,
  135. invalidFormat : false,
  136. userInvalidated : false,
  137. iso : false,
  138. parsedDateParts : [],
  139. meridiem : null
  140. };
  141. }
  142. function getParsingFlags(m) {
  143. if (m._pf == null) {
  144. m._pf = defaultParsingFlags();
  145. }
  146. return m._pf;
  147. }
  148. var some;
  149. if (Array.prototype.some) {
  150. some = Array.prototype.some;
  151. } else {
  152. some = function (fun) {
  153. var t = Object(this);
  154. var len = t.length >>> 0;
  155. for (var i = 0; i < len; i++) {
  156. if (i in t && fun.call(this, t[i], i, t)) {
  157. return true;
  158. }
  159. }
  160. return false;
  161. };
  162. }
  163. var some$1 = some;
  164. function isValid(m) {
  165. if (m._isValid == null) {
  166. var flags = getParsingFlags(m);
  167. var parsedParts = some$1.call(flags.parsedDateParts, function (i) {
  168. return i != null;
  169. });
  170. var isNowValid = !isNaN(m._d.getTime()) &&
  171. flags.overflow < 0 &&
  172. !flags.empty &&
  173. !flags.invalidMonth &&
  174. !flags.invalidWeekday &&
  175. !flags.nullInput &&
  176. !flags.invalidFormat &&
  177. !flags.userInvalidated &&
  178. (!flags.meridiem || (flags.meridiem && parsedParts));
  179. if (m._strict) {
  180. isNowValid = isNowValid &&
  181. flags.charsLeftOver === 0 &&
  182. flags.unusedTokens.length === 0 &&
  183. flags.bigHour === undefined;
  184. }
  185. if (Object.isFrozen == null || !Object.isFrozen(m)) {
  186. m._isValid = isNowValid;
  187. }
  188. else {
  189. return isNowValid;
  190. }
  191. }
  192. return m._isValid;
  193. }
  194. function createInvalid (flags) {
  195. var m = createUTC(NaN);
  196. if (flags != null) {
  197. extend(getParsingFlags(m), flags);
  198. }
  199. else {
  200. getParsingFlags(m).userInvalidated = true;
  201. }
  202. return m;
  203. }
  204. function isUndefined(input) {
  205. return input === void 0;
  206. }
  207. // Plugins that add properties should also add the key here (null value),
  208. // so we can properly clone ourselves.
  209. var momentProperties = hooks.momentProperties = [];
  210. function copyConfig(to, from) {
  211. var i, prop, val;
  212. if (!isUndefined(from._isAMomentObject)) {
  213. to._isAMomentObject = from._isAMomentObject;
  214. }
  215. if (!isUndefined(from._i)) {
  216. to._i = from._i;
  217. }
  218. if (!isUndefined(from._f)) {
  219. to._f = from._f;
  220. }
  221. if (!isUndefined(from._l)) {
  222. to._l = from._l;
  223. }
  224. if (!isUndefined(from._strict)) {
  225. to._strict = from._strict;
  226. }
  227. if (!isUndefined(from._tzm)) {
  228. to._tzm = from._tzm;
  229. }
  230. if (!isUndefined(from._isUTC)) {
  231. to._isUTC = from._isUTC;
  232. }
  233. if (!isUndefined(from._offset)) {
  234. to._offset = from._offset;
  235. }
  236. if (!isUndefined(from._pf)) {
  237. to._pf = getParsingFlags(from);
  238. }
  239. if (!isUndefined(from._locale)) {
  240. to._locale = from._locale;
  241. }
  242. if (momentProperties.length > 0) {
  243. for (i in momentProperties) {
  244. prop = momentProperties[i];
  245. val = from[prop];
  246. if (!isUndefined(val)) {
  247. to[prop] = val;
  248. }
  249. }
  250. }
  251. return to;
  252. }
  253. var updateInProgress = false;
  254. // Moment prototype object
  255. function Moment(config) {
  256. copyConfig(this, config);
  257. this._d = new Date(config._d != null ? config._d.getTime() : NaN);
  258. if (!this.isValid()) {
  259. this._d = new Date(NaN);
  260. }
  261. // Prevent infinite loop in case updateOffset creates new moment
  262. // objects.
  263. if (updateInProgress === false) {
  264. updateInProgress = true;
  265. hooks.updateOffset(this);
  266. updateInProgress = false;
  267. }
  268. }
  269. function isMoment (obj) {
  270. return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
  271. }
  272. function absFloor (number) {
  273. if (number < 0) {
  274. // -0 -> 0
  275. return Math.ceil(number) || 0;
  276. } else {
  277. return Math.floor(number);
  278. }
  279. }
  280. function toInt(argumentForCoercion) {
  281. var coercedNumber = +argumentForCoercion,
  282. value = 0;
  283. if (coercedNumber !== 0 && isFinite(coercedNumber)) {
  284. value = absFloor(coercedNumber);
  285. }
  286. return value;
  287. }
  288. // compare two arrays, return the number of differences
  289. function compareArrays(array1, array2, dontConvert) {
  290. var len = Math.min(array1.length, array2.length),
  291. lengthDiff = Math.abs(array1.length - array2.length),
  292. diffs = 0,
  293. i;
  294. for (i = 0; i < len; i++) {
  295. if ((dontConvert && array1[i] !== array2[i]) ||
  296. (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
  297. diffs++;
  298. }
  299. }
  300. return diffs + lengthDiff;
  301. }
  302. function warn(msg) {
  303. if (hooks.suppressDeprecationWarnings === false &&
  304. (typeof console !== 'undefined') && console.warn) {
  305. console.warn('Deprecation warning: ' + msg);
  306. }
  307. }
  308. function deprecate(msg, fn) {
  309. var firstTime = true;
  310. return extend(function () {
  311. if (hooks.deprecationHandler != null) {
  312. hooks.deprecationHandler(null, msg);
  313. }
  314. if (firstTime) {
  315. var args = [];
  316. var arg;
  317. for (var i = 0; i < arguments.length; i++) {
  318. arg = '';
  319. if (typeof arguments[i] === 'object') {
  320. arg += '\n[' + i + '] ';
  321. for (var key in arguments[0]) {
  322. arg += key + ': ' + arguments[0][key] + ', ';
  323. }
  324. arg = arg.slice(0, -2); // Remove trailing comma and space
  325. } else {
  326. arg = arguments[i];
  327. }
  328. args.push(arg);
  329. }
  330. warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
  331. firstTime = false;
  332. }
  333. return fn.apply(this, arguments);
  334. }, fn);
  335. }
  336. var deprecations = {};
  337. function deprecateSimple(name, msg) {
  338. if (hooks.deprecationHandler != null) {
  339. hooks.deprecationHandler(name, msg);
  340. }
  341. if (!deprecations[name]) {
  342. warn(msg);
  343. deprecations[name] = true;
  344. }
  345. }
  346. hooks.suppressDeprecationWarnings = false;
  347. hooks.deprecationHandler = null;
  348. function isFunction(input) {
  349. return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
  350. }
  351. function set (config) {
  352. var prop, i;
  353. for (i in config) {
  354. prop = config[i];
  355. if (isFunction(prop)) {
  356. this[i] = prop;
  357. } else {
  358. this['_' + i] = prop;
  359. }
  360. }
  361. this._config = config;
  362. // Lenient ordinal parsing accepts just a number in addition to
  363. // number + (possibly) stuff coming from _ordinalParseLenient.
  364. this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
  365. }
  366. function mergeConfigs(parentConfig, childConfig) {
  367. var res = extend({}, parentConfig), prop;
  368. for (prop in childConfig) {
  369. if (hasOwnProp(childConfig, prop)) {
  370. if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
  371. res[prop] = {};
  372. extend(res[prop], parentConfig[prop]);
  373. extend(res[prop], childConfig[prop]);
  374. } else if (childConfig[prop] != null) {
  375. res[prop] = childConfig[prop];
  376. } else {
  377. delete res[prop];
  378. }
  379. }
  380. }
  381. for (prop in parentConfig) {
  382. if (hasOwnProp(parentConfig, prop) &&
  383. !hasOwnProp(childConfig, prop) &&
  384. isObject(parentConfig[prop])) {
  385. // make sure changes to properties don't modify parent config
  386. res[prop] = extend({}, res[prop]);
  387. }
  388. }
  389. return res;
  390. }
  391. function Locale(config) {
  392. if (config != null) {
  393. this.set(config);
  394. }
  395. }
  396. var keys;
  397. if (Object.keys) {
  398. keys = Object.keys;
  399. } else {
  400. keys = function (obj) {
  401. var i, res = [];
  402. for (i in obj) {
  403. if (hasOwnProp(obj, i)) {
  404. res.push(i);
  405. }
  406. }
  407. return res;
  408. };
  409. }
  410. var keys$1 = keys;
  411. var defaultCalendar = {
  412. sameDay : '[Today at] LT',
  413. nextDay : '[Tomorrow at] LT',
  414. nextWeek : 'dddd [at] LT',
  415. lastDay : '[Yesterday at] LT',
  416. lastWeek : '[Last] dddd [at] LT',
  417. sameElse : 'L'
  418. };
  419. function calendar (key, mom, now) {
  420. var output = this._calendar[key] || this._calendar['sameElse'];
  421. return isFunction(output) ? output.call(mom, now) : output;
  422. }
  423. var defaultLongDateFormat = {
  424. LTS : 'h:mm:ss A',
  425. LT : 'h:mm A',
  426. L : 'MM/DD/YYYY',
  427. LL : 'MMMM D, YYYY',
  428. LLL : 'MMMM D, YYYY h:mm A',
  429. LLLL : 'dddd, MMMM D, YYYY h:mm A'
  430. };
  431. function longDateFormat (key) {
  432. var format = this._longDateFormat[key],
  433. formatUpper = this._longDateFormat[key.toUpperCase()];
  434. if (format || !formatUpper) {
  435. return format;
  436. }
  437. this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
  438. return val.slice(1);
  439. });
  440. return this._longDateFormat[key];
  441. }
  442. var defaultInvalidDate = 'Invalid date';
  443. function invalidDate () {
  444. return this._invalidDate;
  445. }
  446. var defaultOrdinal = '%d';
  447. var defaultOrdinalParse = /\d{1,2}/;
  448. function ordinal (number) {
  449. return this._ordinal.replace('%d', number);
  450. }
  451. var defaultRelativeTime = {
  452. future : 'in %s',
  453. past : '%s ago',
  454. s : 'a few seconds',
  455. m : 'a minute',
  456. mm : '%d minutes',
  457. h : 'an hour',
  458. hh : '%d hours',
  459. d : 'a day',
  460. dd : '%d days',
  461. M : 'a month',
  462. MM : '%d months',
  463. y : 'a year',
  464. yy : '%d years'
  465. };
  466. function relativeTime (number, withoutSuffix, string, isFuture) {
  467. var output = this._relativeTime[string];
  468. return (isFunction(output)) ?
  469. output(number, withoutSuffix, string, isFuture) :
  470. output.replace(/%d/i, number);
  471. }
  472. function pastFuture (diff, output) {
  473. var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
  474. return isFunction(format) ? format(output) : format.replace(/%s/i, output);
  475. }
  476. var aliases = {};
  477. function addUnitAlias (unit, shorthand) {
  478. var lowerCase = unit.toLowerCase();
  479. aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
  480. }
  481. function normalizeUnits(units) {
  482. return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
  483. }
  484. function normalizeObjectUnits(inputObject) {
  485. var normalizedInput = {},
  486. normalizedProp,
  487. prop;
  488. for (prop in inputObject) {
  489. if (hasOwnProp(inputObject, prop)) {
  490. normalizedProp = normalizeUnits(prop);
  491. if (normalizedProp) {
  492. normalizedInput[normalizedProp] = inputObject[prop];
  493. }
  494. }
  495. }
  496. return normalizedInput;
  497. }
  498. var priorities = {};
  499. function addUnitPriority(unit, priority) {
  500. priorities[unit] = priority;
  501. }
  502. function getPrioritizedUnits(unitsObj) {
  503. var units = [];
  504. for (var u in unitsObj) {
  505. units.push({unit: u, priority: priorities[u]});
  506. }
  507. units.sort(function (a, b) {
  508. return a.priority - b.priority;
  509. });
  510. return units;
  511. }
  512. function makeGetSet (unit, keepTime) {
  513. return function (value) {
  514. if (value != null) {
  515. set$1(this, unit, value);
  516. hooks.updateOffset(this, keepTime);
  517. return this;
  518. } else {
  519. return get(this, unit);
  520. }
  521. };
  522. }
  523. function get (mom, unit) {
  524. return mom.isValid() ?
  525. mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
  526. }
  527. function set$1 (mom, unit, value) {
  528. if (mom.isValid()) {
  529. mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
  530. }
  531. }
  532. // MOMENTS
  533. function stringGet (units) {
  534. units = normalizeUnits(units);
  535. if (isFunction(this[units])) {
  536. return this[units]();
  537. }
  538. return this;
  539. }
  540. function stringSet (units, value) {
  541. if (typeof units === 'object') {
  542. units = normalizeObjectUnits(units);
  543. var prioritized = getPrioritizedUnits(units);
  544. for (var i = 0; i < prioritized.length; i++) {
  545. this[prioritized[i].unit](units[prioritized[i].unit]);
  546. }
  547. } else {
  548. units = normalizeUnits(units);
  549. if (isFunction(this[units])) {
  550. return this[units](value);
  551. }
  552. }
  553. return this;
  554. }
  555. function zeroFill(number, targetLength, forceSign) {
  556. var absNumber = '' + Math.abs(number),
  557. zerosToFill = targetLength - absNumber.length,
  558. sign = number >= 0;
  559. return (sign ? (forceSign ? '+' : '') : '-') +
  560. Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
  561. }
  562. var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
  563. var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
  564. var formatFunctions = {};
  565. var formatTokenFunctions = {};
  566. // token: 'M'
  567. // padded: ['MM', 2]
  568. // ordinal: 'Mo'
  569. // callback: function () { this.month() + 1 }
  570. function addFormatToken (token, padded, ordinal, callback) {
  571. var func = callback;
  572. if (typeof callback === 'string') {
  573. func = function () {
  574. return this[callback]();
  575. };
  576. }
  577. if (token) {
  578. formatTokenFunctions[token] = func;
  579. }
  580. if (padded) {
  581. formatTokenFunctions[padded[0]] = function () {
  582. return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
  583. };
  584. }
  585. if (ordinal) {
  586. formatTokenFunctions[ordinal] = function () {
  587. return this.localeData().ordinal(func.apply(this, arguments), token);
  588. };
  589. }
  590. }
  591. function removeFormattingTokens(input) {
  592. if (input.match(/\[[\s\S]/)) {
  593. return input.replace(/^\[|\]$/g, '');
  594. }
  595. return input.replace(/\\/g, '');
  596. }
  597. function makeFormatFunction(format) {
  598. var array = format.match(formattingTokens), i, length;
  599. for (i = 0, length = array.length; i < length; i++) {
  600. if (formatTokenFunctions[array[i]]) {
  601. array[i] = formatTokenFunctions[array[i]];
  602. } else {
  603. array[i] = removeFormattingTokens(array[i]);
  604. }
  605. }
  606. return function (mom) {
  607. var output = '', i;
  608. for (i = 0; i < length; i++) {
  609. output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
  610. }
  611. return output;
  612. };
  613. }
  614. // format date using native date object
  615. function formatMoment(m, format) {
  616. if (!m.isValid()) {
  617. return m.localeData().invalidDate();
  618. }
  619. format = expandFormat(format, m.localeData());
  620. formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
  621. return formatFunctions[format](m);
  622. }
  623. function expandFormat(format, locale) {
  624. var i = 5;
  625. function replaceLongDateFormatTokens(input) {
  626. return locale.longDateFormat(input) || input;
  627. }
  628. localFormattingTokens.lastIndex = 0;
  629. while (i >= 0 && localFormattingTokens.test(format)) {
  630. format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
  631. localFormattingTokens.lastIndex = 0;
  632. i -= 1;
  633. }
  634. return format;
  635. }
  636. var match1 = /\d/; // 0 - 9
  637. var match2 = /\d\d/; // 00 - 99
  638. var match3 = /\d{3}/; // 000 - 999
  639. var match4 = /\d{4}/; // 0000 - 9999
  640. var match6 = /[+-]?\d{6}/; // -999999 - 999999
  641. var match1to2 = /\d\d?/; // 0 - 99
  642. var match3to4 = /\d\d\d\d?/; // 999 - 9999
  643. var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
  644. var match1to3 = /\d{1,3}/; // 0 - 999
  645. var match1to4 = /\d{1,4}/; // 0 - 9999
  646. var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
  647. var matchUnsigned = /\d+/; // 0 - inf
  648. var matchSigned = /[+-]?\d+/; // -inf - inf
  649. var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
  650. var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
  651. var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
  652. // any word (or two) characters or numbers including two/three word month in arabic.
  653. // includes scottish gaelic two word and hyphenated months
  654. var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
  655. var regexes = {};
  656. function addRegexToken (token, regex, strictRegex) {
  657. regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
  658. return (isStrict && strictRegex) ? strictRegex : regex;
  659. };
  660. }
  661. function getParseRegexForToken (token, config) {
  662. if (!hasOwnProp(regexes, token)) {
  663. return new RegExp(unescapeFormat(token));
  664. }
  665. return regexes[token](config._strict, config._locale);
  666. }
  667. // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
  668. function unescapeFormat(s) {
  669. return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
  670. return p1 || p2 || p3 || p4;
  671. }));
  672. }
  673. function regexEscape(s) {
  674. return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
  675. }
  676. var tokens = {};
  677. function addParseToken (token, callback) {
  678. var i, func = callback;
  679. if (typeof token === 'string') {
  680. token = [token];
  681. }
  682. if (isNumber(callback)) {
  683. func = function (input, array) {
  684. array[callback] = toInt(input);
  685. };
  686. }
  687. for (i = 0; i < token.length; i++) {
  688. tokens[token[i]] = func;
  689. }
  690. }
  691. function addWeekParseToken (token, callback) {
  692. addParseToken(token, function (input, array, config, token) {
  693. config._w = config._w || {};
  694. callback(input, config._w, config, token);
  695. });
  696. }
  697. function addTimeToArrayFromToken(token, input, config) {
  698. if (input != null && hasOwnProp(tokens, token)) {
  699. tokens[token](input, config._a, config, token);
  700. }
  701. }
  702. var YEAR = 0;
  703. var MONTH = 1;
  704. var DATE = 2;
  705. var HOUR = 3;
  706. var MINUTE = 4;
  707. var SECOND = 5;
  708. var MILLISECOND = 6;
  709. var WEEK = 7;
  710. var WEEKDAY = 8;
  711. var indexOf;
  712. if (Array.prototype.indexOf) {
  713. indexOf = Array.prototype.indexOf;
  714. } else {
  715. indexOf = function (o) {
  716. // I know
  717. var i;
  718. for (i = 0; i < this.length; ++i) {
  719. if (this[i] === o) {
  720. return i;
  721. }
  722. }
  723. return -1;
  724. };
  725. }
  726. var indexOf$1 = indexOf;
  727. function daysInMonth(year, month) {
  728. return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
  729. }
  730. // FORMATTING
  731. addFormatToken('M', ['MM', 2], 'Mo', function () {
  732. return this.month() + 1;
  733. });
  734. addFormatToken('MMM', 0, 0, function (format) {
  735. return this.localeData().monthsShort(this, format);
  736. });
  737. addFormatToken('MMMM', 0, 0, function (format) {
  738. return this.localeData().months(this, format);
  739. });
  740. // ALIASES
  741. addUnitAlias('month', 'M');
  742. // PRIORITY
  743. addUnitPriority('month', 8);
  744. // PARSING
  745. addRegexToken('M', match1to2);
  746. addRegexToken('MM', match1to2, match2);
  747. addRegexToken('MMM', function (isStrict, locale) {
  748. return locale.monthsShortRegex(isStrict);
  749. });
  750. addRegexToken('MMMM', function (isStrict, locale) {
  751. return locale.monthsRegex(isStrict);
  752. });
  753. addParseToken(['M', 'MM'], function (input, array) {
  754. array[MONTH] = toInt(input) - 1;
  755. });
  756. addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
  757. var month = config._locale.monthsParse(input, token, config._strict);
  758. // if we didn't find a month name, mark the date as invalid.
  759. if (month != null) {
  760. array[MONTH] = month;
  761. } else {
  762. getParsingFlags(config).invalidMonth = input;
  763. }
  764. });
  765. // LOCALES
  766. var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
  767. var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
  768. function localeMonths (m, format) {
  769. if (!m) {
  770. return this._months;
  771. }
  772. return isArray(this._months) ? this._months[m.month()] :
  773. this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
  774. }
  775. var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
  776. function localeMonthsShort (m, format) {
  777. if (!m) {
  778. return this._monthsShort;
  779. }
  780. return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
  781. this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
  782. }
  783. function handleStrictParse(monthName, format, strict) {
  784. var i, ii, mom, llc = monthName.toLocaleLowerCase();
  785. if (!this._monthsParse) {
  786. // this is not used
  787. this._monthsParse = [];
  788. this._longMonthsParse = [];
  789. this._shortMonthsParse = [];
  790. for (i = 0; i < 12; ++i) {
  791. mom = createUTC([2000, i]);
  792. this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
  793. this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
  794. }
  795. }
  796. if (strict) {
  797. if (format === 'MMM') {
  798. ii = indexOf$1.call(this._shortMonthsParse, llc);
  799. return ii !== -1 ? ii : null;
  800. } else {
  801. ii = indexOf$1.call(this._longMonthsParse, llc);
  802. return ii !== -1 ? ii : null;
  803. }
  804. } else {
  805. if (format === 'MMM') {
  806. ii = indexOf$1.call(this._shortMonthsParse, llc);
  807. if (ii !== -1) {
  808. return ii;
  809. }
  810. ii = indexOf$1.call(this._longMonthsParse, llc);
  811. return ii !== -1 ? ii : null;
  812. } else {
  813. ii = indexOf$1.call(this._longMonthsParse, llc);
  814. if (ii !== -1) {
  815. return ii;
  816. }
  817. ii = indexOf$1.call(this._shortMonthsParse, llc);
  818. return ii !== -1 ? ii : null;
  819. }
  820. }
  821. }
  822. function localeMonthsParse (monthName, format, strict) {
  823. var i, mom, regex;
  824. if (this._monthsParseExact) {
  825. return handleStrictParse.call(this, monthName, format, strict);
  826. }
  827. if (!this._monthsParse) {
  828. this._monthsParse = [];
  829. this._longMonthsParse = [];
  830. this._shortMonthsParse = [];
  831. }
  832. // TODO: add sorting
  833. // Sorting makes sure if one month (or abbr) is a prefix of another
  834. // see sorting in computeMonthsParse
  835. for (i = 0; i < 12; i++) {
  836. // make the regex if we don't have it already
  837. mom = createUTC([2000, i]);
  838. if (strict && !this._longMonthsParse[i]) {
  839. this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
  840. this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
  841. }
  842. if (!strict && !this._monthsParse[i]) {
  843. regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
  844. this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
  845. }
  846. // test the regex
  847. if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
  848. return i;
  849. } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
  850. return i;
  851. } else if (!strict && this._monthsParse[i].test(monthName)) {
  852. return i;
  853. }
  854. }
  855. }
  856. // MOMENTS
  857. function setMonth (mom, value) {
  858. var dayOfMonth;
  859. if (!mom.isValid()) {
  860. // No op
  861. return mom;
  862. }
  863. if (typeof value === 'string') {
  864. if (/^\d+$/.test(value)) {
  865. value = toInt(value);
  866. } else {
  867. value = mom.localeData().monthsParse(value);
  868. // TODO: Another silent failure?
  869. if (!isNumber(value)) {
  870. return mom;
  871. }
  872. }
  873. }
  874. dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
  875. mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
  876. return mom;
  877. }
  878. function getSetMonth (value) {
  879. if (value != null) {
  880. setMonth(this, value);
  881. hooks.updateOffset(this, true);
  882. return this;
  883. } else {
  884. return get(this, 'Month');
  885. }
  886. }
  887. function getDaysInMonth () {
  888. return daysInMonth(this.year(), this.month());
  889. }
  890. var defaultMonthsShortRegex = matchWord;
  891. function monthsShortRegex (isStrict) {
  892. if (this._monthsParseExact) {
  893. if (!hasOwnProp(this, '_monthsRegex')) {
  894. computeMonthsParse.call(this);
  895. }
  896. if (isStrict) {
  897. return this._monthsShortStrictRegex;
  898. } else {
  899. return this._monthsShortRegex;
  900. }
  901. } else {
  902. if (!hasOwnProp(this, '_monthsShortRegex')) {
  903. this._monthsShortRegex = defaultMonthsShortRegex;
  904. }
  905. return this._monthsShortStrictRegex && isStrict ?
  906. this._monthsShortStrictRegex : this._monthsShortRegex;
  907. }
  908. }
  909. var defaultMonthsRegex = matchWord;
  910. function monthsRegex (isStrict) {
  911. if (this._monthsParseExact) {
  912. if (!hasOwnProp(this, '_monthsRegex')) {
  913. computeMonthsParse.call(this);
  914. }
  915. if (isStrict) {
  916. return this._monthsStrictRegex;
  917. } else {
  918. return this._monthsRegex;
  919. }
  920. } else {
  921. if (!hasOwnProp(this, '_monthsRegex')) {
  922. this._monthsRegex = defaultMonthsRegex;
  923. }
  924. return this._monthsStrictRegex && isStrict ?
  925. this._monthsStrictRegex : this._monthsRegex;
  926. }
  927. }
  928. function computeMonthsParse () {
  929. function cmpLenRev(a, b) {
  930. return b.length - a.length;
  931. }
  932. var shortPieces = [], longPieces = [], mixedPieces = [],
  933. i, mom;
  934. for (i = 0; i < 12; i++) {
  935. // make the regex if we don't have it already
  936. mom = createUTC([2000, i]);
  937. shortPieces.push(this.monthsShort(mom, ''));
  938. longPieces.push(this.months(mom, ''));
  939. mixedPieces.push(this.months(mom, ''));
  940. mixedPieces.push(this.monthsShort(mom, ''));
  941. }
  942. // Sorting makes sure if one month (or abbr) is a prefix of another it
  943. // will match the longer piece.
  944. shortPieces.sort(cmpLenRev);
  945. longPieces.sort(cmpLenRev);
  946. mixedPieces.sort(cmpLenRev);
  947. for (i = 0; i < 12; i++) {
  948. shortPieces[i] = regexEscape(shortPieces[i]);
  949. longPieces[i] = regexEscape(longPieces[i]);
  950. }
  951. for (i = 0; i < 24; i++) {
  952. mixedPieces[i] = regexEscape(mixedPieces[i]);
  953. }
  954. this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
  955. this._monthsShortRegex = this._monthsRegex;
  956. this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
  957. this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
  958. }
  959. // FORMATTING
  960. addFormatToken('Y', 0, 0, function () {
  961. var y = this.year();
  962. return y <= 9999 ? '' + y : '+' + y;
  963. });
  964. addFormatToken(0, ['YY', 2], 0, function () {
  965. return this.year() % 100;
  966. });
  967. addFormatToken(0, ['YYYY', 4], 0, 'year');
  968. addFormatToken(0, ['YYYYY', 5], 0, 'year');
  969. addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
  970. // ALIASES
  971. addUnitAlias('year', 'y');
  972. // PRIORITIES
  973. addUnitPriority('year', 1);
  974. // PARSING
  975. addRegexToken('Y', matchSigned);
  976. addRegexToken('YY', match1to2, match2);
  977. addRegexToken('YYYY', match1to4, match4);
  978. addRegexToken('YYYYY', match1to6, match6);
  979. addRegexToken('YYYYYY', match1to6, match6);
  980. addParseToken(['YYYYY', 'YYYYYY'], YEAR);
  981. addParseToken('YYYY', function (input, array) {
  982. array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
  983. });
  984. addParseToken('YY', function (input, array) {
  985. array[YEAR] = hooks.parseTwoDigitYear(input);
  986. });
  987. addParseToken('Y', function (input, array) {
  988. array[YEAR] = parseInt(input, 10);
  989. });
  990. // HELPERS
  991. function daysInYear(year) {
  992. return isLeapYear(year) ? 366 : 365;
  993. }
  994. function isLeapYear(year) {
  995. return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
  996. }
  997. // HOOKS
  998. hooks.parseTwoDigitYear = function (input) {
  999. return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
  1000. };
  1001. // MOMENTS
  1002. var getSetYear = makeGetSet('FullYear', true);
  1003. function getIsLeapYear () {
  1004. return isLeapYear(this.year());
  1005. }
  1006. function createDate (y, m, d, h, M, s, ms) {
  1007. //can't just apply() to create a date:
  1008. //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
  1009. var date = new Date(y, m, d, h, M, s, ms);
  1010. //the date constructor remaps years 0-99 to 1900-1999
  1011. if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
  1012. date.setFullYear(y);
  1013. }
  1014. return date;
  1015. }
  1016. function createUTCDate (y) {
  1017. var date = new Date(Date.UTC.apply(null, arguments));
  1018. //the Date.UTC function remaps years 0-99 to 1900-1999
  1019. if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
  1020. date.setUTCFullYear(y);
  1021. }
  1022. return date;
  1023. }
  1024. // start-of-first-week - start-of-year
  1025. function firstWeekOffset(year, dow, doy) {
  1026. var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
  1027. fwd = 7 + dow - doy,
  1028. // first-week day local weekday -- which local weekday is fwd
  1029. fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
  1030. return -fwdlw + fwd - 1;
  1031. }
  1032. //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
  1033. function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
  1034. var localWeekday = (7 + weekday - dow) % 7,
  1035. weekOffset = firstWeekOffset(year, dow, doy),
  1036. dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
  1037. resYear, resDayOfYear;
  1038. if (dayOfYear <= 0) {
  1039. resYear = year - 1;
  1040. resDayOfYear = daysInYear(resYear) + dayOfYear;
  1041. } else if (dayOfYear > daysInYear(year)) {
  1042. resYear = year + 1;
  1043. resDayOfYear = dayOfYear - daysInYear(year);
  1044. } else {
  1045. resYear = year;
  1046. resDayOfYear = dayOfYear;
  1047. }
  1048. return {
  1049. year: resYear,
  1050. dayOfYear: resDayOfYear
  1051. };
  1052. }
  1053. function weekOfYear(mom, dow, doy) {
  1054. var weekOffset = firstWeekOffset(mom.year(), dow, doy),
  1055. week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
  1056. resWeek, resYear;
  1057. if (week < 1) {
  1058. resYear = mom.year() - 1;
  1059. resWeek = week + weeksInYear(resYear, dow, doy);
  1060. } else if (week > weeksInYear(mom.year(), dow, doy)) {
  1061. resWeek = week - weeksInYear(mom.year(), dow, doy);
  1062. resYear = mom.year() + 1;
  1063. } else {
  1064. resYear = mom.year();
  1065. resWeek = week;
  1066. }
  1067. return {
  1068. week: resWeek,
  1069. year: resYear
  1070. };
  1071. }
  1072. function weeksInYear(year, dow, doy) {
  1073. var weekOffset = firstWeekOffset(year, dow, doy),
  1074. weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
  1075. return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
  1076. }
  1077. // FORMATTING
  1078. addFormatToken('w', ['ww', 2], 'wo', 'week');
  1079. addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
  1080. // ALIASES
  1081. addUnitAlias('week', 'w');
  1082. addUnitAlias('isoWeek', 'W');
  1083. // PRIORITIES
  1084. addUnitPriority('week', 5);
  1085. addUnitPriority('isoWeek', 5);
  1086. // PARSING
  1087. addRegexToken('w', match1to2);
  1088. addRegexToken('ww', match1to2, match2);
  1089. addRegexToken('W', match1to2);
  1090. addRegexToken('WW', match1to2, match2);
  1091. addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
  1092. week[token.substr(0, 1)] = toInt(input);
  1093. });
  1094. // HELPERS
  1095. // LOCALES
  1096. function localeWeek (mom) {
  1097. return weekOfYear(mom, this._week.dow, this._week.doy).week;
  1098. }
  1099. var defaultLocaleWeek = {
  1100. dow : 0, // Sunday is the first day of the week.
  1101. doy : 6 // The week that contains Jan 1st is the first week of the year.
  1102. };
  1103. function localeFirstDayOfWeek () {
  1104. return this._week.dow;
  1105. }
  1106. function localeFirstDayOfYear () {
  1107. return this._week.doy;
  1108. }
  1109. // MOMENTS
  1110. function getSetWeek (input) {
  1111. var week = this.localeData().week(this);
  1112. return input == null ? week : this.add((input - week) * 7, 'd');
  1113. }
  1114. function getSetISOWeek (input) {
  1115. var week = weekOfYear(this, 1, 4).week;
  1116. return input == null ? week : this.add((input - week) * 7, 'd');
  1117. }
  1118. // FORMATTING
  1119. addFormatToken('d', 0, 'do', 'day');
  1120. addFormatToken('dd', 0, 0, function (format) {
  1121. return this.localeData().weekdaysMin(this, format);
  1122. });
  1123. addFormatToken('ddd', 0, 0, function (format) {
  1124. return this.localeData().weekdaysShort(this, format);
  1125. });
  1126. addFormatToken('dddd', 0, 0, function (format) {
  1127. return this.localeData().weekdays(this, format);
  1128. });
  1129. addFormatToken('e', 0, 0, 'weekday');
  1130. addFormatToken('E', 0, 0, 'isoWeekday');
  1131. // ALIASES
  1132. addUnitAlias('day', 'd');
  1133. addUnitAlias('weekday', 'e');
  1134. addUnitAlias('isoWeekday', 'E');
  1135. // PRIORITY
  1136. addUnitPriority('day', 11);
  1137. addUnitPriority('weekday', 11);
  1138. addUnitPriority('isoWeekday', 11);
  1139. // PARSING
  1140. addRegexToken('d', match1to2);
  1141. addRegexToken('e', match1to2);
  1142. addRegexToken('E', match1to2);
  1143. addRegexToken('dd', function (isStrict, locale) {
  1144. return locale.weekdaysMinRegex(isStrict);
  1145. });
  1146. addRegexToken('ddd', function (isStrict, locale) {
  1147. return locale.weekdaysShortRegex(isStrict);
  1148. });
  1149. addRegexToken('dddd', function (isStrict, locale) {
  1150. return locale.weekdaysRegex(isStrict);
  1151. });
  1152. addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
  1153. var weekday = config._locale.weekdaysParse(input, token, config._strict);
  1154. // if we didn't get a weekday name, mark the date as invalid
  1155. if (weekday != null) {
  1156. week.d = weekday;
  1157. } else {
  1158. getParsingFlags(config).invalidWeekday = input;
  1159. }
  1160. });
  1161. addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
  1162. week[token] = toInt(input);
  1163. });
  1164. // HELPERS
  1165. function parseWeekday(input, locale) {
  1166. if (typeof input !== 'string') {
  1167. return input;
  1168. }
  1169. if (!isNaN(input)) {
  1170. return parseInt(input, 10);
  1171. }
  1172. input = locale.weekdaysParse(input);
  1173. if (typeof input === 'number') {
  1174. return input;
  1175. }
  1176. return null;
  1177. }
  1178. function parseIsoWeekday(input, locale) {
  1179. if (typeof input === 'string') {
  1180. return locale.weekdaysParse(input) % 7 || 7;
  1181. }
  1182. return isNaN(input) ? null : input;
  1183. }
  1184. // LOCALES
  1185. var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
  1186. function localeWeekdays (m, format) {
  1187. if (!m) {
  1188. return this._weekdays;
  1189. }
  1190. return isArray(this._weekdays) ? this._weekdays[m.day()] :
  1191. this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
  1192. }
  1193. var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
  1194. function localeWeekdaysShort (m) {
  1195. return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
  1196. }
  1197. var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
  1198. function localeWeekdaysMin (m) {
  1199. return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
  1200. }
  1201. function handleStrictParse$1(weekdayName, format, strict) {
  1202. var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
  1203. if (!this._weekdaysParse) {
  1204. this._weekdaysParse = [];
  1205. this._shortWeekdaysParse = [];
  1206. this._minWeekdaysParse = [];
  1207. for (i = 0; i < 7; ++i) {
  1208. mom = createUTC([2000, 1]).day(i);
  1209. this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
  1210. this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
  1211. this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
  1212. }
  1213. }
  1214. if (strict) {
  1215. if (format === 'dddd') {
  1216. ii = indexOf$1.call(this._weekdaysParse, llc);
  1217. return ii !== -1 ? ii : null;
  1218. } else if (format === 'ddd') {
  1219. ii = indexOf$1.call(this._shortWeekdaysParse, llc);
  1220. return ii !== -1 ? ii : null;
  1221. } else {
  1222. ii = indexOf$1.call(this._minWeekdaysParse, llc);
  1223. return ii !== -1 ? ii : null;
  1224. }
  1225. } else {
  1226. if (format === 'dddd') {
  1227. ii = indexOf$1.call(this._weekdaysParse, llc);
  1228. if (ii !== -1) {
  1229. return ii;
  1230. }
  1231. ii = indexOf$1.call(this._shortWeekdaysParse, llc);
  1232. if (ii !== -1) {
  1233. return ii;
  1234. }
  1235. ii = indexOf$1.call(this._minWeekdaysParse, llc);
  1236. return ii !== -1 ? ii : null;
  1237. } else if (format === 'ddd') {
  1238. ii = indexOf$1.call(this._shortWeekdaysParse, llc);
  1239. if (ii !== -1) {
  1240. return ii;
  1241. }
  1242. ii = indexOf$1.call(this._weekdaysParse, llc);
  1243. if (ii !== -1) {
  1244. return ii;
  1245. }
  1246. ii = indexOf$1.call(this._minWeekdaysParse, llc);
  1247. return ii !== -1 ? ii : null;
  1248. } else {
  1249. ii = indexOf$1.call(this._minWeekdaysParse, llc);
  1250. if (ii !== -1) {
  1251. return ii;
  1252. }
  1253. ii = indexOf$1.call(this._weekdaysParse, llc);
  1254. if (ii !== -1) {
  1255. return ii;
  1256. }
  1257. ii = indexOf$1.call(this._shortWeekdaysParse, llc);
  1258. return ii !== -1 ? ii : null;
  1259. }
  1260. }
  1261. }
  1262. function localeWeekdaysParse (weekdayName, format, strict) {
  1263. var i, mom, regex;
  1264. if (this._weekdaysParseExact) {
  1265. return handleStrictParse$1.call(this, weekdayName, format, strict);
  1266. }
  1267. if (!this._weekdaysParse) {
  1268. this._weekdaysParse = [];
  1269. this._minWeekdaysParse = [];
  1270. this._shortWeekdaysParse = [];
  1271. this._fullWeekdaysParse = [];
  1272. }
  1273. for (i = 0; i < 7; i++) {
  1274. // make the regex if we don't have it already
  1275. mom = createUTC([2000, 1]).day(i);
  1276. if (strict && !this._fullWeekdaysParse[i]) {
  1277. this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
  1278. this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
  1279. this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
  1280. }
  1281. if (!this._weekdaysParse[i]) {
  1282. regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
  1283. this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
  1284. }
  1285. // test the regex
  1286. if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
  1287. return i;
  1288. } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
  1289. return i;
  1290. } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
  1291. return i;
  1292. } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
  1293. return i;
  1294. }
  1295. }
  1296. }
  1297. // MOMENTS
  1298. function getSetDayOfWeek (input) {
  1299. if (!this.isValid()) {
  1300. return input != null ? this : NaN;
  1301. }
  1302. var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
  1303. if (input != null) {
  1304. input = parseWeekday(input, this.localeData());
  1305. return this.add(input - day, 'd');
  1306. } else {
  1307. return day;
  1308. }
  1309. }
  1310. function getSetLocaleDayOfWeek (input) {
  1311. if (!this.isValid()) {
  1312. return input != null ? this : NaN;
  1313. }
  1314. var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
  1315. return input == null ? weekday : this.add(input - weekday, 'd');
  1316. }
  1317. function getSetISODayOfWeek (input) {
  1318. if (!this.isValid()) {
  1319. return input != null ? this : NaN;
  1320. }
  1321. // behaves the same as moment#day except
  1322. // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
  1323. // as a setter, sunday should belong to the previous week.
  1324. if (input != null) {
  1325. var weekday = parseIsoWeekday(input, this.localeData());
  1326. return this.day(this.day() % 7 ? weekday : weekday - 7);
  1327. } else {
  1328. return this.day() || 7;
  1329. }
  1330. }
  1331. var defaultWeekdaysRegex = matchWord;
  1332. function weekdaysRegex (isStrict) {
  1333. if (this._weekdaysParseExact) {
  1334. if (!hasOwnProp(this, '_weekdaysRegex')) {
  1335. computeWeekdaysParse.call(this);
  1336. }
  1337. if (isStrict) {
  1338. return this._weekdaysStrictRegex;
  1339. } else {
  1340. return this._weekdaysRegex;
  1341. }
  1342. } else {
  1343. if (!hasOwnProp(this, '_weekdaysRegex')) {
  1344. this._weekdaysRegex = defaultWeekdaysRegex;
  1345. }
  1346. return this._weekdaysStrictRegex && isStrict ?
  1347. this._weekdaysStrictRegex : this._weekdaysRegex;
  1348. }
  1349. }
  1350. var defaultWeekdaysShortRegex = matchWord;
  1351. function weekdaysShortRegex (isStrict) {
  1352. if (this._weekdaysParseExact) {
  1353. if (!hasOwnProp(this, '_weekdaysRegex')) {
  1354. computeWeekdaysParse.call(this);
  1355. }
  1356. if (isStrict) {
  1357. return this._weekdaysShortStrictRegex;
  1358. } else {
  1359. return this._weekdaysShortRegex;
  1360. }
  1361. } else {
  1362. if (!hasOwnProp(this, '_weekdaysShortRegex')) {
  1363. this._weekdaysShortRegex = defaultWeekdaysShortRegex;
  1364. }
  1365. return this._weekdaysShortStrictRegex && isStrict ?
  1366. this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
  1367. }
  1368. }
  1369. var defaultWeekdaysMinRegex = matchWord;
  1370. function weekdaysMinRegex (isStrict) {
  1371. if (this._weekdaysParseExact) {
  1372. if (!hasOwnProp(this, '_weekdaysRegex')) {
  1373. computeWeekdaysParse.call(this);
  1374. }
  1375. if (isStrict) {
  1376. return this._weekdaysMinStrictRegex;
  1377. } else {
  1378. return this._weekdaysMinRegex;
  1379. }
  1380. } else {
  1381. if (!hasOwnProp(this, '_weekdaysMinRegex')) {
  1382. this._weekdaysMinRegex = defaultWeekdaysMinRegex;
  1383. }
  1384. return this._weekdaysMinStrictRegex && isStrict ?
  1385. this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
  1386. }
  1387. }
  1388. function computeWeekdaysParse () {
  1389. function cmpLenRev(a, b) {
  1390. return b.length - a.length;
  1391. }
  1392. var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
  1393. i, mom, minp, shortp, longp;
  1394. for (i = 0; i < 7; i++) {
  1395. // make the regex if we don't have it already
  1396. mom = createUTC([2000, 1]).day(i);
  1397. minp = this.weekdaysMin(mom, '');
  1398. shortp = this.weekdaysShort(mom, '');
  1399. longp = this.weekdays(mom, '');
  1400. minPieces.push(minp);
  1401. shortPieces.push(shortp);
  1402. longPieces.push(longp);
  1403. mixedPieces.push(minp);
  1404. mixedPieces.push(shortp);
  1405. mixedPieces.push(longp);
  1406. }
  1407. // Sorting makes sure if one weekday (or abbr) is a prefix of another it
  1408. // will match the longer piece.
  1409. minPieces.sort(cmpLenRev);
  1410. shortPieces.sort(cmpLenRev);
  1411. longPieces.sort(cmpLenRev);
  1412. mixedPieces.sort(cmpLenRev);
  1413. for (i = 0; i < 7; i++) {
  1414. shortPieces[i] = regexEscape(shortPieces[i]);
  1415. longPieces[i] = regexEscape(longPieces[i]);
  1416. mixedPieces[i] = regexEscape(mixedPieces[i]);
  1417. }
  1418. this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
  1419. this._weekdaysShortRegex = this._weekdaysRegex;
  1420. this._weekdaysMinRegex = this._weekdaysRegex;
  1421. this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
  1422. this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
  1423. this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
  1424. }
  1425. // FORMATTING
  1426. function hFormat() {
  1427. return this.hours() % 12 || 12;
  1428. }
  1429. function kFormat() {
  1430. return this.hours() || 24;
  1431. }
  1432. addFormatToken('H', ['HH', 2], 0, 'hour');
  1433. addFormatToken('h', ['hh', 2], 0, hFormat);
  1434. addFormatToken('k', ['kk', 2], 0, kFormat);
  1435. addFormatToken('hmm', 0, 0, function () {
  1436. return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
  1437. });
  1438. addFormatToken('hmmss', 0, 0, function () {
  1439. return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
  1440. zeroFill(this.seconds(), 2);
  1441. });
  1442. addFormatToken('Hmm', 0, 0, function () {
  1443. return '' + this.hours() + zeroFill(this.minutes(), 2);
  1444. });
  1445. addFormatToken('Hmmss', 0, 0, function () {
  1446. return '' + this.hours() + zeroFill(this.minutes(), 2) +
  1447. zeroFill(this.seconds(), 2);
  1448. });
  1449. function meridiem (token, lowercase) {
  1450. addFormatToken(token, 0, 0, function () {
  1451. return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
  1452. });
  1453. }
  1454. meridiem('a', true);
  1455. meridiem('A', false);
  1456. // ALIASES
  1457. addUnitAlias('hour', 'h');
  1458. // PRIORITY
  1459. addUnitPriority('hour', 13);
  1460. // PARSING
  1461. function matchMeridiem (isStrict, locale) {
  1462. return locale._meridiemParse;
  1463. }
  1464. addRegexToken('a', matchMeridiem);
  1465. addRegexToken('A', matchMeridiem);
  1466. addRegexToken('H', match1to2);
  1467. addRegexToken('h', match1to2);
  1468. addRegexToken('HH', match1to2, match2);
  1469. addRegexToken('hh', match1to2, match2);
  1470. addRegexToken('hmm', match3to4);
  1471. addRegexToken('hmmss', match5to6);
  1472. addRegexToken('Hmm', match3to4);
  1473. addRegexToken('Hmmss', match5to6);
  1474. addParseToken(['H', 'HH'], HOUR);
  1475. addParseToken(['a', 'A'], function (input, array, config) {
  1476. config._isPm = config._locale.isPM(input);
  1477. config._meridiem = input;
  1478. });
  1479. addParseToken(['h', 'hh'], function (input, array, config) {
  1480. array[HOUR] = toInt(input);
  1481. getParsingFlags(config).bigHour = true;
  1482. });
  1483. addParseToken('hmm', function (input, array, config) {
  1484. var pos = input.length - 2;
  1485. array[HOUR] = toInt(input.substr(0, pos));
  1486. array[MINUTE] = toInt(input.substr(pos));
  1487. getParsingFlags(config).bigHour = true;
  1488. });
  1489. addParseToken('hmmss', function (input, array, config) {
  1490. var pos1 = input.length - 4;
  1491. var pos2 = input.length - 2;
  1492. array[HOUR] = toInt(input.substr(0, pos1));
  1493. array[MINUTE] = toInt(input.substr(pos1, 2));
  1494. array[SECOND] = toInt(input.substr(pos2));
  1495. getParsingFlags(config).bigHour = true;
  1496. });
  1497. addParseToken('Hmm', function (input, array, config) {
  1498. var pos = input.length - 2;
  1499. array[HOUR] = toInt(input.substr(0, pos));
  1500. array[MINUTE] = toInt(input.substr(pos));
  1501. });
  1502. addParseToken('Hmmss', function (input, array, config) {
  1503. var pos1 = input.length - 4;
  1504. var pos2 = input.length - 2;
  1505. array[HOUR] = toInt(input.substr(0, pos1));
  1506. array[MINUTE] = toInt(input.substr(pos1, 2));
  1507. array[SECOND] = toInt(input.substr(pos2));
  1508. });
  1509. // LOCALES
  1510. function localeIsPM (input) {
  1511. // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
  1512. // Using charAt should be more compatible.
  1513. return ((input + '').toLowerCase().charAt(0) === 'p');
  1514. }
  1515. var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
  1516. function localeMeridiem (hours, minutes, isLower) {
  1517. if (hours > 11) {
  1518. return isLower ? 'pm' : 'PM';
  1519. } else {
  1520. return isLower ? 'am' : 'AM';
  1521. }
  1522. }
  1523. // MOMENTS
  1524. // Setting the hour should keep the time, because the user explicitly
  1525. // specified which hour he wants. So trying to maintain the same hour (in
  1526. // a new timezone) makes sense. Adding/subtracting hours does not follow
  1527. // this rule.
  1528. var getSetHour = makeGetSet('Hours', true);
  1529. // months
  1530. // week
  1531. // weekdays
  1532. // meridiem
  1533. var baseConfig = {
  1534. calendar: defaultCalendar,
  1535. longDateFormat: defaultLongDateFormat,
  1536. invalidDate: defaultInvalidDate,
  1537. ordinal: defaultOrdinal,
  1538. ordinalParse: defaultOrdinalParse,
  1539. relativeTime: defaultRelativeTime,
  1540. months: defaultLocaleMonths,
  1541. monthsShort: defaultLocaleMonthsShort,
  1542. week: defaultLocaleWeek,
  1543. weekdays: defaultLocaleWeekdays,
  1544. weekdaysMin: defaultLocaleWeekdaysMin,
  1545. weekdaysShort: defaultLocaleWeekdaysShort,
  1546. meridiemParse: defaultLocaleMeridiemParse
  1547. };
  1548. // internal storage for locale config files
  1549. var locales = {};
  1550. var localeFamilies = {};
  1551. var globalLocale;
  1552. function normalizeLocale(key) {
  1553. return key ? key.toLowerCase().replace('_', '-') : key;
  1554. }
  1555. // pick the locale from the array
  1556. // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
  1557. // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
  1558. function chooseLocale(names) {
  1559. var i = 0, j, next, locale, split;
  1560. while (i < names.length) {
  1561. split = normalizeLocale(names[i]).split('-');
  1562. j = split.length;
  1563. next = normalizeLocale(names[i + 1]);
  1564. next = next ? next.split('-') : null;
  1565. while (j > 0) {
  1566. locale = loadLocale(split.slice(0, j).join('-'));
  1567. if (locale) {
  1568. return locale;
  1569. }
  1570. if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
  1571. //the next array item is better than a shallower substring of this one
  1572. break;
  1573. }
  1574. j--;
  1575. }
  1576. i++;
  1577. }
  1578. return null;
  1579. }
  1580. function loadLocale(name) {
  1581. var oldLocale = null;
  1582. // TODO: Find a better way to register and load all the locales in Node
  1583. if (!locales[name] && (typeof module !== 'undefined') &&
  1584. module && module.exports) {
  1585. try {
  1586. oldLocale = globalLocale._abbr;
  1587. __webpack_require__(171)("./" + name);
  1588. // because defineLocale currently also sets the global locale, we
  1589. // want to undo that for lazy loaded locales
  1590. getSetGlobalLocale(oldLocale);
  1591. } catch (e) { }
  1592. }
  1593. return locales[name];
  1594. }
  1595. // This function will load locale and then set the global locale. If
  1596. // no arguments are passed in, it will simply return the current global
  1597. // locale key.
  1598. function getSetGlobalLocale (key, values) {
  1599. var data;
  1600. if (key) {
  1601. if (isUndefined(values)) {
  1602. data = getLocale(key);
  1603. }
  1604. else {
  1605. data = defineLocale(key, values);
  1606. }
  1607. if (data) {
  1608. // moment.duration._locale = moment._locale = data;
  1609. globalLocale = data;
  1610. }
  1611. }
  1612. return globalLocale._abbr;
  1613. }
  1614. function defineLocale (name, config) {
  1615. if (config !== null) {
  1616. var parentConfig = baseConfig;
  1617. config.abbr = name;
  1618. if (locales[name] != null) {
  1619. deprecateSimple('defineLocaleOverride',
  1620. 'use moment.updateLocale(localeName, config) to change ' +
  1621. 'an existing locale. moment.defineLocale(localeName, ' +
  1622. 'config) should only be used for creating a new locale ' +
  1623. 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
  1624. parentConfig = locales[name]._config;
  1625. } else if (config.parentLocale != null) {
  1626. if (locales[config.parentLocale] != null) {
  1627. parentConfig = locales[config.parentLocale]._config;
  1628. } else {
  1629. if (!localeFamilies[config.parentLocale]) {
  1630. localeFamilies[config.parentLocale] = [];
  1631. }
  1632. localeFamilies[config.parentLocale].push({
  1633. name: name,
  1634. config: config
  1635. });
  1636. return null;
  1637. }
  1638. }
  1639. locales[name] = new Locale(mergeConfigs(parentConfig, config));
  1640. if (localeFamilies[name]) {
  1641. localeFamilies[name].forEach(function (x) {
  1642. defineLocale(x.name, x.config);
  1643. });
  1644. }
  1645. // backwards compat for now: also set the locale
  1646. // make sure we set the locale AFTER all child locales have been
  1647. // created, so we won't end up with the child locale set.
  1648. getSetGlobalLocale(name);
  1649. return locales[name];
  1650. } else {
  1651. // useful for testing
  1652. delete locales[name];
  1653. return null;
  1654. }
  1655. }
  1656. function updateLocale(name, config) {
  1657. if (config != null) {
  1658. var locale, parentConfig = baseConfig;
  1659. // MERGE
  1660. if (locales[name] != null) {
  1661. parentConfig = locales[name]._config;
  1662. }
  1663. config = mergeConfigs(parentConfig, config);
  1664. locale = new Locale(config);
  1665. locale.parentLocale = locales[name];
  1666. locales[name] = locale;
  1667. // backwards compat for now: also set the locale
  1668. getSetGlobalLocale(name);
  1669. } else {
  1670. // pass null for config to unupdate, useful for tests
  1671. if (locales[name] != null) {
  1672. if (locales[name].parentLocale != null) {
  1673. locales[name] = locales[name].parentLocale;
  1674. } else if (locales[name] != null) {
  1675. delete locales[name];
  1676. }
  1677. }
  1678. }
  1679. return locales[name];
  1680. }
  1681. // returns locale data
  1682. function getLocale (key) {
  1683. var locale;
  1684. if (key && key._locale && key._locale._abbr) {
  1685. key = key._locale._abbr;
  1686. }
  1687. if (!key) {
  1688. return globalLocale;
  1689. }
  1690. if (!isArray(key)) {
  1691. //short-circuit everything else
  1692. locale = loadLocale(key);
  1693. if (locale) {
  1694. return locale;
  1695. }
  1696. key = [key];
  1697. }
  1698. return chooseLocale(key);
  1699. }
  1700. function listLocales() {
  1701. return keys$1(locales);
  1702. }
  1703. function checkOverflow (m) {
  1704. var overflow;
  1705. var a = m._a;
  1706. if (a && getParsingFlags(m).overflow === -2) {
  1707. overflow =
  1708. a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
  1709. a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
  1710. a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
  1711. a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
  1712. a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
  1713. a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
  1714. -1;
  1715. if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
  1716. overflow = DATE;
  1717. }
  1718. if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
  1719. overflow = WEEK;
  1720. }
  1721. if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
  1722. overflow = WEEKDAY;
  1723. }
  1724. getParsingFlags(m).overflow = overflow;
  1725. }
  1726. return m;
  1727. }
  1728. // iso 8601 regex
  1729. // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
  1730. var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
  1731. var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
  1732. var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
  1733. var isoDates = [
  1734. ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
  1735. ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
  1736. ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
  1737. ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
  1738. ['YYYY-DDD', /\d{4}-\d{3}/],
  1739. ['YYYY-MM', /\d{4}-\d\d/, false],
  1740. ['YYYYYYMMDD', /[+-]\d{10}/],
  1741. ['YYYYMMDD', /\d{8}/],
  1742. // YYYYMM is NOT allowed by the standard
  1743. ['GGGG[W]WWE', /\d{4}W\d{3}/],
  1744. ['GGGG[W]WW', /\d{4}W\d{2}/, false],
  1745. ['YYYYDDD', /\d{7}/]
  1746. ];
  1747. // iso time formats and regexes
  1748. var isoTimes = [
  1749. ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
  1750. ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
  1751. ['HH:mm:ss', /\d\d:\d\d:\d\d/],
  1752. ['HH:mm', /\d\d:\d\d/],
  1753. ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
  1754. ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
  1755. ['HHmmss', /\d\d\d\d\d\d/],
  1756. ['HHmm', /\d\d\d\d/],
  1757. ['HH', /\d\d/]
  1758. ];
  1759. var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
  1760. // date from iso format
  1761. function configFromISO(config) {
  1762. var i, l,
  1763. string = config._i,
  1764. match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
  1765. allowTime, dateFormat, timeFormat, tzFormat;
  1766. if (match) {
  1767. getParsingFlags(config).iso = true;
  1768. for (i = 0, l = isoDates.length; i < l; i++) {
  1769. if (isoDates[i][1].exec(match[1])) {
  1770. dateFormat = isoDates[i][0];
  1771. allowTime = isoDates[i][2] !== false;
  1772. break;
  1773. }
  1774. }
  1775. if (dateFormat == null) {
  1776. config._isValid = false;
  1777. return;
  1778. }
  1779. if (match[3]) {
  1780. for (i = 0, l = isoTimes.length; i < l; i++) {
  1781. if (isoTimes[i][1].exec(match[3])) {
  1782. // match[2] should be 'T' or space
  1783. timeFormat = (match[2] || ' ') + isoTimes[i][0];
  1784. break;
  1785. }
  1786. }
  1787. if (timeFormat == null) {
  1788. config._isValid = false;
  1789. return;
  1790. }
  1791. }
  1792. if (!allowTime && timeFormat != null) {
  1793. config._isValid = false;
  1794. return;
  1795. }
  1796. if (match[4]) {
  1797. if (tzRegex.exec(match[4])) {
  1798. tzFormat = 'Z';
  1799. } else {
  1800. config._isValid = false;
  1801. return;
  1802. }
  1803. }
  1804. config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
  1805. configFromStringAndFormat(config);
  1806. } else {
  1807. config._isValid = false;
  1808. }
  1809. }
  1810. // date from iso format or fallback
  1811. function configFromString(config) {
  1812. var matched = aspNetJsonRegex.exec(config._i);
  1813. if (matched !== null) {
  1814. config._d = new Date(+matched[1]);
  1815. return;
  1816. }
  1817. configFromISO(config);
  1818. if (config._isValid === false) {
  1819. delete config._isValid;
  1820. hooks.createFromInputFallback(config);
  1821. }
  1822. }
  1823. hooks.createFromInputFallback = deprecate(
  1824. 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
  1825. 'which is not reliable across all browsers and versions. Non ISO date formats are ' +
  1826. 'discouraged and will be removed in an upcoming major release. Please refer to ' +
  1827. 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
  1828. function (config) {
  1829. config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
  1830. }
  1831. );
  1832. // Pick the first defined of two or three arguments.
  1833. function defaults(a, b, c) {
  1834. if (a != null) {
  1835. return a;
  1836. }
  1837. if (b != null) {
  1838. return b;
  1839. }
  1840. return c;
  1841. }
  1842. function currentDateArray(config) {
  1843. // hooks is actually the exported moment object
  1844. var nowValue = new Date(hooks.now());
  1845. if (config._useUTC) {
  1846. return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
  1847. }
  1848. return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
  1849. }
  1850. // convert an array to a date.
  1851. // the array should mirror the parameters below
  1852. // note: all values past the year are optional and will default to the lowest possible value.
  1853. // [year, month, day , hour, minute, second, millisecond]
  1854. function configFromArray (config) {
  1855. var i, date, input = [], currentDate, yearToUse;
  1856. if (config._d) {
  1857. return;
  1858. }
  1859. currentDate = currentDateArray(config);
  1860. //compute day of the year from weeks and weekdays
  1861. if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
  1862. dayOfYearFromWeekInfo(config);
  1863. }
  1864. //if the day of the year is set, figure out what it is
  1865. if (config._dayOfYear) {
  1866. yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
  1867. if (config._dayOfYear > daysInYear(yearToUse)) {
  1868. getParsingFlags(config)._overflowDayOfYear = true;
  1869. }
  1870. date = createUTCDate(yearToUse, 0, config._dayOfYear);
  1871. config._a[MONTH] = date.getUTCMonth();
  1872. config._a[DATE] = date.getUTCDate();
  1873. }
  1874. // Default to current date.
  1875. // * if no year, month, day of month are given, default to today
  1876. // * if day of month is given, default month and year
  1877. // * if month is given, default only year
  1878. // * if year is given, don't default anything
  1879. for (i = 0; i < 3 && config._a[i] == null; ++i) {
  1880. config._a[i] = input[i] = currentDate[i];
  1881. }
  1882. // Zero out whatever was not defaulted, including time
  1883. for (; i < 7; i++) {
  1884. config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
  1885. }
  1886. // Check for 24:00:00.000
  1887. if (config._a[HOUR] === 24 &&
  1888. config._a[MINUTE] === 0 &&
  1889. config._a[SECOND] === 0 &&
  1890. config._a[MILLISECOND] === 0) {
  1891. config._nextDay = true;
  1892. config._a[HOUR] = 0;
  1893. }
  1894. config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
  1895. // Apply timezone offset from input. The actual utcOffset can be changed
  1896. // with parseZone.
  1897. if (config._tzm != null) {
  1898. config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
  1899. }
  1900. if (config._nextDay) {
  1901. config._a[HOUR] = 24;
  1902. }
  1903. }
  1904. function dayOfYearFromWeekInfo(config) {
  1905. var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
  1906. w = config._w;
  1907. if (w.GG != null || w.W != null || w.E != null) {
  1908. dow = 1;
  1909. doy = 4;
  1910. // TODO: We need to take the current isoWeekYear, but that depends on
  1911. // how we interpret now (local, utc, fixed offset). So create
  1912. // a now version of current config (take local/utc/offset flags, and
  1913. // create now).
  1914. weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
  1915. week = defaults(w.W, 1);
  1916. weekday = defaults(w.E, 1);
  1917. if (weekday < 1 || weekday > 7) {
  1918. weekdayOverflow = true;
  1919. }
  1920. } else {
  1921. dow = config._locale._week.dow;
  1922. doy = config._locale._week.doy;
  1923. var curWeek = weekOfYear(createLocal(), dow, doy);
  1924. weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
  1925. // Default to current week.
  1926. week = defaults(w.w, curWeek.week);
  1927. if (w.d != null) {
  1928. // weekday -- low day numbers are considered next week
  1929. weekday = w.d;
  1930. if (weekday < 0 || weekday > 6) {
  1931. weekdayOverflow = true;
  1932. }
  1933. } else if (w.e != null) {
  1934. // local weekday -- counting starts from begining of week
  1935. weekday = w.e + dow;
  1936. if (w.e < 0 || w.e > 6) {
  1937. weekdayOverflow = true;
  1938. }
  1939. } else {
  1940. // default to begining of week
  1941. weekday = dow;
  1942. }
  1943. }
  1944. if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
  1945. getParsingFlags(config)._overflowWeeks = true;
  1946. } else if (weekdayOverflow != null) {
  1947. getParsingFlags(config)._overflowWeekday = true;
  1948. } else {
  1949. temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
  1950. config._a[YEAR] = temp.year;
  1951. config._dayOfYear = temp.dayOfYear;
  1952. }
  1953. }
  1954. // constant that refers to the ISO standard
  1955. hooks.ISO_8601 = function () {};
  1956. // date from string and format string
  1957. function configFromStringAndFormat(config) {
  1958. // TODO: Move this to another part of the creation flow to prevent circular deps
  1959. if (config._f === hooks.ISO_8601) {
  1960. configFromISO(config);
  1961. return;
  1962. }
  1963. config._a = [];
  1964. getParsingFlags(config).empty = true;
  1965. // This array is used to make a Date, either with `new Date` or `Date.UTC`
  1966. var string = '' + config._i,
  1967. i, parsedInput, tokens, token, skipped,
  1968. stringLength = string.length,
  1969. totalParsedInputLength = 0;
  1970. tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
  1971. for (i = 0; i < tokens.length; i++) {
  1972. token = tokens[i];
  1973. parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
  1974. // console.log('token', token, 'parsedInput', parsedInput,
  1975. // 'regex', getParseRegexForToken(token, config));
  1976. if (parsedInput) {
  1977. skipped = string.substr(0, string.indexOf(parsedInput));
  1978. if (skipped.length > 0) {
  1979. getParsingFlags(config).unusedInput.push(skipped);
  1980. }
  1981. string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
  1982. totalParsedInputLength += parsedInput.length;
  1983. }
  1984. // don't parse if it's not a known token
  1985. if (formatTokenFunctions[token]) {
  1986. if (parsedInput) {
  1987. getParsingFlags(config).empty = false;
  1988. }
  1989. else {
  1990. getParsingFlags(config).unusedTokens.push(token);
  1991. }
  1992. addTimeToArrayFromToken(token, parsedInput, config);
  1993. }
  1994. else if (config._strict && !parsedInput) {
  1995. getParsingFlags(config).unusedTokens.push(token);
  1996. }
  1997. }
  1998. // add remaining unparsed input length to the string
  1999. getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
  2000. if (string.length > 0) {
  2001. getParsingFlags(config).unusedInput.push(string);
  2002. }
  2003. // clear _12h flag if hour is <= 12
  2004. if (config._a[HOUR] <= 12 &&
  2005. getParsingFlags(config).bigHour === true &&
  2006. config._a[HOUR] > 0) {
  2007. getParsingFlags(config).bigHour = undefined;
  2008. }
  2009. getParsingFlags(config).parsedDateParts = config._a.slice(0);
  2010. getParsingFlags(config).meridiem = config._meridiem;
  2011. // handle meridiem
  2012. config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
  2013. configFromArray(config);
  2014. checkOverflow(config);
  2015. }
  2016. function meridiemFixWrap (locale, hour, meridiem) {
  2017. var isPm;
  2018. if (meridiem == null) {
  2019. // nothing to do
  2020. return hour;
  2021. }
  2022. if (locale.meridiemHour != null) {
  2023. return locale.meridiemHour(hour, meridiem);
  2024. } else if (locale.isPM != null) {
  2025. // Fallback
  2026. isPm = locale.isPM(meridiem);
  2027. if (isPm && hour < 12) {
  2028. hour += 12;
  2029. }
  2030. if (!isPm && hour === 12) {
  2031. hour = 0;
  2032. }
  2033. return hour;
  2034. } else {
  2035. // this is not supposed to happen
  2036. return hour;
  2037. }
  2038. }
  2039. // date from string and array of format strings
  2040. function configFromStringAndArray(config) {
  2041. var tempConfig,
  2042. bestMoment,
  2043. scoreToBeat,
  2044. i,
  2045. currentScore;
  2046. if (config._f.length === 0) {
  2047. getParsingFlags(config).invalidFormat = true;
  2048. config._d = new Date(NaN);
  2049. return;
  2050. }
  2051. for (i = 0; i < config._f.length; i++) {
  2052. currentScore = 0;
  2053. tempConfig = copyConfig({}, config);
  2054. if (config._useUTC != null) {
  2055. tempConfig._useUTC = config._useUTC;
  2056. }
  2057. tempConfig._f = config._f[i];
  2058. configFromStringAndFormat(tempConfig);
  2059. if (!isValid(tempConfig)) {
  2060. continue;
  2061. }
  2062. // if there is any input that was not parsed add a penalty for that format
  2063. currentScore += getParsingFlags(tempConfig).charsLeftOver;
  2064. //or tokens
  2065. currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
  2066. getParsingFlags(tempConfig).score = currentScore;
  2067. if (scoreToBeat == null || currentScore < scoreToBeat) {
  2068. scoreToBeat = currentScore;
  2069. bestMoment = tempConfig;
  2070. }
  2071. }
  2072. extend(config, bestMoment || tempConfig);
  2073. }
  2074. function configFromObject(config) {
  2075. if (config._d) {
  2076. return;
  2077. }
  2078. var i = normalizeObjectUnits(config._i);
  2079. config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
  2080. return obj && parseInt(obj, 10);
  2081. });
  2082. configFromArray(config);
  2083. }
  2084. function createFromConfig (config) {
  2085. var res = new Moment(checkOverflow(prepareConfig(config)));
  2086. if (res._nextDay) {
  2087. // Adding is smart enough around DST
  2088. res.add(1, 'd');
  2089. res._nextDay = undefined;
  2090. }
  2091. return res;
  2092. }
  2093. function prepareConfig (config) {
  2094. var input = config._i,
  2095. format = config._f;
  2096. config._locale = config._locale || getLocale(config._l);
  2097. if (input === null || (format === undefined && input === '')) {
  2098. return createInvalid({nullInput: true});
  2099. }
  2100. if (typeof input === 'string') {
  2101. config._i = input = config._locale.preparse(input);
  2102. }
  2103. if (isMoment(input)) {
  2104. return new Moment(checkOverflow(input));
  2105. } else if (isDate(input)) {
  2106. config._d = input;
  2107. } else if (isArray(format)) {
  2108. configFromStringAndArray(config);
  2109. } else if (format) {
  2110. configFromStringAndFormat(config);
  2111. } else {
  2112. configFromInput(config);
  2113. }
  2114. if (!isValid(config)) {
  2115. config._d = null;
  2116. }
  2117. return config;
  2118. }
  2119. function configFromInput(config) {
  2120. var input = config._i;
  2121. if (input === undefined) {
  2122. config._d = new Date(hooks.now());
  2123. } else if (isDate(input)) {
  2124. config._d = new Date(input.valueOf());
  2125. } else if (typeof input === 'string') {
  2126. configFromString(config);
  2127. } else if (isArray(input)) {
  2128. config._a = map(input.slice(0), function (obj) {
  2129. return parseInt(obj, 10);
  2130. });
  2131. configFromArray(config);
  2132. } else if (typeof(input) === 'object') {
  2133. configFromObject(config);
  2134. } else if (isNumber(input)) {
  2135. // from milliseconds
  2136. config._d = new Date(input);
  2137. } else {
  2138. hooks.createFromInputFallback(config);
  2139. }
  2140. }
  2141. function createLocalOrUTC (input, format, locale, strict, isUTC) {
  2142. var c = {};
  2143. if (locale === true || locale === false) {
  2144. strict = locale;
  2145. locale = undefined;
  2146. }
  2147. if ((isObject(input) && isObjectEmpty(input)) ||
  2148. (isArray(input) && input.length === 0)) {
  2149. input = undefined;
  2150. }
  2151. // object construction must be done this way.
  2152. // https://github.com/moment/moment/issues/1423
  2153. c._isAMomentObject = true;
  2154. c._useUTC = c._isUTC = isUTC;
  2155. c._l = locale;
  2156. c._i = input;
  2157. c._f = format;
  2158. c._strict = strict;
  2159. return createFromConfig(c);
  2160. }
  2161. function createLocal (input, format, locale, strict) {
  2162. return createLocalOrUTC(input, format, locale, strict, false);
  2163. }
  2164. var prototypeMin = deprecate(
  2165. 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
  2166. function () {
  2167. var other = createLocal.apply(null, arguments);
  2168. if (this.isValid() && other.isValid()) {
  2169. return other < this ? this : other;
  2170. } else {
  2171. return createInvalid();
  2172. }
  2173. }
  2174. );
  2175. var prototypeMax = deprecate(
  2176. 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
  2177. function () {
  2178. var other = createLocal.apply(null, arguments);
  2179. if (this.isValid() && other.isValid()) {
  2180. return other > this ? this : other;
  2181. } else {
  2182. return createInvalid();
  2183. }
  2184. }
  2185. );
  2186. // Pick a moment m from moments so that m[fn](other) is true for all
  2187. // other. This relies on the function fn to be transitive.
  2188. //
  2189. // moments should either be an array of moment objects or an array, whose
  2190. // first element is an array of moment objects.
  2191. function pickBy(fn, moments) {
  2192. var res, i;
  2193. if (moments.length === 1 && isArray(moments[0])) {
  2194. moments = moments[0];
  2195. }
  2196. if (!moments.length) {
  2197. return createLocal();
  2198. }
  2199. res = moments[0];
  2200. for (i = 1; i < moments.length; ++i) {
  2201. if (!moments[i].isValid() || moments[i][fn](res)) {
  2202. res = moments[i];
  2203. }
  2204. }
  2205. return res;
  2206. }
  2207. // TODO: Use [].sort instead?
  2208. function min () {
  2209. var args = [].slice.call(arguments, 0);
  2210. return pickBy('isBefore', args);
  2211. }
  2212. function max () {
  2213. var args = [].slice.call(arguments, 0);
  2214. return pickBy('isAfter', args);
  2215. }
  2216. var now = function () {
  2217. return Date.now ? Date.now() : +(new Date());
  2218. };
  2219. function Duration (duration) {
  2220. var normalizedInput = normalizeObjectUnits(duration),
  2221. years = normalizedInput.year || 0,
  2222. quarters = normalizedInput.quarter || 0,
  2223. months = normalizedInput.month || 0,
  2224. weeks = normalizedInput.week || 0,
  2225. days = normalizedInput.day || 0,
  2226. hours = normalizedInput.hour || 0,
  2227. minutes = normalizedInput.minute || 0,
  2228. seconds = normalizedInput.second || 0,
  2229. milliseconds = normalizedInput.millisecond || 0;
  2230. // representation for dateAddRemove
  2231. this._milliseconds = +milliseconds +
  2232. seconds * 1e3 + // 1000
  2233. minutes * 6e4 + // 1000 * 60
  2234. hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
  2235. // Because of dateAddRemove treats 24 hours as different from a
  2236. // day when working around DST, we need to store them separately
  2237. this._days = +days +
  2238. weeks * 7;
  2239. // It is impossible translate months into days without knowing
  2240. // which months you are are talking about, so we have to store
  2241. // it separately.
  2242. this._months = +months +
  2243. quarters * 3 +
  2244. years * 12;
  2245. this._data = {};
  2246. this._locale = getLocale();
  2247. this._bubble();
  2248. }
  2249. function isDuration (obj) {
  2250. return obj instanceof Duration;
  2251. }
  2252. function absRound (number) {
  2253. if (number < 0) {
  2254. return Math.round(-1 * number) * -1;
  2255. } else {
  2256. return Math.round(number);
  2257. }
  2258. }
  2259. // FORMATTING
  2260. function offset (token, separator) {
  2261. addFormatToken(token, 0, 0, function () {
  2262. var offset = this.utcOffset();
  2263. var sign = '+';
  2264. if (offset < 0) {
  2265. offset = -offset;
  2266. sign = '-';
  2267. }
  2268. return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
  2269. });
  2270. }
  2271. offset('Z', ':');
  2272. offset('ZZ', '');
  2273. // PARSING
  2274. addRegexToken('Z', matchShortOffset);
  2275. addRegexToken('ZZ', matchShortOffset);
  2276. addParseToken(['Z', 'ZZ'], function (input, array, config) {
  2277. config._useUTC = true;
  2278. config._tzm = offsetFromString(matchShortOffset, input);
  2279. });
  2280. // HELPERS
  2281. // timezone chunker
  2282. // '+10:00' > ['10', '00']
  2283. // '-1530' > ['-15', '30']
  2284. var chunkOffset = /([\+\-]|\d\d)/gi;
  2285. function offsetFromString(matcher, string) {
  2286. var matches = (string || '').match(matcher);
  2287. if (matches === null) {
  2288. return null;
  2289. }
  2290. var chunk = matches[matches.length - 1] || [];
  2291. var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
  2292. var minutes = +(parts[1] * 60) + toInt(parts[2]);
  2293. return minutes === 0 ?
  2294. 0 :
  2295. parts[0] === '+' ? minutes : -minutes;
  2296. }
  2297. // Return a moment from input, that is local/utc/zone equivalent to model.
  2298. function cloneWithOffset(input, model) {
  2299. var res, diff;
  2300. if (model._isUTC) {
  2301. res = model.clone();
  2302. diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
  2303. // Use low-level api, because this fn is low-level api.
  2304. res._d.setTime(res._d.valueOf() + diff);
  2305. hooks.updateOffset(res, false);
  2306. return res;
  2307. } else {
  2308. return createLocal(input).local();
  2309. }
  2310. }
  2311. function getDateOffset (m) {
  2312. // On Firefox.24 Date#getTimezoneOffset returns a floating point.
  2313. // https://github.com/moment/moment/pull/1871
  2314. return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
  2315. }
  2316. // HOOKS
  2317. // This function will be called whenever a moment is mutated.
  2318. // It is intended to keep the offset in sync with the timezone.
  2319. hooks.updateOffset = function () {};
  2320. // MOMENTS
  2321. // keepLocalTime = true means only change the timezone, without
  2322. // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
  2323. // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
  2324. // +0200, so we adjust the time as needed, to be valid.
  2325. //
  2326. // Keeping the time actually adds/subtracts (one hour)
  2327. // from the actual represented time. That is why we call updateOffset
  2328. // a second time. In case it wants us to change the offset again
  2329. // _changeInProgress == true case, then we have to adjust, because
  2330. // there is no such time in the given timezone.
  2331. function getSetOffset (input, keepLocalTime) {
  2332. var offset = this._offset || 0,
  2333. localAdjust;
  2334. if (!this.isValid()) {
  2335. return input != null ? this : NaN;
  2336. }
  2337. if (input != null) {
  2338. if (typeof input === 'string') {
  2339. input = offsetFromString(matchShortOffset, input);
  2340. if (input === null) {
  2341. return this;
  2342. }
  2343. } else if (Math.abs(input) < 16) {
  2344. input = input * 60;
  2345. }
  2346. if (!this._isUTC && keepLocalTime) {
  2347. localAdjust = getDateOffset(this);
  2348. }
  2349. this._offset = input;
  2350. this._isUTC = true;
  2351. if (localAdjust != null) {
  2352. this.add(localAdjust, 'm');
  2353. }
  2354. if (offset !== input) {
  2355. if (!keepLocalTime || this._changeInProgress) {
  2356. addSubtract(this, createDuration(input - offset, 'm'), 1, false);
  2357. } else if (!this._changeInProgress) {
  2358. this._changeInProgress = true;
  2359. hooks.updateOffset(this, true);
  2360. this._changeInProgress = null;
  2361. }
  2362. }
  2363. return this;
  2364. } else {
  2365. return this._isUTC ? offset : getDateOffset(this);
  2366. }
  2367. }
  2368. function getSetZone (input, keepLocalTime) {
  2369. if (input != null) {
  2370. if (typeof input !== 'string') {
  2371. input = -input;
  2372. }
  2373. this.utcOffset(input, keepLocalTime);
  2374. return this;
  2375. } else {
  2376. return -this.utcOffset();
  2377. }
  2378. }
  2379. function setOffsetToUTC (keepLocalTime) {
  2380. return this.utcOffset(0, keepLocalTime);
  2381. }
  2382. function setOffsetToLocal (keepLocalTime) {
  2383. if (this._isUTC) {
  2384. this.utcOffset(0, keepLocalTime);
  2385. this._isUTC = false;
  2386. if (keepLocalTime) {
  2387. this.subtract(getDateOffset(this), 'm');
  2388. }
  2389. }
  2390. return this;
  2391. }
  2392. function setOffsetToParsedOffset () {
  2393. if (this._tzm != null) {
  2394. this.utcOffset(this._tzm);
  2395. } else if (typeof this._i === 'string') {
  2396. var tZone = offsetFromString(matchOffset, this._i);
  2397. if (tZone != null) {
  2398. this.utcOffset(tZone);
  2399. }
  2400. else {
  2401. this.utcOffset(0, true);
  2402. }
  2403. }
  2404. return this;
  2405. }
  2406. function hasAlignedHourOffset (input) {
  2407. if (!this.isValid()) {
  2408. return false;
  2409. }
  2410. input = input ? createLocal(input).utcOffset() : 0;
  2411. return (this.utcOffset() - input) % 60 === 0;
  2412. }
  2413. function isDaylightSavingTime () {
  2414. return (
  2415. this.utcOffset() > this.clone().month(0).utcOffset() ||
  2416. this.utcOffset() > this.clone().month(5).utcOffset()
  2417. );
  2418. }
  2419. function isDaylightSavingTimeShifted () {
  2420. if (!isUndefined(this._isDSTShifted)) {
  2421. return this._isDSTShifted;
  2422. }
  2423. var c = {};
  2424. copyConfig(c, this);
  2425. c = prepareConfig(c);
  2426. if (c._a) {
  2427. var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
  2428. this._isDSTShifted = this.isValid() &&
  2429. compareArrays(c._a, other.toArray()) > 0;
  2430. } else {
  2431. this._isDSTShifted = false;
  2432. }
  2433. return this._isDSTShifted;
  2434. }
  2435. function isLocal () {
  2436. return this.isValid() ? !this._isUTC : false;
  2437. }
  2438. function isUtcOffset () {
  2439. return this.isValid() ? this._isUTC : false;
  2440. }
  2441. function isUtc () {
  2442. return this.isValid() ? this._isUTC && this._offset === 0 : false;
  2443. }
  2444. // ASP.NET json date format regex
  2445. var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
  2446. // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
  2447. // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
  2448. // and further modified to allow for strings containing both week and day
  2449. var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
  2450. function createDuration (input, key) {
  2451. var duration = input,
  2452. // matching against regexp is expensive, do it on demand
  2453. match = null,
  2454. sign,
  2455. ret,
  2456. diffRes;
  2457. if (isDuration(input)) {
  2458. duration = {
  2459. ms : input._milliseconds,
  2460. d : input._days,
  2461. M : input._months
  2462. };
  2463. } else if (isNumber(input)) {
  2464. duration = {};
  2465. if (key) {
  2466. duration[key] = input;
  2467. } else {
  2468. duration.milliseconds = input;
  2469. }
  2470. } else if (!!(match = aspNetRegex.exec(input))) {
  2471. sign = (match[1] === '-') ? -1 : 1;
  2472. duration = {
  2473. y : 0,
  2474. d : toInt(match[DATE]) * sign,
  2475. h : toInt(match[HOUR]) * sign,
  2476. m : toInt(match[MINUTE]) * sign,
  2477. s : toInt(match[SECOND]) * sign,
  2478. ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
  2479. };
  2480. } else if (!!(match = isoRegex.exec(input))) {
  2481. sign = (match[1] === '-') ? -1 : 1;
  2482. duration = {
  2483. y : parseIso(match[2], sign),
  2484. M : parseIso(match[3], sign),
  2485. w : parseIso(match[4], sign),
  2486. d : parseIso(match[5], sign),
  2487. h : parseIso(match[6], sign),
  2488. m : parseIso(match[7], sign),
  2489. s : parseIso(match[8], sign)
  2490. };
  2491. } else if (duration == null) {// checks for null or undefined
  2492. duration = {};
  2493. } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
  2494. diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
  2495. duration = {};
  2496. duration.ms = diffRes.milliseconds;
  2497. duration.M = diffRes.months;
  2498. }
  2499. ret = new Duration(duration);
  2500. if (isDuration(input) && hasOwnProp(input, '_locale')) {
  2501. ret._locale = input._locale;
  2502. }
  2503. return ret;
  2504. }
  2505. createDuration.fn = Duration.prototype;
  2506. function parseIso (inp, sign) {
  2507. // We'd normally use ~~inp for this, but unfortunately it also
  2508. // converts floats to ints.
  2509. // inp may be undefined, so careful calling replace on it.
  2510. var res = inp && parseFloat(inp.replace(',', '.'));
  2511. // apply sign while we're at it
  2512. return (isNaN(res) ? 0 : res) * sign;
  2513. }
  2514. function positiveMomentsDifference(base, other) {
  2515. var res = {milliseconds: 0, months: 0};
  2516. res.months = other.month() - base.month() +
  2517. (other.year() - base.year()) * 12;
  2518. if (base.clone().add(res.months, 'M').isAfter(other)) {
  2519. --res.months;
  2520. }
  2521. res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
  2522. return res;
  2523. }
  2524. function momentsDifference(base, other) {
  2525. var res;
  2526. if (!(base.isValid() && other.isValid())) {
  2527. return {milliseconds: 0, months: 0};
  2528. }
  2529. other = cloneWithOffset(other, base);
  2530. if (base.isBefore(other)) {
  2531. res = positiveMomentsDifference(base, other);
  2532. } else {
  2533. res = positiveMomentsDifference(other, base);
  2534. res.milliseconds = -res.milliseconds;
  2535. res.months = -res.months;
  2536. }
  2537. return res;
  2538. }
  2539. // TODO: remove 'name' arg after deprecation is removed
  2540. function createAdder(direction, name) {
  2541. return function (val, period) {
  2542. var dur, tmp;
  2543. //invert the arguments, but complain about it
  2544. if (period !== null && !isNaN(+period)) {
  2545. deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
  2546. 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
  2547. tmp = val; val = period; period = tmp;
  2548. }
  2549. val = typeof val === 'string' ? +val : val;
  2550. dur = createDuration(val, period);
  2551. addSubtract(this, dur, direction);
  2552. return this;
  2553. };
  2554. }
  2555. function addSubtract (mom, duration, isAdding, updateOffset) {
  2556. var milliseconds = duration._milliseconds,
  2557. days = absRound(duration._days),
  2558. months = absRound(duration._months);
  2559. if (!mom.isValid()) {
  2560. // No op
  2561. return;
  2562. }
  2563. updateOffset = updateOffset == null ? true : updateOffset;
  2564. if (milliseconds) {
  2565. mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
  2566. }
  2567. if (days) {
  2568. set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
  2569. }
  2570. if (months) {
  2571. setMonth(mom, get(mom, 'Month') + months * isAdding);
  2572. }
  2573. if (updateOffset) {
  2574. hooks.updateOffset(mom, days || months);
  2575. }
  2576. }
  2577. var add = createAdder(1, 'add');
  2578. var subtract = createAdder(-1, 'subtract');
  2579. function getCalendarFormat(myMoment, now) {
  2580. var diff = myMoment.diff(now, 'days', true);
  2581. return diff < -6 ? 'sameElse' :
  2582. diff < -1 ? 'lastWeek' :
  2583. diff < 0 ? 'lastDay' :
  2584. diff < 1 ? 'sameDay' :
  2585. diff < 2 ? 'nextDay' :
  2586. diff < 7 ? 'nextWeek' : 'sameElse';
  2587. }
  2588. function calendar$1 (time, formats) {
  2589. // We want to compare the start of today, vs this.
  2590. // Getting start-of-today depends on whether we're local/utc/offset or not.
  2591. var now = time || createLocal(),
  2592. sod = cloneWithOffset(now, this).startOf('day'),
  2593. format = hooks.calendarFormat(this, sod) || 'sameElse';
  2594. var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
  2595. return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
  2596. }
  2597. function clone () {
  2598. return new Moment(this);
  2599. }
  2600. function isAfter (input, units) {
  2601. var localInput = isMoment(input) ? input : createLocal(input);
  2602. if (!(this.isValid() && localInput.isValid())) {
  2603. return false;
  2604. }
  2605. units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
  2606. if (units === 'millisecond') {
  2607. return this.valueOf() > localInput.valueOf();
  2608. } else {
  2609. return localInput.valueOf() < this.clone().startOf(units).valueOf();
  2610. }
  2611. }
  2612. function isBefore (input, units) {
  2613. var localInput = isMoment(input) ? input : createLocal(input);
  2614. if (!(this.isValid() && localInput.isValid())) {
  2615. return false;
  2616. }
  2617. units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
  2618. if (units === 'millisecond') {
  2619. return this.valueOf() < localInput.valueOf();
  2620. } else {
  2621. return this.clone().endOf(units).valueOf() < localInput.valueOf();
  2622. }
  2623. }
  2624. function isBetween (from, to, units, inclusivity) {
  2625. inclusivity = inclusivity || '()';
  2626. return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
  2627. (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
  2628. }
  2629. function isSame (input, units) {
  2630. var localInput = isMoment(input) ? input : createLocal(input),
  2631. inputMs;
  2632. if (!(this.isValid() && localInput.isValid())) {
  2633. return false;
  2634. }
  2635. units = normalizeUnits(units || 'millisecond');
  2636. if (units === 'millisecond') {
  2637. return this.valueOf() === localInput.valueOf();
  2638. } else {
  2639. inputMs = localInput.valueOf();
  2640. return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
  2641. }
  2642. }
  2643. function isSameOrAfter (input, units) {
  2644. return this.isSame(input, units) || this.isAfter(input,units);
  2645. }
  2646. function isSameOrBefore (input, units) {
  2647. return this.isSame(input, units) || this.isBefore(input,units);
  2648. }
  2649. function diff (input, units, asFloat) {
  2650. var that,
  2651. zoneDelta,
  2652. delta, output;
  2653. if (!this.isValid()) {
  2654. return NaN;
  2655. }
  2656. that = cloneWithOffset(input, this);
  2657. if (!that.isValid()) {
  2658. return NaN;
  2659. }
  2660. zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
  2661. units = normalizeUnits(units);
  2662. if (units === 'year' || units === 'month' || units === 'quarter') {
  2663. output = monthDiff(this, that);
  2664. if (units === 'quarter') {
  2665. output = output / 3;
  2666. } else if (units === 'year') {
  2667. output = output / 12;
  2668. }
  2669. } else {
  2670. delta = this - that;
  2671. output = units === 'second' ? delta / 1e3 : // 1000
  2672. units === 'minute' ? delta / 6e4 : // 1000 * 60
  2673. units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
  2674. units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
  2675. units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
  2676. delta;
  2677. }
  2678. return asFloat ? output : absFloor(output);
  2679. }
  2680. function monthDiff (a, b) {
  2681. // difference in months
  2682. var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
  2683. // b is in (anchor - 1 month, anchor + 1 month)
  2684. anchor = a.clone().add(wholeMonthDiff, 'months'),
  2685. anchor2, adjust;
  2686. if (b - anchor < 0) {
  2687. anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
  2688. // linear across the month
  2689. adjust = (b - anchor) / (anchor - anchor2);
  2690. } else {
  2691. anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
  2692. // linear across the month
  2693. adjust = (b - anchor) / (anchor2 - anchor);
  2694. }
  2695. //check for negative zero, return zero if negative zero
  2696. return -(wholeMonthDiff + adjust) || 0;
  2697. }
  2698. hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
  2699. hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
  2700. function toString () {
  2701. return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
  2702. }
  2703. function toISOString () {
  2704. var m = this.clone().utc();
  2705. if (0 < m.year() && m.year() <= 9999) {
  2706. if (isFunction(Date.prototype.toISOString)) {
  2707. // native implementation is ~50x faster, use it when we can
  2708. return this.toDate().toISOString();
  2709. } else {
  2710. return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  2711. }
  2712. } else {
  2713. return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  2714. }
  2715. }
  2716. /**
  2717. * Return a human readable representation of a moment that can
  2718. * also be evaluated to get a new moment which is the same
  2719. *
  2720. * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
  2721. */
  2722. function inspect () {
  2723. if (!this.isValid()) {
  2724. return 'moment.invalid(/* ' + this._i + ' */)';
  2725. }
  2726. var func = 'moment';
  2727. var zone = '';
  2728. if (!this.isLocal()) {
  2729. func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
  2730. zone = 'Z';
  2731. }
  2732. var prefix = '[' + func + '("]';
  2733. var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
  2734. var datetime = '-MM-DD[T]HH:mm:ss.SSS';
  2735. var suffix = zone + '[")]';
  2736. return this.format(prefix + year + datetime + suffix);
  2737. }
  2738. function format (inputString) {
  2739. if (!inputString) {
  2740. inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
  2741. }
  2742. var output = formatMoment(this, inputString);
  2743. return this.localeData().postformat(output);
  2744. }
  2745. function from (time, withoutSuffix) {
  2746. if (this.isValid() &&
  2747. ((isMoment(time) && time.isValid()) ||
  2748. createLocal(time).isValid())) {
  2749. return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
  2750. } else {
  2751. return this.localeData().invalidDate();
  2752. }
  2753. }
  2754. function fromNow (withoutSuffix) {
  2755. return this.from(createLocal(), withoutSuffix);
  2756. }
  2757. function to (time, withoutSuffix) {
  2758. if (this.isValid() &&
  2759. ((isMoment(time) && time.isValid()) ||
  2760. createLocal(time).isValid())) {
  2761. return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
  2762. } else {
  2763. return this.localeData().invalidDate();
  2764. }
  2765. }
  2766. function toNow (withoutSuffix) {
  2767. return this.to(createLocal(), withoutSuffix);
  2768. }
  2769. // If passed a locale key, it will set the locale for this
  2770. // instance. Otherwise, it will return the locale configuration
  2771. // variables for this instance.
  2772. function locale (key) {
  2773. var newLocaleData;
  2774. if (key === undefined) {
  2775. return this._locale._abbr;
  2776. } else {
  2777. newLocaleData = getLocale(key);
  2778. if (newLocaleData != null) {
  2779. this._locale = newLocaleData;
  2780. }
  2781. return this;
  2782. }
  2783. }
  2784. var lang = deprecate(
  2785. 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
  2786. function (key) {
  2787. if (key === undefined) {
  2788. return this.localeData();
  2789. } else {
  2790. return this.locale(key);
  2791. }
  2792. }
  2793. );
  2794. function localeData () {
  2795. return this._locale;
  2796. }
  2797. function startOf (units) {
  2798. units = normalizeUnits(units);
  2799. // the following switch intentionally omits break keywords
  2800. // to utilize falling through the cases.
  2801. switch (units) {
  2802. case 'year':
  2803. this.month(0);
  2804. /* falls through */
  2805. case 'quarter':
  2806. case 'month':
  2807. this.date(1);
  2808. /* falls through */
  2809. case 'week':
  2810. case 'isoWeek':
  2811. case 'day':
  2812. case 'date':
  2813. this.hours(0);
  2814. /* falls through */
  2815. case 'hour':
  2816. this.minutes(0);
  2817. /* falls through */
  2818. case 'minute':
  2819. this.seconds(0);
  2820. /* falls through */
  2821. case 'second':
  2822. this.milliseconds(0);
  2823. }
  2824. // weeks are a special case
  2825. if (units === 'week') {
  2826. this.weekday(0);
  2827. }
  2828. if (units === 'isoWeek') {
  2829. this.isoWeekday(1);
  2830. }
  2831. // quarters are also special
  2832. if (units === 'quarter') {
  2833. this.month(Math.floor(this.month() / 3) * 3);
  2834. }
  2835. return this;
  2836. }
  2837. function endOf (units) {
  2838. units = normalizeUnits(units);
  2839. if (units === undefined || units === 'millisecond') {
  2840. return this;
  2841. }
  2842. // 'date' is an alias for 'day', so it should be considered as such.
  2843. if (units === 'date') {
  2844. units = 'day';
  2845. }
  2846. return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
  2847. }
  2848. function valueOf () {
  2849. return this._d.valueOf() - ((this._offset || 0) * 60000);
  2850. }
  2851. function unix () {
  2852. return Math.floor(this.valueOf() / 1000);
  2853. }
  2854. function toDate () {
  2855. return new Date(this.valueOf());
  2856. }
  2857. function toArray () {
  2858. var m = this;
  2859. return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
  2860. }
  2861. function toObject () {
  2862. var m = this;
  2863. return {
  2864. years: m.year(),
  2865. months: m.month(),
  2866. date: m.date(),
  2867. hours: m.hours(),
  2868. minutes: m.minutes(),
  2869. seconds: m.seconds(),
  2870. milliseconds: m.milliseconds()
  2871. };
  2872. }
  2873. function toJSON () {
  2874. // new Date(NaN).toJSON() === null
  2875. return this.isValid() ? this.toISOString() : null;
  2876. }
  2877. function isValid$1 () {
  2878. return isValid(this);
  2879. }
  2880. function parsingFlags () {
  2881. return extend({}, getParsingFlags(this));
  2882. }
  2883. function invalidAt () {
  2884. return getParsingFlags(this).overflow;
  2885. }
  2886. function creationData() {
  2887. return {
  2888. input: this._i,
  2889. format: this._f,
  2890. locale: this._locale,
  2891. isUTC: this._isUTC,
  2892. strict: this._strict
  2893. };
  2894. }
  2895. // FORMATTING
  2896. addFormatToken(0, ['gg', 2], 0, function () {
  2897. return this.weekYear() % 100;
  2898. });
  2899. addFormatToken(0, ['GG', 2], 0, function () {
  2900. return this.isoWeekYear() % 100;
  2901. });
  2902. function addWeekYearFormatToken (token, getter) {
  2903. addFormatToken(0, [token, token.length], 0, getter);
  2904. }
  2905. addWeekYearFormatToken('gggg', 'weekYear');
  2906. addWeekYearFormatToken('ggggg', 'weekYear');
  2907. addWeekYearFormatToken('GGGG', 'isoWeekYear');
  2908. addWeekYearFormatToken('GGGGG', 'isoWeekYear');
  2909. // ALIASES
  2910. addUnitAlias('weekYear', 'gg');
  2911. addUnitAlias('isoWeekYear', 'GG');
  2912. // PRIORITY
  2913. addUnitPriority('weekYear', 1);
  2914. addUnitPriority('isoWeekYear', 1);
  2915. // PARSING
  2916. addRegexToken('G', matchSigned);
  2917. addRegexToken('g', matchSigned);
  2918. addRegexToken('GG', match1to2, match2);
  2919. addRegexToken('gg', match1to2, match2);
  2920. addRegexToken('GGGG', match1to4, match4);
  2921. addRegexToken('gggg', match1to4, match4);
  2922. addRegexToken('GGGGG', match1to6, match6);
  2923. addRegexToken('ggggg', match1to6, match6);
  2924. addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
  2925. week[token.substr(0, 2)] = toInt(input);
  2926. });
  2927. addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
  2928. week[token] = hooks.parseTwoDigitYear(input);
  2929. });
  2930. // MOMENTS
  2931. function getSetWeekYear (input) {
  2932. return getSetWeekYearHelper.call(this,
  2933. input,
  2934. this.week(),
  2935. this.weekday(),
  2936. this.localeData()._week.dow,
  2937. this.localeData()._week.doy);
  2938. }
  2939. function getSetISOWeekYear (input) {
  2940. return getSetWeekYearHelper.call(this,
  2941. input, this.isoWeek(), this.isoWeekday(), 1, 4);
  2942. }
  2943. function getISOWeeksInYear () {
  2944. return weeksInYear(this.year(), 1, 4);
  2945. }
  2946. function getWeeksInYear () {
  2947. var weekInfo = this.localeData()._week;
  2948. return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
  2949. }
  2950. function getSetWeekYearHelper(input, week, weekday, dow, doy) {
  2951. var weeksTarget;
  2952. if (input == null) {
  2953. return weekOfYear(this, dow, doy).year;
  2954. } else {
  2955. weeksTarget = weeksInYear(input, dow, doy);
  2956. if (week > weeksTarget) {
  2957. week = weeksTarget;
  2958. }
  2959. return setWeekAll.call(this, input, week, weekday, dow, doy);
  2960. }
  2961. }
  2962. function setWeekAll(weekYear, week, weekday, dow, doy) {
  2963. var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
  2964. date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
  2965. this.year(date.getUTCFullYear());
  2966. this.month(date.getUTCMonth());
  2967. this.date(date.getUTCDate());
  2968. return this;
  2969. }
  2970. // FORMATTING
  2971. addFormatToken('Q', 0, 'Qo', 'quarter');
  2972. // ALIASES
  2973. addUnitAlias('quarter', 'Q');
  2974. // PRIORITY
  2975. addUnitPriority('quarter', 7);
  2976. // PARSING
  2977. addRegexToken('Q', match1);
  2978. addParseToken('Q', function (input, array) {
  2979. array[MONTH] = (toInt(input) - 1) * 3;
  2980. });
  2981. // MOMENTS
  2982. function getSetQuarter (input) {
  2983. return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
  2984. }
  2985. // FORMATTING
  2986. addFormatToken('D', ['DD', 2], 'Do', 'date');
  2987. // ALIASES
  2988. addUnitAlias('date', 'D');
  2989. // PRIOROITY
  2990. addUnitPriority('date', 9);
  2991. // PARSING
  2992. addRegexToken('D', match1to2);
  2993. addRegexToken('DD', match1to2, match2);
  2994. addRegexToken('Do', function (isStrict, locale) {
  2995. return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
  2996. });
  2997. addParseToken(['D', 'DD'], DATE);
  2998. addParseToken('Do', function (input, array) {
  2999. array[DATE] = toInt(input.match(match1to2)[0], 10);
  3000. });
  3001. // MOMENTS
  3002. var getSetDayOfMonth = makeGetSet('Date', true);
  3003. // FORMATTING
  3004. addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
  3005. // ALIASES
  3006. addUnitAlias('dayOfYear', 'DDD');
  3007. // PRIORITY
  3008. addUnitPriority('dayOfYear', 4);
  3009. // PARSING
  3010. addRegexToken('DDD', match1to3);
  3011. addRegexToken('DDDD', match3);
  3012. addParseToken(['DDD', 'DDDD'], function (input, array, config) {
  3013. config._dayOfYear = toInt(input);
  3014. });
  3015. // HELPERS
  3016. // MOMENTS
  3017. function getSetDayOfYear (input) {
  3018. var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
  3019. return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
  3020. }
  3021. // FORMATTING
  3022. addFormatToken('m', ['mm', 2], 0, 'minute');
  3023. // ALIASES
  3024. addUnitAlias('minute', 'm');
  3025. // PRIORITY
  3026. addUnitPriority('minute', 14);
  3027. // PARSING
  3028. addRegexToken('m', match1to2);
  3029. addRegexToken('mm', match1to2, match2);
  3030. addParseToken(['m', 'mm'], MINUTE);
  3031. // MOMENTS
  3032. var getSetMinute = makeGetSet('Minutes', false);
  3033. // FORMATTING
  3034. addFormatToken('s', ['ss', 2], 0, 'second');
  3035. // ALIASES
  3036. addUnitAlias('second', 's');
  3037. // PRIORITY
  3038. addUnitPriority('second', 15);
  3039. // PARSING
  3040. addRegexToken('s', match1to2);
  3041. addRegexToken('ss', match1to2, match2);
  3042. addParseToken(['s', 'ss'], SECOND);
  3043. // MOMENTS
  3044. var getSetSecond = makeGetSet('Seconds', false);
  3045. // FORMATTING
  3046. addFormatToken('S', 0, 0, function () {
  3047. return ~~(this.millisecond() / 100);
  3048. });
  3049. addFormatToken(0, ['SS', 2], 0, function () {
  3050. return ~~(this.millisecond() / 10);
  3051. });
  3052. addFormatToken(0, ['SSS', 3], 0, 'millisecond');
  3053. addFormatToken(0, ['SSSS', 4], 0, function () {
  3054. return this.millisecond() * 10;
  3055. });
  3056. addFormatToken(0, ['SSSSS', 5], 0, function () {
  3057. return this.millisecond() * 100;
  3058. });
  3059. addFormatToken(0, ['SSSSSS', 6], 0, function () {
  3060. return this.millisecond() * 1000;
  3061. });
  3062. addFormatToken(0, ['SSSSSSS', 7], 0, function () {
  3063. return this.millisecond() * 10000;
  3064. });
  3065. addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
  3066. return this.millisecond() * 100000;
  3067. });
  3068. addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
  3069. return this.millisecond() * 1000000;
  3070. });
  3071. // ALIASES
  3072. addUnitAlias('millisecond', 'ms');
  3073. // PRIORITY
  3074. addUnitPriority('millisecond', 16);
  3075. // PARSING
  3076. addRegexToken('S', match1to3, match1);
  3077. addRegexToken('SS', match1to3, match2);
  3078. addRegexToken('SSS', match1to3, match3);
  3079. var token;
  3080. for (token = 'SSSS'; token.length <= 9; token += 'S') {
  3081. addRegexToken(token, matchUnsigned);
  3082. }
  3083. function parseMs(input, array) {
  3084. array[MILLISECOND] = toInt(('0.' + input) * 1000);
  3085. }
  3086. for (token = 'S'; token.length <= 9; token += 'S') {
  3087. addParseToken(token, parseMs);
  3088. }
  3089. // MOMENTS
  3090. var getSetMillisecond = makeGetSet('Milliseconds', false);
  3091. // FORMATTING
  3092. addFormatToken('z', 0, 0, 'zoneAbbr');
  3093. addFormatToken('zz', 0, 0, 'zoneName');
  3094. // MOMENTS
  3095. function getZoneAbbr () {
  3096. return this._isUTC ? 'UTC' : '';
  3097. }
  3098. function getZoneName () {
  3099. return this._isUTC ? 'Coordinated Universal Time' : '';
  3100. }
  3101. var proto = Moment.prototype;
  3102. proto.add = add;
  3103. proto.calendar = calendar$1;
  3104. proto.clone = clone;
  3105. proto.diff = diff;
  3106. proto.endOf = endOf;
  3107. proto.format = format;
  3108. proto.from = from;
  3109. proto.fromNow = fromNow;
  3110. proto.to = to;
  3111. proto.toNow = toNow;
  3112. proto.get = stringGet;
  3113. proto.invalidAt = invalidAt;
  3114. proto.isAfter = isAfter;
  3115. proto.isBefore = isBefore;
  3116. proto.isBetween = isBetween;
  3117. proto.isSame = isSame;
  3118. proto.isSameOrAfter = isSameOrAfter;
  3119. proto.isSameOrBefore = isSameOrBefore;
  3120. proto.isValid = isValid$1;
  3121. proto.lang = lang;
  3122. proto.locale = locale;
  3123. proto.localeData = localeData;
  3124. proto.max = prototypeMax;
  3125. proto.min = prototypeMin;
  3126. proto.parsingFlags = parsingFlags;
  3127. proto.set = stringSet;
  3128. proto.startOf = startOf;
  3129. proto.subtract = subtract;
  3130. proto.toArray = toArray;
  3131. proto.toObject = toObject;
  3132. proto.toDate = toDate;
  3133. proto.toISOString = toISOString;
  3134. proto.inspect = inspect;
  3135. proto.toJSON = toJSON;
  3136. proto.toString = toString;
  3137. proto.unix = unix;
  3138. proto.valueOf = valueOf;
  3139. proto.creationData = creationData;
  3140. // Year
  3141. proto.year = getSetYear;
  3142. proto.isLeapYear = getIsLeapYear;
  3143. // Week Year
  3144. proto.weekYear = getSetWeekYear;
  3145. proto.isoWeekYear = getSetISOWeekYear;
  3146. // Quarter
  3147. proto.quarter = proto.quarters = getSetQuarter;
  3148. // Month
  3149. proto.month = getSetMonth;
  3150. proto.daysInMonth = getDaysInMonth;
  3151. // Week
  3152. proto.week = proto.weeks = getSetWeek;
  3153. proto.isoWeek = proto.isoWeeks = getSetISOWeek;
  3154. proto.weeksInYear = getWeeksInYear;
  3155. proto.isoWeeksInYear = getISOWeeksInYear;
  3156. // Day
  3157. proto.date = getSetDayOfMonth;
  3158. proto.day = proto.days = getSetDayOfWeek;
  3159. proto.weekday = getSetLocaleDayOfWeek;
  3160. proto.isoWeekday = getSetISODayOfWeek;
  3161. proto.dayOfYear = getSetDayOfYear;
  3162. // Hour
  3163. proto.hour = proto.hours = getSetHour;
  3164. // Minute
  3165. proto.minute = proto.minutes = getSetMinute;
  3166. // Second
  3167. proto.second = proto.seconds = getSetSecond;
  3168. // Millisecond
  3169. proto.millisecond = proto.milliseconds = getSetMillisecond;
  3170. // Offset
  3171. proto.utcOffset = getSetOffset;
  3172. proto.utc = setOffsetToUTC;
  3173. proto.local = setOffsetToLocal;
  3174. proto.parseZone = setOffsetToParsedOffset;
  3175. proto.hasAlignedHourOffset = hasAlignedHourOffset;
  3176. proto.isDST = isDaylightSavingTime;
  3177. proto.isLocal = isLocal;
  3178. proto.isUtcOffset = isUtcOffset;
  3179. proto.isUtc = isUtc;
  3180. proto.isUTC = isUtc;
  3181. // Timezone
  3182. proto.zoneAbbr = getZoneAbbr;
  3183. proto.zoneName = getZoneName;
  3184. // Deprecations
  3185. proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
  3186. proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
  3187. proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
  3188. proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
  3189. proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
  3190. function createUnix (input) {
  3191. return createLocal(input * 1000);
  3192. }
  3193. function createInZone () {
  3194. return createLocal.apply(null, arguments).parseZone();
  3195. }
  3196. function preParsePostFormat (string) {
  3197. return string;
  3198. }
  3199. var proto$1 = Locale.prototype;
  3200. proto$1.calendar = calendar;
  3201. proto$1.longDateFormat = longDateFormat;
  3202. proto$1.invalidDate = invalidDate;
  3203. proto$1.ordinal = ordinal;
  3204. proto$1.preparse = preParsePostFormat;
  3205. proto$1.postformat = preParsePostFormat;
  3206. proto$1.relativeTime = relativeTime;
  3207. proto$1.pastFuture = pastFuture;
  3208. proto$1.set = set;
  3209. // Month
  3210. proto$1.months = localeMonths;
  3211. proto$1.monthsShort = localeMonthsShort;
  3212. proto$1.monthsParse = localeMonthsParse;
  3213. proto$1.monthsRegex = monthsRegex;
  3214. proto$1.monthsShortRegex = monthsShortRegex;
  3215. // Week
  3216. proto$1.week = localeWeek;
  3217. proto$1.firstDayOfYear = localeFirstDayOfYear;
  3218. proto$1.firstDayOfWeek = localeFirstDayOfWeek;
  3219. // Day of Week
  3220. proto$1.weekdays = localeWeekdays;
  3221. proto$1.weekdaysMin = localeWeekdaysMin;
  3222. proto$1.weekdaysShort = localeWeekdaysShort;
  3223. proto$1.weekdaysParse = localeWeekdaysParse;
  3224. proto$1.weekdaysRegex = weekdaysRegex;
  3225. proto$1.weekdaysShortRegex = weekdaysShortRegex;
  3226. proto$1.weekdaysMinRegex = weekdaysMinRegex;
  3227. // Hours
  3228. proto$1.isPM = localeIsPM;
  3229. proto$1.meridiem = localeMeridiem;
  3230. function get$1 (format, index, field, setter) {
  3231. var locale = getLocale();
  3232. var utc = createUTC().set(setter, index);
  3233. return locale[field](utc, format);
  3234. }
  3235. function listMonthsImpl (format, index, field) {
  3236. if (isNumber(format)) {
  3237. index = format;
  3238. format = undefined;
  3239. }
  3240. format = format || '';
  3241. if (index != null) {
  3242. return get$1(format, index, field, 'month');
  3243. }
  3244. var i;
  3245. var out = [];
  3246. for (i = 0; i < 12; i++) {
  3247. out[i] = get$1(format, i, field, 'month');
  3248. }
  3249. return out;
  3250. }
  3251. // ()
  3252. // (5)
  3253. // (fmt, 5)
  3254. // (fmt)
  3255. // (true)
  3256. // (true, 5)
  3257. // (true, fmt, 5)
  3258. // (true, fmt)
  3259. function listWeekdaysImpl (localeSorted, format, index, field) {
  3260. if (typeof localeSorted === 'boolean') {
  3261. if (isNumber(format)) {
  3262. index = format;
  3263. format = undefined;
  3264. }
  3265. format = format || '';
  3266. } else {
  3267. format = localeSorted;
  3268. index = format;
  3269. localeSorted = false;
  3270. if (isNumber(format)) {
  3271. index = format;
  3272. format = undefined;
  3273. }
  3274. format = format || '';
  3275. }
  3276. var locale = getLocale(),
  3277. shift = localeSorted ? locale._week.dow : 0;
  3278. if (index != null) {
  3279. return get$1(format, (index + shift) % 7, field, 'day');
  3280. }
  3281. var i;
  3282. var out = [];
  3283. for (i = 0; i < 7; i++) {
  3284. out[i] = get$1(format, (i + shift) % 7, field, 'day');
  3285. }
  3286. return out;
  3287. }
  3288. function listMonths (format, index) {
  3289. return listMonthsImpl(format, index, 'months');
  3290. }
  3291. function listMonthsShort (format, index) {
  3292. return listMonthsImpl(format, index, 'monthsShort');
  3293. }
  3294. function listWeekdays (localeSorted, format, index) {
  3295. return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
  3296. }
  3297. function listWeekdaysShort (localeSorted, format, index) {
  3298. return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
  3299. }
  3300. function listWeekdaysMin (localeSorted, format, index) {
  3301. return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
  3302. }
  3303. getSetGlobalLocale('en', {
  3304. ordinalParse: /\d{1,2}(th|st|nd|rd)/,
  3305. ordinal : function (number) {
  3306. var b = number % 10,
  3307. output = (toInt(number % 100 / 10) === 1) ? 'th' :
  3308. (b === 1) ? 'st' :
  3309. (b === 2) ? 'nd' :
  3310. (b === 3) ? 'rd' : 'th';
  3311. return number + output;
  3312. }
  3313. });
  3314. // Side effect imports
  3315. hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
  3316. hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
  3317. var mathAbs = Math.abs;
  3318. function abs () {
  3319. var data = this._data;
  3320. this._milliseconds = mathAbs(this._milliseconds);
  3321. this._days = mathAbs(this._days);
  3322. this._months = mathAbs(this._months);
  3323. data.milliseconds = mathAbs(data.milliseconds);
  3324. data.seconds = mathAbs(data.seconds);
  3325. data.minutes = mathAbs(data.minutes);
  3326. data.hours = mathAbs(data.hours);
  3327. data.months = mathAbs(data.months);
  3328. data.years = mathAbs(data.years);
  3329. return this;
  3330. }
  3331. function addSubtract$1 (duration, input, value, direction) {
  3332. var other = createDuration(input, value);
  3333. duration._milliseconds += direction * other._milliseconds;
  3334. duration._days += direction * other._days;
  3335. duration._months += direction * other._months;
  3336. return duration._bubble();
  3337. }
  3338. // supports only 2.0-style add(1, 's') or add(duration)
  3339. function add$1 (input, value) {
  3340. return addSubtract$1(this, input, value, 1);
  3341. }
  3342. // supports only 2.0-style subtract(1, 's') or subtract(duration)
  3343. function subtract$1 (input, value) {
  3344. return addSubtract$1(this, input, value, -1);
  3345. }
  3346. function absCeil (number) {
  3347. if (number < 0) {
  3348. return Math.floor(number);
  3349. } else {
  3350. return Math.ceil(number);
  3351. }
  3352. }
  3353. function bubble () {
  3354. var milliseconds = this._milliseconds;
  3355. var days = this._days;
  3356. var months = this._months;
  3357. var data = this._data;
  3358. var seconds, minutes, hours, years, monthsFromDays;
  3359. // if we have a mix of positive and negative values, bubble down first
  3360. // check: https://github.com/moment/moment/issues/2166
  3361. if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
  3362. (milliseconds <= 0 && days <= 0 && months <= 0))) {
  3363. milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
  3364. days = 0;
  3365. months = 0;
  3366. }
  3367. // The following code bubbles up values, see the tests for
  3368. // examples of what that means.
  3369. data.milliseconds = milliseconds % 1000;
  3370. seconds = absFloor(milliseconds / 1000);
  3371. data.seconds = seconds % 60;
  3372. minutes = absFloor(seconds / 60);
  3373. data.minutes = minutes % 60;
  3374. hours = absFloor(minutes / 60);
  3375. data.hours = hours % 24;
  3376. days += absFloor(hours / 24);
  3377. // convert days to months
  3378. monthsFromDays = absFloor(daysToMonths(days));
  3379. months += monthsFromDays;
  3380. days -= absCeil(monthsToDays(monthsFromDays));
  3381. // 12 months -> 1 year
  3382. years = absFloor(months / 12);
  3383. months %= 12;
  3384. data.days = days;
  3385. data.months = months;
  3386. data.years = years;
  3387. return this;
  3388. }
  3389. function daysToMonths (days) {
  3390. // 400 years have 146097 days (taking into account leap year rules)
  3391. // 400 years have 12 months === 4800
  3392. return days * 4800 / 146097;
  3393. }
  3394. function monthsToDays (months) {
  3395. // the reverse of daysToMonths
  3396. return months * 146097 / 4800;
  3397. }
  3398. function as (units) {
  3399. var days;
  3400. var months;
  3401. var milliseconds = this._milliseconds;
  3402. units = normalizeUnits(units);
  3403. if (units === 'month' || units === 'year') {
  3404. days = this._days + milliseconds / 864e5;
  3405. months = this._months + daysToMonths(days);
  3406. return units === 'month' ? months : months / 12;
  3407. } else {
  3408. // handle milliseconds separately because of floating point math errors (issue #1867)
  3409. days = this._days + Math.round(monthsToDays(this._months));
  3410. switch (units) {
  3411. case 'week' : return days / 7 + milliseconds / 6048e5;
  3412. case 'day' : return days + milliseconds / 864e5;
  3413. case 'hour' : return days * 24 + milliseconds / 36e5;
  3414. case 'minute' : return days * 1440 + milliseconds / 6e4;
  3415. case 'second' : return days * 86400 + milliseconds / 1000;
  3416. // Math.floor prevents floating point math errors here
  3417. case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
  3418. default: throw new Error('Unknown unit ' + units);
  3419. }
  3420. }
  3421. }
  3422. // TODO: Use this.as('ms')?
  3423. function valueOf$1 () {
  3424. return (
  3425. this._milliseconds +
  3426. this._days * 864e5 +
  3427. (this._months % 12) * 2592e6 +
  3428. toInt(this._months / 12) * 31536e6
  3429. );
  3430. }
  3431. function makeAs (alias) {
  3432. return function () {
  3433. return this.as(alias);
  3434. };
  3435. }
  3436. var asMilliseconds = makeAs('ms');
  3437. var asSeconds = makeAs('s');
  3438. var asMinutes = makeAs('m');
  3439. var asHours = makeAs('h');
  3440. var asDays = makeAs('d');
  3441. var asWeeks = makeAs('w');
  3442. var asMonths = makeAs('M');
  3443. var asYears = makeAs('y');
  3444. function get$2 (units) {
  3445. units = normalizeUnits(units);
  3446. return this[units + 's']();
  3447. }
  3448. function makeGetter(name) {
  3449. return function () {
  3450. return this._data[name];
  3451. };
  3452. }
  3453. var milliseconds = makeGetter('milliseconds');
  3454. var seconds = makeGetter('seconds');
  3455. var minutes = makeGetter('minutes');
  3456. var hours = makeGetter('hours');
  3457. var days = makeGetter('days');
  3458. var months = makeGetter('months');
  3459. var years = makeGetter('years');
  3460. function weeks () {
  3461. return absFloor(this.days() / 7);
  3462. }
  3463. var round = Math.round;
  3464. var thresholds = {
  3465. s: 45, // seconds to minute
  3466. m: 45, // minutes to hour
  3467. h: 22, // hours to day
  3468. d: 26, // days to month
  3469. M: 11 // months to year
  3470. };
  3471. // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
  3472. function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
  3473. return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
  3474. }
  3475. function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
  3476. var duration = createDuration(posNegDuration).abs();
  3477. var seconds = round(duration.as('s'));
  3478. var minutes = round(duration.as('m'));
  3479. var hours = round(duration.as('h'));
  3480. var days = round(duration.as('d'));
  3481. var months = round(duration.as('M'));
  3482. var years = round(duration.as('y'));
  3483. var a = seconds < thresholds.s && ['s', seconds] ||
  3484. minutes <= 1 && ['m'] ||
  3485. minutes < thresholds.m && ['mm', minutes] ||
  3486. hours <= 1 && ['h'] ||
  3487. hours < thresholds.h && ['hh', hours] ||
  3488. days <= 1 && ['d'] ||
  3489. days < thresholds.d && ['dd', days] ||
  3490. months <= 1 && ['M'] ||
  3491. months < thresholds.M && ['MM', months] ||
  3492. years <= 1 && ['y'] || ['yy', years];
  3493. a[2] = withoutSuffix;
  3494. a[3] = +posNegDuration > 0;
  3495. a[4] = locale;
  3496. return substituteTimeAgo.apply(null, a);
  3497. }
  3498. // This function allows you to set the rounding function for relative time strings
  3499. function getSetRelativeTimeRounding (roundingFunction) {
  3500. if (roundingFunction === undefined) {
  3501. return round;
  3502. }
  3503. if (typeof(roundingFunction) === 'function') {
  3504. round = roundingFunction;
  3505. return true;
  3506. }
  3507. return false;
  3508. }
  3509. // This function allows you to set a threshold for relative time strings
  3510. function getSetRelativeTimeThreshold (threshold, limit) {
  3511. if (thresholds[threshold] === undefined) {
  3512. return false;
  3513. }
  3514. if (limit === undefined) {
  3515. return thresholds[threshold];
  3516. }
  3517. thresholds[threshold] = limit;
  3518. return true;
  3519. }
  3520. function humanize (withSuffix) {
  3521. var locale = this.localeData();
  3522. var output = relativeTime$1(this, !withSuffix, locale);
  3523. if (withSuffix) {
  3524. output = locale.pastFuture(+this, output);
  3525. }
  3526. return locale.postformat(output);
  3527. }
  3528. var abs$1 = Math.abs;
  3529. function toISOString$1() {
  3530. // for ISO strings we do not use the normal bubbling rules:
  3531. // * milliseconds bubble up until they become hours
  3532. // * days do not bubble at all
  3533. // * months bubble up until they become years
  3534. // This is because there is no context-free conversion between hours and days
  3535. // (think of clock changes)
  3536. // and also not between days and months (28-31 days per month)
  3537. var seconds = abs$1(this._milliseconds) / 1000;
  3538. var days = abs$1(this._days);
  3539. var months = abs$1(this._months);
  3540. var minutes, hours, years;
  3541. // 3600 seconds -> 60 minutes -> 1 hour
  3542. minutes = absFloor(seconds / 60);
  3543. hours = absFloor(minutes / 60);
  3544. seconds %= 60;
  3545. minutes %= 60;
  3546. // 12 months -> 1 year
  3547. years = absFloor(months / 12);
  3548. months %= 12;
  3549. // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
  3550. var Y = years;
  3551. var M = months;
  3552. var D = days;
  3553. var h = hours;
  3554. var m = minutes;
  3555. var s = seconds;
  3556. var total = this.asSeconds();
  3557. if (!total) {
  3558. // this is the same as C#'s (Noda) and python (isodate)...
  3559. // but not other JS (goog.date)
  3560. return 'P0D';
  3561. }
  3562. return (total < 0 ? '-' : '') +
  3563. 'P' +
  3564. (Y ? Y + 'Y' : '') +
  3565. (M ? M + 'M' : '') +
  3566. (D ? D + 'D' : '') +
  3567. ((h || m || s) ? 'T' : '') +
  3568. (h ? h + 'H' : '') +
  3569. (m ? m + 'M' : '') +
  3570. (s ? s + 'S' : '');
  3571. }
  3572. var proto$2 = Duration.prototype;
  3573. proto$2.abs = abs;
  3574. proto$2.add = add$1;
  3575. proto$2.subtract = subtract$1;
  3576. proto$2.as = as;
  3577. proto$2.asMilliseconds = asMilliseconds;
  3578. proto$2.asSeconds = asSeconds;
  3579. proto$2.asMinutes = asMinutes;
  3580. proto$2.asHours = asHours;
  3581. proto$2.asDays = asDays;
  3582. proto$2.asWeeks = asWeeks;
  3583. proto$2.asMonths = asMonths;
  3584. proto$2.asYears = asYears;
  3585. proto$2.valueOf = valueOf$1;
  3586. proto$2._bubble = bubble;
  3587. proto$2.get = get$2;
  3588. proto$2.milliseconds = milliseconds;
  3589. proto$2.seconds = seconds;
  3590. proto$2.minutes = minutes;
  3591. proto$2.hours = hours;
  3592. proto$2.days = days;
  3593. proto$2.weeks = weeks;
  3594. proto$2.months = months;
  3595. proto$2.years = years;
  3596. proto$2.humanize = humanize;
  3597. proto$2.toISOString = toISOString$1;
  3598. proto$2.toString = toISOString$1;
  3599. proto$2.toJSON = toISOString$1;
  3600. proto$2.locale = locale;
  3601. proto$2.localeData = localeData;
  3602. // Deprecations
  3603. proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
  3604. proto$2.lang = lang;
  3605. // Side effect imports
  3606. // FORMATTING
  3607. addFormatToken('X', 0, 0, 'unix');
  3608. addFormatToken('x', 0, 0, 'valueOf');
  3609. // PARSING
  3610. addRegexToken('x', matchSigned);
  3611. addRegexToken('X', matchTimestamp);
  3612. addParseToken('X', function (input, array, config) {
  3613. config._d = new Date(parseFloat(input, 10) * 1000);
  3614. });
  3615. addParseToken('x', function (input, array, config) {
  3616. config._d = new Date(toInt(input));
  3617. });
  3618. // Side effect imports
  3619. hooks.version = '2.17.1';
  3620. setHookCallback(createLocal);
  3621. hooks.fn = proto;
  3622. hooks.min = min;
  3623. hooks.max = max;
  3624. hooks.now = now;
  3625. hooks.utc = createUTC;
  3626. hooks.unix = createUnix;
  3627. hooks.months = listMonths;
  3628. hooks.isDate = isDate;
  3629. hooks.locale = getSetGlobalLocale;
  3630. hooks.invalid = createInvalid;
  3631. hooks.duration = createDuration;
  3632. hooks.isMoment = isMoment;
  3633. hooks.weekdays = listWeekdays;
  3634. hooks.parseZone = createInZone;
  3635. hooks.localeData = getLocale;
  3636. hooks.isDuration = isDuration;
  3637. hooks.monthsShort = listMonthsShort;
  3638. hooks.weekdaysMin = listWeekdaysMin;
  3639. hooks.defineLocale = defineLocale;
  3640. hooks.updateLocale = updateLocale;
  3641. hooks.locales = listLocales;
  3642. hooks.weekdaysShort = listWeekdaysShort;
  3643. hooks.normalizeUnits = normalizeUnits;
  3644. hooks.relativeTimeRounding = getSetRelativeTimeRounding;
  3645. hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
  3646. hooks.calendarFormat = getCalendarFormat;
  3647. hooks.prototype = proto;
  3648. return hooks;
  3649. })));
  3650. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(186)(module)))
  3651. /***/ }),
  3652. /* 1 */
  3653. /***/ (function(module, exports) {
  3654. module.exports = function normalizeComponent (
  3655. rawScriptExports,
  3656. compiledTemplate,
  3657. scopeId,
  3658. cssModules
  3659. ) {
  3660. var esModule
  3661. var scriptExports = rawScriptExports = rawScriptExports || {}
  3662. // ES6 modules interop
  3663. var type = typeof rawScriptExports.default
  3664. if (type === 'object' || type === 'function') {
  3665. esModule = rawScriptExports
  3666. scriptExports = rawScriptExports.default
  3667. }
  3668. // Vue.extend constructor export interop
  3669. var options = typeof scriptExports === 'function'
  3670. ? scriptExports.options
  3671. : scriptExports
  3672. // render functions
  3673. if (compiledTemplate) {
  3674. options.render = compiledTemplate.render
  3675. options.staticRenderFns = compiledTemplate.staticRenderFns
  3676. }
  3677. // scopedId
  3678. if (scopeId) {
  3679. options._scopeId = scopeId
  3680. }
  3681. // inject cssModules
  3682. if (cssModules) {
  3683. var computed = options.computed || (options.computed = {})
  3684. Object.keys(cssModules).forEach(function (key) {
  3685. var module = cssModules[key]
  3686. computed[key] = function () { return module }
  3687. })
  3688. }
  3689. return {
  3690. esModule: esModule,
  3691. exports: scriptExports,
  3692. options: options
  3693. }
  3694. }
  3695. /***/ }),
  3696. /* 2 */
  3697. /***/ (function(module, exports, __webpack_require__) {
  3698. var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
  3699. * jQuery JavaScript Library v3.1.1
  3700. * https://jquery.com/
  3701. *
  3702. * Includes Sizzle.js
  3703. * https://sizzlejs.com/
  3704. *
  3705. * Copyright jQuery Foundation and other contributors
  3706. * Released under the MIT license
  3707. * https://jquery.org/license
  3708. *
  3709. * Date: 2016-09-22T22:30Z
  3710. */
  3711. ( function( global, factory ) {
  3712. "use strict";
  3713. if ( typeof module === "object" && typeof module.exports === "object" ) {
  3714. // For CommonJS and CommonJS-like environments where a proper `window`
  3715. // is present, execute the factory and get jQuery.
  3716. // For environments that do not have a `window` with a `document`
  3717. // (such as Node.js), expose a factory as module.exports.
  3718. // This accentuates the need for the creation of a real `window`.
  3719. // e.g. var jQuery = require("jquery")(window);
  3720. // See ticket #14549 for more info.
  3721. module.exports = global.document ?
  3722. factory( global, true ) :
  3723. function( w ) {
  3724. if ( !w.document ) {
  3725. throw new Error( "jQuery requires a window with a document" );
  3726. }
  3727. return factory( w );
  3728. };
  3729. } else {
  3730. factory( global );
  3731. }
  3732. // Pass this if window is not defined yet
  3733. } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
  3734. // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
  3735. // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
  3736. // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
  3737. // enough that all such attempts are guarded in a try block.
  3738. "use strict";
  3739. var arr = [];
  3740. var document = window.document;
  3741. var getProto = Object.getPrototypeOf;
  3742. var slice = arr.slice;
  3743. var concat = arr.concat;
  3744. var push = arr.push;
  3745. var indexOf = arr.indexOf;
  3746. var class2type = {};
  3747. var toString = class2type.toString;
  3748. var hasOwn = class2type.hasOwnProperty;
  3749. var fnToString = hasOwn.toString;
  3750. var ObjectFunctionString = fnToString.call( Object );
  3751. var support = {};
  3752. function DOMEval( code, doc ) {
  3753. doc = doc || document;
  3754. var script = doc.createElement( "script" );
  3755. script.text = code;
  3756. doc.head.appendChild( script ).parentNode.removeChild( script );
  3757. }
  3758. /* global Symbol */
  3759. // Defining this global in .eslintrc.json would create a danger of using the global
  3760. // unguarded in another place, it seems safer to define global only for this module
  3761. var
  3762. version = "3.1.1",
  3763. // Define a local copy of jQuery
  3764. jQuery = function( selector, context ) {
  3765. // The jQuery object is actually just the init constructor 'enhanced'
  3766. // Need init if jQuery is called (just allow error to be thrown if not included)
  3767. return new jQuery.fn.init( selector, context );
  3768. },
  3769. // Support: Android <=4.0 only
  3770. // Make sure we trim BOM and NBSP
  3771. rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
  3772. // Matches dashed string for camelizing
  3773. rmsPrefix = /^-ms-/,
  3774. rdashAlpha = /-([a-z])/g,
  3775. // Used by jQuery.camelCase as callback to replace()
  3776. fcamelCase = function( all, letter ) {
  3777. return letter.toUpperCase();
  3778. };
  3779. jQuery.fn = jQuery.prototype = {
  3780. // The current version of jQuery being used
  3781. jquery: version,
  3782. constructor: jQuery,
  3783. // The default length of a jQuery object is 0
  3784. length: 0,
  3785. toArray: function() {
  3786. return slice.call( this );
  3787. },
  3788. // Get the Nth element in the matched element set OR
  3789. // Get the whole matched element set as a clean array
  3790. get: function( num ) {
  3791. // Return all the elements in a clean array
  3792. if ( num == null ) {
  3793. return slice.call( this );
  3794. }
  3795. // Return just the one element from the set
  3796. return num < 0 ? this[ num + this.length ] : this[ num ];
  3797. },
  3798. // Take an array of elements and push it onto the stack
  3799. // (returning the new matched element set)
  3800. pushStack: function( elems ) {
  3801. // Build a new jQuery matched element set
  3802. var ret = jQuery.merge( this.constructor(), elems );
  3803. // Add the old object onto the stack (as a reference)
  3804. ret.prevObject = this;
  3805. // Return the newly-formed element set
  3806. return ret;
  3807. },
  3808. // Execute a callback for every element in the matched set.
  3809. each: function( callback ) {
  3810. return jQuery.each( this, callback );
  3811. },
  3812. map: function( callback ) {
  3813. return this.pushStack( jQuery.map( this, function( elem, i ) {
  3814. return callback.call( elem, i, elem );
  3815. } ) );
  3816. },
  3817. slice: function() {
  3818. return this.pushStack( slice.apply( this, arguments ) );
  3819. },
  3820. first: function() {
  3821. return this.eq( 0 );
  3822. },
  3823. last: function() {
  3824. return this.eq( -1 );
  3825. },
  3826. eq: function( i ) {
  3827. var len = this.length,
  3828. j = +i + ( i < 0 ? len : 0 );
  3829. return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
  3830. },
  3831. end: function() {
  3832. return this.prevObject || this.constructor();
  3833. },
  3834. // For internal use only.
  3835. // Behaves like an Array's method, not like a jQuery method.
  3836. push: push,
  3837. sort: arr.sort,
  3838. splice: arr.splice
  3839. };
  3840. jQuery.extend = jQuery.fn.extend = function() {
  3841. var options, name, src, copy, copyIsArray, clone,
  3842. target = arguments[ 0 ] || {},
  3843. i = 1,
  3844. length = arguments.length,
  3845. deep = false;
  3846. // Handle a deep copy situation
  3847. if ( typeof target === "boolean" ) {
  3848. deep = target;
  3849. // Skip the boolean and the target
  3850. target = arguments[ i ] || {};
  3851. i++;
  3852. }
  3853. // Handle case when target is a string or something (possible in deep copy)
  3854. if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
  3855. target = {};
  3856. }
  3857. // Extend jQuery itself if only one argument is passed
  3858. if ( i === length ) {
  3859. target = this;
  3860. i--;
  3861. }
  3862. for ( ; i < length; i++ ) {
  3863. // Only deal with non-null/undefined values
  3864. if ( ( options = arguments[ i ] ) != null ) {
  3865. // Extend the base object
  3866. for ( name in options ) {
  3867. src = target[ name ];
  3868. copy = options[ name ];
  3869. // Prevent never-ending loop
  3870. if ( target === copy ) {
  3871. continue;
  3872. }
  3873. // Recurse if we're merging plain objects or arrays
  3874. if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
  3875. ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
  3876. if ( copyIsArray ) {
  3877. copyIsArray = false;
  3878. clone = src && jQuery.isArray( src ) ? src : [];
  3879. } else {
  3880. clone = src && jQuery.isPlainObject( src ) ? src : {};
  3881. }
  3882. // Never move original objects, clone them
  3883. target[ name ] = jQuery.extend( deep, clone, copy );
  3884. // Don't bring in undefined values
  3885. } else if ( copy !== undefined ) {
  3886. target[ name ] = copy;
  3887. }
  3888. }
  3889. }
  3890. }
  3891. // Return the modified object
  3892. return target;
  3893. };
  3894. jQuery.extend( {
  3895. // Unique for each copy of jQuery on the page
  3896. expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
  3897. // Assume jQuery is ready without the ready module
  3898. isReady: true,
  3899. error: function( msg ) {
  3900. throw new Error( msg );
  3901. },
  3902. noop: function() {},
  3903. isFunction: function( obj ) {
  3904. return jQuery.type( obj ) === "function";
  3905. },
  3906. isArray: Array.isArray,
  3907. isWindow: function( obj ) {
  3908. return obj != null && obj === obj.window;
  3909. },
  3910. isNumeric: function( obj ) {
  3911. // As of jQuery 3.0, isNumeric is limited to
  3912. // strings and numbers (primitives or objects)
  3913. // that can be coerced to finite numbers (gh-2662)
  3914. var type = jQuery.type( obj );
  3915. return ( type === "number" || type === "string" ) &&
  3916. // parseFloat NaNs numeric-cast false positives ("")
  3917. // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  3918. // subtraction forces infinities to NaN
  3919. !isNaN( obj - parseFloat( obj ) );
  3920. },
  3921. isPlainObject: function( obj ) {
  3922. var proto, Ctor;
  3923. // Detect obvious negatives
  3924. // Use toString instead of jQuery.type to catch host objects
  3925. if ( !obj || toString.call( obj ) !== "[object Object]" ) {
  3926. return false;
  3927. }
  3928. proto = getProto( obj );
  3929. // Objects with no prototype (e.g., `Object.create( null )`) are plain
  3930. if ( !proto ) {
  3931. return true;
  3932. }
  3933. // Objects with prototype are plain iff they were constructed by a global Object function
  3934. Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
  3935. return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
  3936. },
  3937. isEmptyObject: function( obj ) {
  3938. /* eslint-disable no-unused-vars */
  3939. // See https://github.com/eslint/eslint/issues/6125
  3940. var name;
  3941. for ( name in obj ) {
  3942. return false;
  3943. }
  3944. return true;
  3945. },
  3946. type: function( obj ) {
  3947. if ( obj == null ) {
  3948. return obj + "";
  3949. }
  3950. // Support: Android <=2.3 only (functionish RegExp)
  3951. return typeof obj === "object" || typeof obj === "function" ?
  3952. class2type[ toString.call( obj ) ] || "object" :
  3953. typeof obj;
  3954. },
  3955. // Evaluates a script in a global context
  3956. globalEval: function( code ) {
  3957. DOMEval( code );
  3958. },
  3959. // Convert dashed to camelCase; used by the css and data modules
  3960. // Support: IE <=9 - 11, Edge 12 - 13
  3961. // Microsoft forgot to hump their vendor prefix (#9572)
  3962. camelCase: function( string ) {
  3963. return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
  3964. },
  3965. nodeName: function( elem, name ) {
  3966. return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
  3967. },
  3968. each: function( obj, callback ) {
  3969. var length, i = 0;
  3970. if ( isArrayLike( obj ) ) {
  3971. length = obj.length;
  3972. for ( ; i < length; i++ ) {
  3973. if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
  3974. break;
  3975. }
  3976. }
  3977. } else {
  3978. for ( i in obj ) {
  3979. if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
  3980. break;
  3981. }
  3982. }
  3983. }
  3984. return obj;
  3985. },
  3986. // Support: Android <=4.0 only
  3987. trim: function( text ) {
  3988. return text == null ?
  3989. "" :
  3990. ( text + "" ).replace( rtrim, "" );
  3991. },
  3992. // results is for internal usage only
  3993. makeArray: function( arr, results ) {
  3994. var ret = results || [];
  3995. if ( arr != null ) {
  3996. if ( isArrayLike( Object( arr ) ) ) {
  3997. jQuery.merge( ret,
  3998. typeof arr === "string" ?
  3999. [ arr ] : arr
  4000. );
  4001. } else {
  4002. push.call( ret, arr );
  4003. }
  4004. }
  4005. return ret;
  4006. },
  4007. inArray: function( elem, arr, i ) {
  4008. return arr == null ? -1 : indexOf.call( arr, elem, i );
  4009. },
  4010. // Support: Android <=4.0 only, PhantomJS 1 only
  4011. // push.apply(_, arraylike) throws on ancient WebKit
  4012. merge: function( first, second ) {
  4013. var len = +second.length,
  4014. j = 0,
  4015. i = first.length;
  4016. for ( ; j < len; j++ ) {
  4017. first[ i++ ] = second[ j ];
  4018. }
  4019. first.length = i;
  4020. return first;
  4021. },
  4022. grep: function( elems, callback, invert ) {
  4023. var callbackInverse,
  4024. matches = [],
  4025. i = 0,
  4026. length = elems.length,
  4027. callbackExpect = !invert;
  4028. // Go through the array, only saving the items
  4029. // that pass the validator function
  4030. for ( ; i < length; i++ ) {
  4031. callbackInverse = !callback( elems[ i ], i );
  4032. if ( callbackInverse !== callbackExpect ) {
  4033. matches.push( elems[ i ] );
  4034. }
  4035. }
  4036. return matches;
  4037. },
  4038. // arg is for internal usage only
  4039. map: function( elems, callback, arg ) {
  4040. var length, value,
  4041. i = 0,
  4042. ret = [];
  4043. // Go through the array, translating each of the items to their new values
  4044. if ( isArrayLike( elems ) ) {
  4045. length = elems.length;
  4046. for ( ; i < length; i++ ) {
  4047. value = callback( elems[ i ], i, arg );
  4048. if ( value != null ) {
  4049. ret.push( value );
  4050. }
  4051. }
  4052. // Go through every key on the object,
  4053. } else {
  4054. for ( i in elems ) {
  4055. value = callback( elems[ i ], i, arg );
  4056. if ( value != null ) {
  4057. ret.push( value );
  4058. }
  4059. }
  4060. }
  4061. // Flatten any nested arrays
  4062. return concat.apply( [], ret );
  4063. },
  4064. // A global GUID counter for objects
  4065. guid: 1,
  4066. // Bind a function to a context, optionally partially applying any
  4067. // arguments.
  4068. proxy: function( fn, context ) {
  4069. var tmp, args, proxy;
  4070. if ( typeof context === "string" ) {
  4071. tmp = fn[ context ];
  4072. context = fn;
  4073. fn = tmp;
  4074. }
  4075. // Quick check to determine if target is callable, in the spec
  4076. // this throws a TypeError, but we will just return undefined.
  4077. if ( !jQuery.isFunction( fn ) ) {
  4078. return undefined;
  4079. }
  4080. // Simulated bind
  4081. args = slice.call( arguments, 2 );
  4082. proxy = function() {
  4083. return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
  4084. };
  4085. // Set the guid of unique handler to the same of original handler, so it can be removed
  4086. proxy.guid = fn.guid = fn.guid || jQuery.guid++;
  4087. return proxy;
  4088. },
  4089. now: Date.now,
  4090. // jQuery.support is not used in Core but other projects attach their
  4091. // properties to it so it needs to exist.
  4092. support: support
  4093. } );
  4094. if ( typeof Symbol === "function" ) {
  4095. jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
  4096. }
  4097. // Populate the class2type map
  4098. jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
  4099. function( i, name ) {
  4100. class2type[ "[object " + name + "]" ] = name.toLowerCase();
  4101. } );
  4102. function isArrayLike( obj ) {
  4103. // Support: real iOS 8.2 only (not reproducible in simulator)
  4104. // `in` check used to prevent JIT error (gh-2145)
  4105. // hasOwn isn't used here due to false negatives
  4106. // regarding Nodelist length in IE
  4107. var length = !!obj && "length" in obj && obj.length,
  4108. type = jQuery.type( obj );
  4109. if ( type === "function" || jQuery.isWindow( obj ) ) {
  4110. return false;
  4111. }
  4112. return type === "array" || length === 0 ||
  4113. typeof length === "number" && length > 0 && ( length - 1 ) in obj;
  4114. }
  4115. var Sizzle =
  4116. /*!
  4117. * Sizzle CSS Selector Engine v2.3.3
  4118. * https://sizzlejs.com/
  4119. *
  4120. * Copyright jQuery Foundation and other contributors
  4121. * Released under the MIT license
  4122. * http://jquery.org/license
  4123. *
  4124. * Date: 2016-08-08
  4125. */
  4126. (function( window ) {
  4127. var i,
  4128. support,
  4129. Expr,
  4130. getText,
  4131. isXML,
  4132. tokenize,
  4133. compile,
  4134. select,
  4135. outermostContext,
  4136. sortInput,
  4137. hasDuplicate,
  4138. // Local document vars
  4139. setDocument,
  4140. document,
  4141. docElem,
  4142. documentIsHTML,
  4143. rbuggyQSA,
  4144. rbuggyMatches,
  4145. matches,
  4146. contains,
  4147. // Instance-specific data
  4148. expando = "sizzle" + 1 * new Date(),
  4149. preferredDoc = window.document,
  4150. dirruns = 0,
  4151. done = 0,
  4152. classCache = createCache(),
  4153. tokenCache = createCache(),
  4154. compilerCache = createCache(),
  4155. sortOrder = function( a, b ) {
  4156. if ( a === b ) {
  4157. hasDuplicate = true;
  4158. }
  4159. return 0;
  4160. },
  4161. // Instance methods
  4162. hasOwn = ({}).hasOwnProperty,
  4163. arr = [],
  4164. pop = arr.pop,
  4165. push_native = arr.push,
  4166. push = arr.push,
  4167. slice = arr.slice,
  4168. // Use a stripped-down indexOf as it's faster than native
  4169. // https://jsperf.com/thor-indexof-vs-for/5
  4170. indexOf = function( list, elem ) {
  4171. var i = 0,
  4172. len = list.length;
  4173. for ( ; i < len; i++ ) {
  4174. if ( list[i] === elem ) {
  4175. return i;
  4176. }
  4177. }
  4178. return -1;
  4179. },
  4180. booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
  4181. // Regular expressions
  4182. // http://www.w3.org/TR/css3-selectors/#whitespace
  4183. whitespace = "[\\x20\\t\\r\\n\\f]",
  4184. // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
  4185. identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
  4186. // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
  4187. attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
  4188. // Operator (capture 2)
  4189. "*([*^$|!~]?=)" + whitespace +
  4190. // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
  4191. "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
  4192. "*\\]",
  4193. pseudos = ":(" + identifier + ")(?:\\((" +
  4194. // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
  4195. // 1. quoted (capture 3; capture 4 or capture 5)
  4196. "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
  4197. // 2. simple (capture 6)
  4198. "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
  4199. // 3. anything else (capture 2)
  4200. ".*" +
  4201. ")\\)|)",
  4202. // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
  4203. rwhitespace = new RegExp( whitespace + "+", "g" ),
  4204. rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
  4205. rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
  4206. rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
  4207. rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
  4208. rpseudo = new RegExp( pseudos ),
  4209. ridentifier = new RegExp( "^" + identifier + "$" ),
  4210. matchExpr = {
  4211. "ID": new RegExp( "^#(" + identifier + ")" ),
  4212. "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
  4213. "TAG": new RegExp( "^(" + identifier + "|[*])" ),
  4214. "ATTR": new RegExp( "^" + attributes ),
  4215. "PSEUDO": new RegExp( "^" + pseudos ),
  4216. "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
  4217. "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
  4218. "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
  4219. "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
  4220. // For use in libraries implementing .is()
  4221. // We use this for POS matching in `select`
  4222. "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
  4223. whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
  4224. },
  4225. rinputs = /^(?:input|select|textarea|button)$/i,
  4226. rheader = /^h\d$/i,
  4227. rnative = /^[^{]+\{\s*\[native \w/,
  4228. // Easily-parseable/retrievable ID or TAG or CLASS selectors
  4229. rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
  4230. rsibling = /[+~]/,
  4231. // CSS escapes
  4232. // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
  4233. runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
  4234. funescape = function( _, escaped, escapedWhitespace ) {
  4235. var high = "0x" + escaped - 0x10000;
  4236. // NaN means non-codepoint
  4237. // Support: Firefox<24
  4238. // Workaround erroneous numeric interpretation of +"0x"
  4239. return high !== high || escapedWhitespace ?
  4240. escaped :
  4241. high < 0 ?
  4242. // BMP codepoint
  4243. String.fromCharCode( high + 0x10000 ) :
  4244. // Supplemental Plane codepoint (surrogate pair)
  4245. String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
  4246. },
  4247. // CSS string/identifier serialization
  4248. // https://drafts.csswg.org/cssom/#common-serializing-idioms
  4249. rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
  4250. fcssescape = function( ch, asCodePoint ) {
  4251. if ( asCodePoint ) {
  4252. // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
  4253. if ( ch === "\0" ) {
  4254. return "\uFFFD";
  4255. }
  4256. // Control characters and (dependent upon position) numbers get escaped as code points
  4257. return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
  4258. }
  4259. // Other potentially-special ASCII characters get backslash-escaped
  4260. return "\\" + ch;
  4261. },
  4262. // Used for iframes
  4263. // See setDocument()
  4264. // Removing the function wrapper causes a "Permission Denied"
  4265. // error in IE
  4266. unloadHandler = function() {
  4267. setDocument();
  4268. },
  4269. disabledAncestor = addCombinator(
  4270. function( elem ) {
  4271. return elem.disabled === true && ("form" in elem || "label" in elem);
  4272. },
  4273. { dir: "parentNode", next: "legend" }
  4274. );
  4275. // Optimize for push.apply( _, NodeList )
  4276. try {
  4277. push.apply(
  4278. (arr = slice.call( preferredDoc.childNodes )),
  4279. preferredDoc.childNodes
  4280. );
  4281. // Support: Android<4.0
  4282. // Detect silently failing push.apply
  4283. arr[ preferredDoc.childNodes.length ].nodeType;
  4284. } catch ( e ) {
  4285. push = { apply: arr.length ?
  4286. // Leverage slice if possible
  4287. function( target, els ) {
  4288. push_native.apply( target, slice.call(els) );
  4289. } :
  4290. // Support: IE<9
  4291. // Otherwise append directly
  4292. function( target, els ) {
  4293. var j = target.length,
  4294. i = 0;
  4295. // Can't trust NodeList.length
  4296. while ( (target[j++] = els[i++]) ) {}
  4297. target.length = j - 1;
  4298. }
  4299. };
  4300. }
  4301. function Sizzle( selector, context, results, seed ) {
  4302. var m, i, elem, nid, match, groups, newSelector,
  4303. newContext = context && context.ownerDocument,
  4304. // nodeType defaults to 9, since context defaults to document
  4305. nodeType = context ? context.nodeType : 9;
  4306. results = results || [];
  4307. // Return early from calls with invalid selector or context
  4308. if ( typeof selector !== "string" || !selector ||
  4309. nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
  4310. return results;
  4311. }
  4312. // Try to shortcut find operations (as opposed to filters) in HTML documents
  4313. if ( !seed ) {
  4314. if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
  4315. setDocument( context );
  4316. }
  4317. context = context || document;
  4318. if ( documentIsHTML ) {
  4319. // If the selector is sufficiently simple, try using a "get*By*" DOM method
  4320. // (excepting DocumentFragment context, where the methods don't exist)
  4321. if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
  4322. // ID selector
  4323. if ( (m = match[1]) ) {
  4324. // Document context
  4325. if ( nodeType === 9 ) {
  4326. if ( (elem = context.getElementById( m )) ) {
  4327. // Support: IE, Opera, Webkit
  4328. // TODO: identify versions
  4329. // getElementById can match elements by name instead of ID
  4330. if ( elem.id === m ) {
  4331. results.push( elem );
  4332. return results;
  4333. }
  4334. } else {
  4335. return results;
  4336. }
  4337. // Element context
  4338. } else {
  4339. // Support: IE, Opera, Webkit
  4340. // TODO: identify versions
  4341. // getElementById can match elements by name instead of ID
  4342. if ( newContext && (elem = newContext.getElementById( m )) &&
  4343. contains( context, elem ) &&
  4344. elem.id === m ) {
  4345. results.push( elem );
  4346. return results;
  4347. }
  4348. }
  4349. // Type selector
  4350. } else if ( match[2] ) {
  4351. push.apply( results, context.getElementsByTagName( selector ) );
  4352. return results;
  4353. // Class selector
  4354. } else if ( (m = match[3]) && support.getElementsByClassName &&
  4355. context.getElementsByClassName ) {
  4356. push.apply( results, context.getElementsByClassName( m ) );
  4357. return results;
  4358. }
  4359. }
  4360. // Take advantage of querySelectorAll
  4361. if ( support.qsa &&
  4362. !compilerCache[ selector + " " ] &&
  4363. (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
  4364. if ( nodeType !== 1 ) {
  4365. newContext = context;
  4366. newSelector = selector;
  4367. // qSA looks outside Element context, which is not what we want
  4368. // Thanks to Andrew Dupont for this workaround technique
  4369. // Support: IE <=8
  4370. // Exclude object elements
  4371. } else if ( context.nodeName.toLowerCase() !== "object" ) {
  4372. // Capture the context ID, setting it first if necessary
  4373. if ( (nid = context.getAttribute( "id" )) ) {
  4374. nid = nid.replace( rcssescape, fcssescape );
  4375. } else {
  4376. context.setAttribute( "id", (nid = expando) );
  4377. }
  4378. // Prefix every selector in the list
  4379. groups = tokenize( selector );
  4380. i = groups.length;
  4381. while ( i-- ) {
  4382. groups[i] = "#" + nid + " " + toSelector( groups[i] );
  4383. }
  4384. newSelector = groups.join( "," );
  4385. // Expand context for sibling selectors
  4386. newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
  4387. context;
  4388. }
  4389. if ( newSelector ) {
  4390. try {
  4391. push.apply( results,
  4392. newContext.querySelectorAll( newSelector )
  4393. );
  4394. return results;
  4395. } catch ( qsaError ) {
  4396. } finally {
  4397. if ( nid === expando ) {
  4398. context.removeAttribute( "id" );
  4399. }
  4400. }
  4401. }
  4402. }
  4403. }
  4404. }
  4405. // All others
  4406. return select( selector.replace( rtrim, "$1" ), context, results, seed );
  4407. }
  4408. /**
  4409. * Create key-value caches of limited size
  4410. * @returns {function(string, object)} Returns the Object data after storing it on itself with
  4411. * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
  4412. * deleting the oldest entry
  4413. */
  4414. function createCache() {
  4415. var keys = [];
  4416. function cache( key, value ) {
  4417. // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
  4418. if ( keys.push( key + " " ) > Expr.cacheLength ) {
  4419. // Only keep the most recent entries
  4420. delete cache[ keys.shift() ];
  4421. }
  4422. return (cache[ key + " " ] = value);
  4423. }
  4424. return cache;
  4425. }
  4426. /**
  4427. * Mark a function for special use by Sizzle
  4428. * @param {Function} fn The function to mark
  4429. */
  4430. function markFunction( fn ) {
  4431. fn[ expando ] = true;
  4432. return fn;
  4433. }
  4434. /**
  4435. * Support testing using an element
  4436. * @param {Function} fn Passed the created element and returns a boolean result
  4437. */
  4438. function assert( fn ) {
  4439. var el = document.createElement("fieldset");
  4440. try {
  4441. return !!fn( el );
  4442. } catch (e) {
  4443. return false;
  4444. } finally {
  4445. // Remove from its parent by default
  4446. if ( el.parentNode ) {
  4447. el.parentNode.removeChild( el );
  4448. }
  4449. // release memory in IE
  4450. el = null;
  4451. }
  4452. }
  4453. /**
  4454. * Adds the same handler for all of the specified attrs
  4455. * @param {String} attrs Pipe-separated list of attributes
  4456. * @param {Function} handler The method that will be applied
  4457. */
  4458. function addHandle( attrs, handler ) {
  4459. var arr = attrs.split("|"),
  4460. i = arr.length;
  4461. while ( i-- ) {
  4462. Expr.attrHandle[ arr[i] ] = handler;
  4463. }
  4464. }
  4465. /**
  4466. * Checks document order of two siblings
  4467. * @param {Element} a
  4468. * @param {Element} b
  4469. * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
  4470. */
  4471. function siblingCheck( a, b ) {
  4472. var cur = b && a,
  4473. diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
  4474. a.sourceIndex - b.sourceIndex;
  4475. // Use IE sourceIndex if available on both nodes
  4476. if ( diff ) {
  4477. return diff;
  4478. }
  4479. // Check if b follows a
  4480. if ( cur ) {
  4481. while ( (cur = cur.nextSibling) ) {
  4482. if ( cur === b ) {
  4483. return -1;
  4484. }
  4485. }
  4486. }
  4487. return a ? 1 : -1;
  4488. }
  4489. /**
  4490. * Returns a function to use in pseudos for input types
  4491. * @param {String} type
  4492. */
  4493. function createInputPseudo( type ) {
  4494. return function( elem ) {
  4495. var name = elem.nodeName.toLowerCase();
  4496. return name === "input" && elem.type === type;
  4497. };
  4498. }
  4499. /**
  4500. * Returns a function to use in pseudos for buttons
  4501. * @param {String} type
  4502. */
  4503. function createButtonPseudo( type ) {
  4504. return function( elem ) {
  4505. var name = elem.nodeName.toLowerCase();
  4506. return (name === "input" || name === "button") && elem.type === type;
  4507. };
  4508. }
  4509. /**
  4510. * Returns a function to use in pseudos for :enabled/:disabled
  4511. * @param {Boolean} disabled true for :disabled; false for :enabled
  4512. */
  4513. function createDisabledPseudo( disabled ) {
  4514. // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
  4515. return function( elem ) {
  4516. // Only certain elements can match :enabled or :disabled
  4517. // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
  4518. // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
  4519. if ( "form" in elem ) {
  4520. // Check for inherited disabledness on relevant non-disabled elements:
  4521. // * listed form-associated elements in a disabled fieldset
  4522. // https://html.spec.whatwg.org/multipage/forms.html#category-listed
  4523. // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
  4524. // * option elements in a disabled optgroup
  4525. // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
  4526. // All such elements have a "form" property.
  4527. if ( elem.parentNode && elem.disabled === false ) {
  4528. // Option elements defer to a parent optgroup if present
  4529. if ( "label" in elem ) {
  4530. if ( "label" in elem.parentNode ) {
  4531. return elem.parentNode.disabled === disabled;
  4532. } else {
  4533. return elem.disabled === disabled;
  4534. }
  4535. }
  4536. // Support: IE 6 - 11
  4537. // Use the isDisabled shortcut property to check for disabled fieldset ancestors
  4538. return elem.isDisabled === disabled ||
  4539. // Where there is no isDisabled, check manually
  4540. /* jshint -W018 */
  4541. elem.isDisabled !== !disabled &&
  4542. disabledAncestor( elem ) === disabled;
  4543. }
  4544. return elem.disabled === disabled;
  4545. // Try to winnow out elements that can't be disabled before trusting the disabled property.
  4546. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
  4547. // even exist on them, let alone have a boolean value.
  4548. } else if ( "label" in elem ) {
  4549. return elem.disabled === disabled;
  4550. }
  4551. // Remaining elements are neither :enabled nor :disabled
  4552. return false;
  4553. };
  4554. }
  4555. /**
  4556. * Returns a function to use in pseudos for positionals
  4557. * @param {Function} fn
  4558. */
  4559. function createPositionalPseudo( fn ) {
  4560. return markFunction(function( argument ) {
  4561. argument = +argument;
  4562. return markFunction(function( seed, matches ) {
  4563. var j,
  4564. matchIndexes = fn( [], seed.length, argument ),
  4565. i = matchIndexes.length;
  4566. // Match elements found at the specified indexes
  4567. while ( i-- ) {
  4568. if ( seed[ (j = matchIndexes[i]) ] ) {
  4569. seed[j] = !(matches[j] = seed[j]);
  4570. }
  4571. }
  4572. });
  4573. });
  4574. }
  4575. /**
  4576. * Checks a node for validity as a Sizzle context
  4577. * @param {Element|Object=} context
  4578. * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
  4579. */
  4580. function testContext( context ) {
  4581. return context && typeof context.getElementsByTagName !== "undefined" && context;
  4582. }
  4583. // Expose support vars for convenience
  4584. support = Sizzle.support = {};
  4585. /**
  4586. * Detects XML nodes
  4587. * @param {Element|Object} elem An element or a document
  4588. * @returns {Boolean} True iff elem is a non-HTML XML node
  4589. */
  4590. isXML = Sizzle.isXML = function( elem ) {
  4591. // documentElement is verified for cases where it doesn't yet exist
  4592. // (such as loading iframes in IE - #4833)
  4593. var documentElement = elem && (elem.ownerDocument || elem).documentElement;
  4594. return documentElement ? documentElement.nodeName !== "HTML" : false;
  4595. };
  4596. /**
  4597. * Sets document-related variables once based on the current document
  4598. * @param {Element|Object} [doc] An element or document object to use to set the document
  4599. * @returns {Object} Returns the current document
  4600. */
  4601. setDocument = Sizzle.setDocument = function( node ) {
  4602. var hasCompare, subWindow,
  4603. doc = node ? node.ownerDocument || node : preferredDoc;
  4604. // Return early if doc is invalid or already selected
  4605. if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
  4606. return document;
  4607. }
  4608. // Update global variables
  4609. document = doc;
  4610. docElem = document.documentElement;
  4611. documentIsHTML = !isXML( document );
  4612. // Support: IE 9-11, Edge
  4613. // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
  4614. if ( preferredDoc !== document &&
  4615. (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
  4616. // Support: IE 11, Edge
  4617. if ( subWindow.addEventListener ) {
  4618. subWindow.addEventListener( "unload", unloadHandler, false );
  4619. // Support: IE 9 - 10 only
  4620. } else if ( subWindow.attachEvent ) {
  4621. subWindow.attachEvent( "onunload", unloadHandler );
  4622. }
  4623. }
  4624. /* Attributes
  4625. ---------------------------------------------------------------------- */
  4626. // Support: IE<8
  4627. // Verify that getAttribute really returns attributes and not properties
  4628. // (excepting IE8 booleans)
  4629. support.attributes = assert(function( el ) {
  4630. el.className = "i";
  4631. return !el.getAttribute("className");
  4632. });
  4633. /* getElement(s)By*
  4634. ---------------------------------------------------------------------- */
  4635. // Check if getElementsByTagName("*") returns only elements
  4636. support.getElementsByTagName = assert(function( el ) {
  4637. el.appendChild( document.createComment("") );
  4638. return !el.getElementsByTagName("*").length;
  4639. });
  4640. // Support: IE<9
  4641. support.getElementsByClassName = rnative.test( document.getElementsByClassName );
  4642. // Support: IE<10
  4643. // Check if getElementById returns elements by name
  4644. // The broken getElementById methods don't pick up programmatically-set names,
  4645. // so use a roundabout getElementsByName test
  4646. support.getById = assert(function( el ) {
  4647. docElem.appendChild( el ).id = expando;
  4648. return !document.getElementsByName || !document.getElementsByName( expando ).length;
  4649. });
  4650. // ID filter and find
  4651. if ( support.getById ) {
  4652. Expr.filter["ID"] = function( id ) {
  4653. var attrId = id.replace( runescape, funescape );
  4654. return function( elem ) {
  4655. return elem.getAttribute("id") === attrId;
  4656. };
  4657. };
  4658. Expr.find["ID"] = function( id, context ) {
  4659. if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  4660. var elem = context.getElementById( id );
  4661. return elem ? [ elem ] : [];
  4662. }
  4663. };
  4664. } else {
  4665. Expr.filter["ID"] = function( id ) {
  4666. var attrId = id.replace( runescape, funescape );
  4667. return function( elem ) {
  4668. var node = typeof elem.getAttributeNode !== "undefined" &&
  4669. elem.getAttributeNode("id");
  4670. return node && node.value === attrId;
  4671. };
  4672. };
  4673. // Support: IE 6 - 7 only
  4674. // getElementById is not reliable as a find shortcut
  4675. Expr.find["ID"] = function( id, context ) {
  4676. if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  4677. var node, i, elems,
  4678. elem = context.getElementById( id );
  4679. if ( elem ) {
  4680. // Verify the id attribute
  4681. node = elem.getAttributeNode("id");
  4682. if ( node && node.value === id ) {
  4683. return [ elem ];
  4684. }
  4685. // Fall back on getElementsByName
  4686. elems = context.getElementsByName( id );
  4687. i = 0;
  4688. while ( (elem = elems[i++]) ) {
  4689. node = elem.getAttributeNode("id");
  4690. if ( node && node.value === id ) {
  4691. return [ elem ];
  4692. }
  4693. }
  4694. }
  4695. return [];
  4696. }
  4697. };
  4698. }
  4699. // Tag
  4700. Expr.find["TAG"] = support.getElementsByTagName ?
  4701. function( tag, context ) {
  4702. if ( typeof context.getElementsByTagName !== "undefined" ) {
  4703. return context.getElementsByTagName( tag );
  4704. // DocumentFragment nodes don't have gEBTN
  4705. } else if ( support.qsa ) {
  4706. return context.querySelectorAll( tag );
  4707. }
  4708. } :
  4709. function( tag, context ) {
  4710. var elem,
  4711. tmp = [],
  4712. i = 0,
  4713. // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
  4714. results = context.getElementsByTagName( tag );
  4715. // Filter out possible comments
  4716. if ( tag === "*" ) {
  4717. while ( (elem = results[i++]) ) {
  4718. if ( elem.nodeType === 1 ) {
  4719. tmp.push( elem );
  4720. }
  4721. }
  4722. return tmp;
  4723. }
  4724. return results;
  4725. };
  4726. // Class
  4727. Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
  4728. if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
  4729. return context.getElementsByClassName( className );
  4730. }
  4731. };
  4732. /* QSA/matchesSelector
  4733. ---------------------------------------------------------------------- */
  4734. // QSA and matchesSelector support
  4735. // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
  4736. rbuggyMatches = [];
  4737. // qSa(:focus) reports false when true (Chrome 21)
  4738. // We allow this because of a bug in IE8/9 that throws an error
  4739. // whenever `document.activeElement` is accessed on an iframe
  4740. // So, we allow :focus to pass through QSA all the time to avoid the IE error
  4741. // See https://bugs.jquery.com/ticket/13378
  4742. rbuggyQSA = [];
  4743. if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
  4744. // Build QSA regex
  4745. // Regex strategy adopted from Diego Perini
  4746. assert(function( el ) {
  4747. // Select is set to empty string on purpose
  4748. // This is to test IE's treatment of not explicitly
  4749. // setting a boolean content attribute,
  4750. // since its presence should be enough
  4751. // https://bugs.jquery.com/ticket/12359
  4752. docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
  4753. "<select id='" + expando + "-\r\\' msallowcapture=''>" +
  4754. "<option selected=''></option></select>";
  4755. // Support: IE8, Opera 11-12.16
  4756. // Nothing should be selected when empty strings follow ^= or $= or *=
  4757. // The test attribute must be unknown in Opera but "safe" for WinRT
  4758. // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
  4759. if ( el.querySelectorAll("[msallowcapture^='']").length ) {
  4760. rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
  4761. }
  4762. // Support: IE8
  4763. // Boolean attributes and "value" are not treated correctly
  4764. if ( !el.querySelectorAll("[selected]").length ) {
  4765. rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
  4766. }
  4767. // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
  4768. if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
  4769. rbuggyQSA.push("~=");
  4770. }
  4771. // Webkit/Opera - :checked should return selected option elements
  4772. // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  4773. // IE8 throws error here and will not see later tests
  4774. if ( !el.querySelectorAll(":checked").length ) {
  4775. rbuggyQSA.push(":checked");
  4776. }
  4777. // Support: Safari 8+, iOS 8+
  4778. // https://bugs.webkit.org/show_bug.cgi?id=136851
  4779. // In-page `selector#id sibling-combinator selector` fails
  4780. if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
  4781. rbuggyQSA.push(".#.+[+~]");
  4782. }
  4783. });
  4784. assert(function( el ) {
  4785. el.innerHTML = "<a href='' disabled='disabled'></a>" +
  4786. "<select disabled='disabled'><option/></select>";
  4787. // Support: Windows 8 Native Apps
  4788. // The type and name attributes are restricted during .innerHTML assignment
  4789. var input = document.createElement("input");
  4790. input.setAttribute( "type", "hidden" );
  4791. el.appendChild( input ).setAttribute( "name", "D" );
  4792. // Support: IE8
  4793. // Enforce case-sensitivity of name attribute
  4794. if ( el.querySelectorAll("[name=d]").length ) {
  4795. rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
  4796. }
  4797. // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  4798. // IE8 throws error here and will not see later tests
  4799. if ( el.querySelectorAll(":enabled").length !== 2 ) {
  4800. rbuggyQSA.push( ":enabled", ":disabled" );
  4801. }
  4802. // Support: IE9-11+
  4803. // IE's :disabled selector does not pick up the children of disabled fieldsets
  4804. docElem.appendChild( el ).disabled = true;
  4805. if ( el.querySelectorAll(":disabled").length !== 2 ) {
  4806. rbuggyQSA.push( ":enabled", ":disabled" );
  4807. }
  4808. // Opera 10-11 does not throw on post-comma invalid pseudos
  4809. el.querySelectorAll("*,:x");
  4810. rbuggyQSA.push(",.*:");
  4811. });
  4812. }
  4813. if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
  4814. docElem.webkitMatchesSelector ||
  4815. docElem.mozMatchesSelector ||
  4816. docElem.oMatchesSelector ||
  4817. docElem.msMatchesSelector) )) ) {
  4818. assert(function( el ) {
  4819. // Check to see if it's possible to do matchesSelector
  4820. // on a disconnected node (IE 9)
  4821. support.disconnectedMatch = matches.call( el, "*" );
  4822. // This should fail with an exception
  4823. // Gecko does not error, returns false instead
  4824. matches.call( el, "[s!='']:x" );
  4825. rbuggyMatches.push( "!=", pseudos );
  4826. });
  4827. }
  4828. rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
  4829. rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
  4830. /* Contains
  4831. ---------------------------------------------------------------------- */
  4832. hasCompare = rnative.test( docElem.compareDocumentPosition );
  4833. // Element contains another
  4834. // Purposefully self-exclusive
  4835. // As in, an element does not contain itself
  4836. contains = hasCompare || rnative.test( docElem.contains ) ?
  4837. function( a, b ) {
  4838. var adown = a.nodeType === 9 ? a.documentElement : a,
  4839. bup = b && b.parentNode;
  4840. return a === bup || !!( bup && bup.nodeType === 1 && (
  4841. adown.contains ?
  4842. adown.contains( bup ) :
  4843. a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
  4844. ));
  4845. } :
  4846. function( a, b ) {
  4847. if ( b ) {
  4848. while ( (b = b.parentNode) ) {
  4849. if ( b === a ) {
  4850. return true;
  4851. }
  4852. }
  4853. }
  4854. return false;
  4855. };
  4856. /* Sorting
  4857. ---------------------------------------------------------------------- */
  4858. // Document order sorting
  4859. sortOrder = hasCompare ?
  4860. function( a, b ) {
  4861. // Flag for duplicate removal
  4862. if ( a === b ) {
  4863. hasDuplicate = true;
  4864. return 0;
  4865. }
  4866. // Sort on method existence if only one input has compareDocumentPosition
  4867. var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
  4868. if ( compare ) {
  4869. return compare;
  4870. }
  4871. // Calculate position if both inputs belong to the same document
  4872. compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
  4873. a.compareDocumentPosition( b ) :
  4874. // Otherwise we know they are disconnected
  4875. 1;
  4876. // Disconnected nodes
  4877. if ( compare & 1 ||
  4878. (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
  4879. // Choose the first element that is related to our preferred document
  4880. if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
  4881. return -1;
  4882. }
  4883. if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
  4884. return 1;
  4885. }
  4886. // Maintain original order
  4887. return sortInput ?
  4888. ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
  4889. 0;
  4890. }
  4891. return compare & 4 ? -1 : 1;
  4892. } :
  4893. function( a, b ) {
  4894. // Exit early if the nodes are identical
  4895. if ( a === b ) {
  4896. hasDuplicate = true;
  4897. return 0;
  4898. }
  4899. var cur,
  4900. i = 0,
  4901. aup = a.parentNode,
  4902. bup = b.parentNode,
  4903. ap = [ a ],
  4904. bp = [ b ];
  4905. // Parentless nodes are either documents or disconnected
  4906. if ( !aup || !bup ) {
  4907. return a === document ? -1 :
  4908. b === document ? 1 :
  4909. aup ? -1 :
  4910. bup ? 1 :
  4911. sortInput ?
  4912. ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
  4913. 0;
  4914. // If the nodes are siblings, we can do a quick check
  4915. } else if ( aup === bup ) {
  4916. return siblingCheck( a, b );
  4917. }
  4918. // Otherwise we need full lists of their ancestors for comparison
  4919. cur = a;
  4920. while ( (cur = cur.parentNode) ) {
  4921. ap.unshift( cur );
  4922. }
  4923. cur = b;
  4924. while ( (cur = cur.parentNode) ) {
  4925. bp.unshift( cur );
  4926. }
  4927. // Walk down the tree looking for a discrepancy
  4928. while ( ap[i] === bp[i] ) {
  4929. i++;
  4930. }
  4931. return i ?
  4932. // Do a sibling check if the nodes have a common ancestor
  4933. siblingCheck( ap[i], bp[i] ) :
  4934. // Otherwise nodes in our document sort first
  4935. ap[i] === preferredDoc ? -1 :
  4936. bp[i] === preferredDoc ? 1 :
  4937. 0;
  4938. };
  4939. return document;
  4940. };
  4941. Sizzle.matches = function( expr, elements ) {
  4942. return Sizzle( expr, null, null, elements );
  4943. };
  4944. Sizzle.matchesSelector = function( elem, expr ) {
  4945. // Set document vars if needed
  4946. if ( ( elem.ownerDocument || elem ) !== document ) {
  4947. setDocument( elem );
  4948. }
  4949. // Make sure that attribute selectors are quoted
  4950. expr = expr.replace( rattributeQuotes, "='$1']" );
  4951. if ( support.matchesSelector && documentIsHTML &&
  4952. !compilerCache[ expr + " " ] &&
  4953. ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
  4954. ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
  4955. try {
  4956. var ret = matches.call( elem, expr );
  4957. // IE 9's matchesSelector returns false on disconnected nodes
  4958. if ( ret || support.disconnectedMatch ||
  4959. // As well, disconnected nodes are said to be in a document
  4960. // fragment in IE 9
  4961. elem.document && elem.document.nodeType !== 11 ) {
  4962. return ret;
  4963. }
  4964. } catch (e) {}
  4965. }
  4966. return Sizzle( expr, document, null, [ elem ] ).length > 0;
  4967. };
  4968. Sizzle.contains = function( context, elem ) {
  4969. // Set document vars if needed
  4970. if ( ( context.ownerDocument || context ) !== document ) {
  4971. setDocument( context );
  4972. }
  4973. return contains( context, elem );
  4974. };
  4975. Sizzle.attr = function( elem, name ) {
  4976. // Set document vars if needed
  4977. if ( ( elem.ownerDocument || elem ) !== document ) {
  4978. setDocument( elem );
  4979. }
  4980. var fn = Expr.attrHandle[ name.toLowerCase() ],
  4981. // Don't get fooled by Object.prototype properties (jQuery #13807)
  4982. val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
  4983. fn( elem, name, !documentIsHTML ) :
  4984. undefined;
  4985. return val !== undefined ?
  4986. val :
  4987. support.attributes || !documentIsHTML ?
  4988. elem.getAttribute( name ) :
  4989. (val = elem.getAttributeNode(name)) && val.specified ?
  4990. val.value :
  4991. null;
  4992. };
  4993. Sizzle.escape = function( sel ) {
  4994. return (sel + "").replace( rcssescape, fcssescape );
  4995. };
  4996. Sizzle.error = function( msg ) {
  4997. throw new Error( "Syntax error, unrecognized expression: " + msg );
  4998. };
  4999. /**
  5000. * Document sorting and removing duplicates
  5001. * @param {ArrayLike} results
  5002. */
  5003. Sizzle.uniqueSort = function( results ) {
  5004. var elem,
  5005. duplicates = [],
  5006. j = 0,
  5007. i = 0;
  5008. // Unless we *know* we can detect duplicates, assume their presence
  5009. hasDuplicate = !support.detectDuplicates;
  5010. sortInput = !support.sortStable && results.slice( 0 );
  5011. results.sort( sortOrder );
  5012. if ( hasDuplicate ) {
  5013. while ( (elem = results[i++]) ) {
  5014. if ( elem === results[ i ] ) {
  5015. j = duplicates.push( i );
  5016. }
  5017. }
  5018. while ( j-- ) {
  5019. results.splice( duplicates[ j ], 1 );
  5020. }
  5021. }
  5022. // Clear input after sorting to release objects
  5023. // See https://github.com/jquery/sizzle/pull/225
  5024. sortInput = null;
  5025. return results;
  5026. };
  5027. /**
  5028. * Utility function for retrieving the text value of an array of DOM nodes
  5029. * @param {Array|Element} elem
  5030. */
  5031. getText = Sizzle.getText = function( elem ) {
  5032. var node,
  5033. ret = "",
  5034. i = 0,
  5035. nodeType = elem.nodeType;
  5036. if ( !nodeType ) {
  5037. // If no nodeType, this is expected to be an array
  5038. while ( (node = elem[i++]) ) {
  5039. // Do not traverse comment nodes
  5040. ret += getText( node );
  5041. }
  5042. } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  5043. // Use textContent for elements
  5044. // innerText usage removed for consistency of new lines (jQuery #11153)
  5045. if ( typeof elem.textContent === "string" ) {
  5046. return elem.textContent;
  5047. } else {
  5048. // Traverse its children
  5049. for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  5050. ret += getText( elem );
  5051. }
  5052. }
  5053. } else if ( nodeType === 3 || nodeType === 4 ) {
  5054. return elem.nodeValue;
  5055. }
  5056. // Do not include comment or processing instruction nodes
  5057. return ret;
  5058. };
  5059. Expr = Sizzle.selectors = {
  5060. // Can be adjusted by the user
  5061. cacheLength: 50,
  5062. createPseudo: markFunction,
  5063. match: matchExpr,
  5064. attrHandle: {},
  5065. find: {},
  5066. relative: {
  5067. ">": { dir: "parentNode", first: true },
  5068. " ": { dir: "parentNode" },
  5069. "+": { dir: "previousSibling", first: true },
  5070. "~": { dir: "previousSibling" }
  5071. },
  5072. preFilter: {
  5073. "ATTR": function( match ) {
  5074. match[1] = match[1].replace( runescape, funescape );
  5075. // Move the given value to match[3] whether quoted or unquoted
  5076. match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
  5077. if ( match[2] === "~=" ) {
  5078. match[3] = " " + match[3] + " ";
  5079. }
  5080. return match.slice( 0, 4 );
  5081. },
  5082. "CHILD": function( match ) {
  5083. /* matches from matchExpr["CHILD"]
  5084. 1 type (only|nth|...)
  5085. 2 what (child|of-type)
  5086. 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
  5087. 4 xn-component of xn+y argument ([+-]?\d*n|)
  5088. 5 sign of xn-component
  5089. 6 x of xn-component
  5090. 7 sign of y-component
  5091. 8 y of y-component
  5092. */
  5093. match[1] = match[1].toLowerCase();
  5094. if ( match[1].slice( 0, 3 ) === "nth" ) {
  5095. // nth-* requires argument
  5096. if ( !match[3] ) {
  5097. Sizzle.error( match[0] );
  5098. }
  5099. // numeric x and y parameters for Expr.filter.CHILD
  5100. // remember that false/true cast respectively to 0/1
  5101. match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
  5102. match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
  5103. // other types prohibit arguments
  5104. } else if ( match[3] ) {
  5105. Sizzle.error( match[0] );
  5106. }
  5107. return match;
  5108. },
  5109. "PSEUDO": function( match ) {
  5110. var excess,
  5111. unquoted = !match[6] && match[2];
  5112. if ( matchExpr["CHILD"].test( match[0] ) ) {
  5113. return null;
  5114. }
  5115. // Accept quoted arguments as-is
  5116. if ( match[3] ) {
  5117. match[2] = match[4] || match[5] || "";
  5118. // Strip excess characters from unquoted arguments
  5119. } else if ( unquoted && rpseudo.test( unquoted ) &&
  5120. // Get excess from tokenize (recursively)
  5121. (excess = tokenize( unquoted, true )) &&
  5122. // advance to the next closing parenthesis
  5123. (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
  5124. // excess is a negative index
  5125. match[0] = match[0].slice( 0, excess );
  5126. match[2] = unquoted.slice( 0, excess );
  5127. }
  5128. // Return only captures needed by the pseudo filter method (type and argument)
  5129. return match.slice( 0, 3 );
  5130. }
  5131. },
  5132. filter: {
  5133. "TAG": function( nodeNameSelector ) {
  5134. var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
  5135. return nodeNameSelector === "*" ?
  5136. function() { return true; } :
  5137. function( elem ) {
  5138. return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
  5139. };
  5140. },
  5141. "CLASS": function( className ) {
  5142. var pattern = classCache[ className + " " ];
  5143. return pattern ||
  5144. (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
  5145. classCache( className, function( elem ) {
  5146. return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
  5147. });
  5148. },
  5149. "ATTR": function( name, operator, check ) {
  5150. return function( elem ) {
  5151. var result = Sizzle.attr( elem, name );
  5152. if ( result == null ) {
  5153. return operator === "!=";
  5154. }
  5155. if ( !operator ) {
  5156. return true;
  5157. }
  5158. result += "";
  5159. return operator === "=" ? result === check :
  5160. operator === "!=" ? result !== check :
  5161. operator === "^=" ? check && result.indexOf( check ) === 0 :
  5162. operator === "*=" ? check && result.indexOf( check ) > -1 :
  5163. operator === "$=" ? check && result.slice( -check.length ) === check :
  5164. operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
  5165. operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
  5166. false;
  5167. };
  5168. },
  5169. "CHILD": function( type, what, argument, first, last ) {
  5170. var simple = type.slice( 0, 3 ) !== "nth",
  5171. forward = type.slice( -4 ) !== "last",
  5172. ofType = what === "of-type";
  5173. return first === 1 && last === 0 ?
  5174. // Shortcut for :nth-*(n)
  5175. function( elem ) {
  5176. return !!elem.parentNode;
  5177. } :
  5178. function( elem, context, xml ) {
  5179. var cache, uniqueCache, outerCache, node, nodeIndex, start,
  5180. dir = simple !== forward ? "nextSibling" : "previousSibling",
  5181. parent = elem.parentNode,
  5182. name = ofType && elem.nodeName.toLowerCase(),
  5183. useCache = !xml && !ofType,
  5184. diff = false;
  5185. if ( parent ) {
  5186. // :(first|last|only)-(child|of-type)
  5187. if ( simple ) {
  5188. while ( dir ) {
  5189. node = elem;
  5190. while ( (node = node[ dir ]) ) {
  5191. if ( ofType ?
  5192. node.nodeName.toLowerCase() === name :
  5193. node.nodeType === 1 ) {
  5194. return false;
  5195. }
  5196. }
  5197. // Reverse direction for :only-* (if we haven't yet done so)
  5198. start = dir = type === "only" && !start && "nextSibling";
  5199. }
  5200. return true;
  5201. }
  5202. start = [ forward ? parent.firstChild : parent.lastChild ];
  5203. // non-xml :nth-child(...) stores cache data on `parent`
  5204. if ( forward && useCache ) {
  5205. // Seek `elem` from a previously-cached index
  5206. // ...in a gzip-friendly way
  5207. node = parent;
  5208. outerCache = node[ expando ] || (node[ expando ] = {});
  5209. // Support: IE <9 only
  5210. // Defend against cloned attroperties (jQuery gh-1709)
  5211. uniqueCache = outerCache[ node.uniqueID ] ||
  5212. (outerCache[ node.uniqueID ] = {});
  5213. cache = uniqueCache[ type ] || [];
  5214. nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
  5215. diff = nodeIndex && cache[ 2 ];
  5216. node = nodeIndex && parent.childNodes[ nodeIndex ];
  5217. while ( (node = ++nodeIndex && node && node[ dir ] ||
  5218. // Fallback to seeking `elem` from the start
  5219. (diff = nodeIndex = 0) || start.pop()) ) {
  5220. // When found, cache indexes on `parent` and break
  5221. if ( node.nodeType === 1 && ++diff && node === elem ) {
  5222. uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
  5223. break;
  5224. }
  5225. }
  5226. } else {
  5227. // Use previously-cached element index if available
  5228. if ( useCache ) {
  5229. // ...in a gzip-friendly way
  5230. node = elem;
  5231. outerCache = node[ expando ] || (node[ expando ] = {});
  5232. // Support: IE <9 only
  5233. // Defend against cloned attroperties (jQuery gh-1709)
  5234. uniqueCache = outerCache[ node.uniqueID ] ||
  5235. (outerCache[ node.uniqueID ] = {});
  5236. cache = uniqueCache[ type ] || [];
  5237. nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
  5238. diff = nodeIndex;
  5239. }
  5240. // xml :nth-child(...)
  5241. // or :nth-last-child(...) or :nth(-last)?-of-type(...)
  5242. if ( diff === false ) {
  5243. // Use the same loop as above to seek `elem` from the start
  5244. while ( (node = ++nodeIndex && node && node[ dir ] ||
  5245. (diff = nodeIndex = 0) || start.pop()) ) {
  5246. if ( ( ofType ?
  5247. node.nodeName.toLowerCase() === name :
  5248. node.nodeType === 1 ) &&
  5249. ++diff ) {
  5250. // Cache the index of each encountered element
  5251. if ( useCache ) {
  5252. outerCache = node[ expando ] || (node[ expando ] = {});
  5253. // Support: IE <9 only
  5254. // Defend against cloned attroperties (jQuery gh-1709)
  5255. uniqueCache = outerCache[ node.uniqueID ] ||
  5256. (outerCache[ node.uniqueID ] = {});
  5257. uniqueCache[ type ] = [ dirruns, diff ];
  5258. }
  5259. if ( node === elem ) {
  5260. break;
  5261. }
  5262. }
  5263. }
  5264. }
  5265. }
  5266. // Incorporate the offset, then check against cycle size
  5267. diff -= last;
  5268. return diff === first || ( diff % first === 0 && diff / first >= 0 );
  5269. }
  5270. };
  5271. },
  5272. "PSEUDO": function( pseudo, argument ) {
  5273. // pseudo-class names are case-insensitive
  5274. // http://www.w3.org/TR/selectors/#pseudo-classes
  5275. // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
  5276. // Remember that setFilters inherits from pseudos
  5277. var args,
  5278. fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
  5279. Sizzle.error( "unsupported pseudo: " + pseudo );
  5280. // The user may use createPseudo to indicate that
  5281. // arguments are needed to create the filter function
  5282. // just as Sizzle does
  5283. if ( fn[ expando ] ) {
  5284. return fn( argument );
  5285. }
  5286. // But maintain support for old signatures
  5287. if ( fn.length > 1 ) {
  5288. args = [ pseudo, pseudo, "", argument ];
  5289. return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
  5290. markFunction(function( seed, matches ) {
  5291. var idx,
  5292. matched = fn( seed, argument ),
  5293. i = matched.length;
  5294. while ( i-- ) {
  5295. idx = indexOf( seed, matched[i] );
  5296. seed[ idx ] = !( matches[ idx ] = matched[i] );
  5297. }
  5298. }) :
  5299. function( elem ) {
  5300. return fn( elem, 0, args );
  5301. };
  5302. }
  5303. return fn;
  5304. }
  5305. },
  5306. pseudos: {
  5307. // Potentially complex pseudos
  5308. "not": markFunction(function( selector ) {
  5309. // Trim the selector passed to compile
  5310. // to avoid treating leading and trailing
  5311. // spaces as combinators
  5312. var input = [],
  5313. results = [],
  5314. matcher = compile( selector.replace( rtrim, "$1" ) );
  5315. return matcher[ expando ] ?
  5316. markFunction(function( seed, matches, context, xml ) {
  5317. var elem,
  5318. unmatched = matcher( seed, null, xml, [] ),
  5319. i = seed.length;
  5320. // Match elements unmatched by `matcher`
  5321. while ( i-- ) {
  5322. if ( (elem = unmatched[i]) ) {
  5323. seed[i] = !(matches[i] = elem);
  5324. }
  5325. }
  5326. }) :
  5327. function( elem, context, xml ) {
  5328. input[0] = elem;
  5329. matcher( input, null, xml, results );
  5330. // Don't keep the element (issue #299)
  5331. input[0] = null;
  5332. return !results.pop();
  5333. };
  5334. }),
  5335. "has": markFunction(function( selector ) {
  5336. return function( elem ) {
  5337. return Sizzle( selector, elem ).length > 0;
  5338. };
  5339. }),
  5340. "contains": markFunction(function( text ) {
  5341. text = text.replace( runescape, funescape );
  5342. return function( elem ) {
  5343. return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
  5344. };
  5345. }),
  5346. // "Whether an element is represented by a :lang() selector
  5347. // is based solely on the element's language value
  5348. // being equal to the identifier C,
  5349. // or beginning with the identifier C immediately followed by "-".
  5350. // The matching of C against the element's language value is performed case-insensitively.
  5351. // The identifier C does not have to be a valid language name."
  5352. // http://www.w3.org/TR/selectors/#lang-pseudo
  5353. "lang": markFunction( function( lang ) {
  5354. // lang value must be a valid identifier
  5355. if ( !ridentifier.test(lang || "") ) {
  5356. Sizzle.error( "unsupported lang: " + lang );
  5357. }
  5358. lang = lang.replace( runescape, funescape ).toLowerCase();
  5359. return function( elem ) {
  5360. var elemLang;
  5361. do {
  5362. if ( (elemLang = documentIsHTML ?
  5363. elem.lang :
  5364. elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
  5365. elemLang = elemLang.toLowerCase();
  5366. return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
  5367. }
  5368. } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
  5369. return false;
  5370. };
  5371. }),
  5372. // Miscellaneous
  5373. "target": function( elem ) {
  5374. var hash = window.location && window.location.hash;
  5375. return hash && hash.slice( 1 ) === elem.id;
  5376. },
  5377. "root": function( elem ) {
  5378. return elem === docElem;
  5379. },
  5380. "focus": function( elem ) {
  5381. return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
  5382. },
  5383. // Boolean properties
  5384. "enabled": createDisabledPseudo( false ),
  5385. "disabled": createDisabledPseudo( true ),
  5386. "checked": function( elem ) {
  5387. // In CSS3, :checked should return both checked and selected elements
  5388. // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  5389. var nodeName = elem.nodeName.toLowerCase();
  5390. return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
  5391. },
  5392. "selected": function( elem ) {
  5393. // Accessing this property makes selected-by-default
  5394. // options in Safari work properly
  5395. if ( elem.parentNode ) {
  5396. elem.parentNode.selectedIndex;
  5397. }
  5398. return elem.selected === true;
  5399. },
  5400. // Contents
  5401. "empty": function( elem ) {
  5402. // http://www.w3.org/TR/selectors/#empty-pseudo
  5403. // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
  5404. // but not by others (comment: 8; processing instruction: 7; etc.)
  5405. // nodeType < 6 works because attributes (2) do not appear as children
  5406. for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  5407. if ( elem.nodeType < 6 ) {
  5408. return false;
  5409. }
  5410. }
  5411. return true;
  5412. },
  5413. "parent": function( elem ) {
  5414. return !Expr.pseudos["empty"]( elem );
  5415. },
  5416. // Element/input types
  5417. "header": function( elem ) {
  5418. return rheader.test( elem.nodeName );
  5419. },
  5420. "input": function( elem ) {
  5421. return rinputs.test( elem.nodeName );
  5422. },
  5423. "button": function( elem ) {
  5424. var name = elem.nodeName.toLowerCase();
  5425. return name === "input" && elem.type === "button" || name === "button";
  5426. },
  5427. "text": function( elem ) {
  5428. var attr;
  5429. return elem.nodeName.toLowerCase() === "input" &&
  5430. elem.type === "text" &&
  5431. // Support: IE<8
  5432. // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
  5433. ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
  5434. },
  5435. // Position-in-collection
  5436. "first": createPositionalPseudo(function() {
  5437. return [ 0 ];
  5438. }),
  5439. "last": createPositionalPseudo(function( matchIndexes, length ) {
  5440. return [ length - 1 ];
  5441. }),
  5442. "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
  5443. return [ argument < 0 ? argument + length : argument ];
  5444. }),
  5445. "even": createPositionalPseudo(function( matchIndexes, length ) {
  5446. var i = 0;
  5447. for ( ; i < length; i += 2 ) {
  5448. matchIndexes.push( i );
  5449. }
  5450. return matchIndexes;
  5451. }),
  5452. "odd": createPositionalPseudo(function( matchIndexes, length ) {
  5453. var i = 1;
  5454. for ( ; i < length; i += 2 ) {
  5455. matchIndexes.push( i );
  5456. }
  5457. return matchIndexes;
  5458. }),
  5459. "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  5460. var i = argument < 0 ? argument + length : argument;
  5461. for ( ; --i >= 0; ) {
  5462. matchIndexes.push( i );
  5463. }
  5464. return matchIndexes;
  5465. }),
  5466. "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  5467. var i = argument < 0 ? argument + length : argument;
  5468. for ( ; ++i < length; ) {
  5469. matchIndexes.push( i );
  5470. }
  5471. return matchIndexes;
  5472. })
  5473. }
  5474. };
  5475. Expr.pseudos["nth"] = Expr.pseudos["eq"];
  5476. // Add button/input type pseudos
  5477. for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
  5478. Expr.pseudos[ i ] = createInputPseudo( i );
  5479. }
  5480. for ( i in { submit: true, reset: true } ) {
  5481. Expr.pseudos[ i ] = createButtonPseudo( i );
  5482. }
  5483. // Easy API for creating new setFilters
  5484. function setFilters() {}
  5485. setFilters.prototype = Expr.filters = Expr.pseudos;
  5486. Expr.setFilters = new setFilters();
  5487. tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
  5488. var matched, match, tokens, type,
  5489. soFar, groups, preFilters,
  5490. cached = tokenCache[ selector + " " ];
  5491. if ( cached ) {
  5492. return parseOnly ? 0 : cached.slice( 0 );
  5493. }
  5494. soFar = selector;
  5495. groups = [];
  5496. preFilters = Expr.preFilter;
  5497. while ( soFar ) {
  5498. // Comma and first run
  5499. if ( !matched || (match = rcomma.exec( soFar )) ) {
  5500. if ( match ) {
  5501. // Don't consume trailing commas as valid
  5502. soFar = soFar.slice( match[0].length ) || soFar;
  5503. }
  5504. groups.push( (tokens = []) );
  5505. }
  5506. matched = false;
  5507. // Combinators
  5508. if ( (match = rcombinators.exec( soFar )) ) {
  5509. matched = match.shift();
  5510. tokens.push({
  5511. value: matched,
  5512. // Cast descendant combinators to space
  5513. type: match[0].replace( rtrim, " " )
  5514. });
  5515. soFar = soFar.slice( matched.length );
  5516. }
  5517. // Filters
  5518. for ( type in Expr.filter ) {
  5519. if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
  5520. (match = preFilters[ type ]( match ))) ) {
  5521. matched = match.shift();
  5522. tokens.push({
  5523. value: matched,
  5524. type: type,
  5525. matches: match
  5526. });
  5527. soFar = soFar.slice( matched.length );
  5528. }
  5529. }
  5530. if ( !matched ) {
  5531. break;
  5532. }
  5533. }
  5534. // Return the length of the invalid excess
  5535. // if we're just parsing
  5536. // Otherwise, throw an error or return tokens
  5537. return parseOnly ?
  5538. soFar.length :
  5539. soFar ?
  5540. Sizzle.error( selector ) :
  5541. // Cache the tokens
  5542. tokenCache( selector, groups ).slice( 0 );
  5543. };
  5544. function toSelector( tokens ) {
  5545. var i = 0,
  5546. len = tokens.length,
  5547. selector = "";
  5548. for ( ; i < len; i++ ) {
  5549. selector += tokens[i].value;
  5550. }
  5551. return selector;
  5552. }
  5553. function addCombinator( matcher, combinator, base ) {
  5554. var dir = combinator.dir,
  5555. skip = combinator.next,
  5556. key = skip || dir,
  5557. checkNonElements = base && key === "parentNode",
  5558. doneName = done++;
  5559. return combinator.first ?
  5560. // Check against closest ancestor/preceding element
  5561. function( elem, context, xml ) {
  5562. while ( (elem = elem[ dir ]) ) {
  5563. if ( elem.nodeType === 1 || checkNonElements ) {
  5564. return matcher( elem, context, xml );
  5565. }
  5566. }
  5567. return false;
  5568. } :
  5569. // Check against all ancestor/preceding elements
  5570. function( elem, context, xml ) {
  5571. var oldCache, uniqueCache, outerCache,
  5572. newCache = [ dirruns, doneName ];
  5573. // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
  5574. if ( xml ) {
  5575. while ( (elem = elem[ dir ]) ) {
  5576. if ( elem.nodeType === 1 || checkNonElements ) {
  5577. if ( matcher( elem, context, xml ) ) {
  5578. return true;
  5579. }
  5580. }
  5581. }
  5582. } else {
  5583. while ( (elem = elem[ dir ]) ) {
  5584. if ( elem.nodeType === 1 || checkNonElements ) {
  5585. outerCache = elem[ expando ] || (elem[ expando ] = {});
  5586. // Support: IE <9 only
  5587. // Defend against cloned attroperties (jQuery gh-1709)
  5588. uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
  5589. if ( skip && skip === elem.nodeName.toLowerCase() ) {
  5590. elem = elem[ dir ] || elem;
  5591. } else if ( (oldCache = uniqueCache[ key ]) &&
  5592. oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
  5593. // Assign to newCache so results back-propagate to previous elements
  5594. return (newCache[ 2 ] = oldCache[ 2 ]);
  5595. } else {
  5596. // Reuse newcache so results back-propagate to previous elements
  5597. uniqueCache[ key ] = newCache;
  5598. // A match means we're done; a fail means we have to keep checking
  5599. if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
  5600. return true;
  5601. }
  5602. }
  5603. }
  5604. }
  5605. }
  5606. return false;
  5607. };
  5608. }
  5609. function elementMatcher( matchers ) {
  5610. return matchers.length > 1 ?
  5611. function( elem, context, xml ) {
  5612. var i = matchers.length;
  5613. while ( i-- ) {
  5614. if ( !matchers[i]( elem, context, xml ) ) {
  5615. return false;
  5616. }
  5617. }
  5618. return true;
  5619. } :
  5620. matchers[0];
  5621. }
  5622. function multipleContexts( selector, contexts, results ) {
  5623. var i = 0,
  5624. len = contexts.length;
  5625. for ( ; i < len; i++ ) {
  5626. Sizzle( selector, contexts[i], results );
  5627. }
  5628. return results;
  5629. }
  5630. function condense( unmatched, map, filter, context, xml ) {
  5631. var elem,
  5632. newUnmatched = [],
  5633. i = 0,
  5634. len = unmatched.length,
  5635. mapped = map != null;
  5636. for ( ; i < len; i++ ) {
  5637. if ( (elem = unmatched[i]) ) {
  5638. if ( !filter || filter( elem, context, xml ) ) {
  5639. newUnmatched.push( elem );
  5640. if ( mapped ) {
  5641. map.push( i );
  5642. }
  5643. }
  5644. }
  5645. }
  5646. return newUnmatched;
  5647. }
  5648. function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
  5649. if ( postFilter && !postFilter[ expando ] ) {
  5650. postFilter = setMatcher( postFilter );
  5651. }
  5652. if ( postFinder && !postFinder[ expando ] ) {
  5653. postFinder = setMatcher( postFinder, postSelector );
  5654. }
  5655. return markFunction(function( seed, results, context, xml ) {
  5656. var temp, i, elem,
  5657. preMap = [],
  5658. postMap = [],
  5659. preexisting = results.length,
  5660. // Get initial elements from seed or context
  5661. elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
  5662. // Prefilter to get matcher input, preserving a map for seed-results synchronization
  5663. matcherIn = preFilter && ( seed || !selector ) ?
  5664. condense( elems, preMap, preFilter, context, xml ) :
  5665. elems,
  5666. matcherOut = matcher ?
  5667. // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
  5668. postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
  5669. // ...intermediate processing is necessary
  5670. [] :
  5671. // ...otherwise use results directly
  5672. results :
  5673. matcherIn;
  5674. // Find primary matches
  5675. if ( matcher ) {
  5676. matcher( matcherIn, matcherOut, context, xml );
  5677. }
  5678. // Apply postFilter
  5679. if ( postFilter ) {
  5680. temp = condense( matcherOut, postMap );
  5681. postFilter( temp, [], context, xml );
  5682. // Un-match failing elements by moving them back to matcherIn
  5683. i = temp.length;
  5684. while ( i-- ) {
  5685. if ( (elem = temp[i]) ) {
  5686. matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
  5687. }
  5688. }
  5689. }
  5690. if ( seed ) {
  5691. if ( postFinder || preFilter ) {
  5692. if ( postFinder ) {
  5693. // Get the final matcherOut by condensing this intermediate into postFinder contexts
  5694. temp = [];
  5695. i = matcherOut.length;
  5696. while ( i-- ) {
  5697. if ( (elem = matcherOut[i]) ) {
  5698. // Restore matcherIn since elem is not yet a final match
  5699. temp.push( (matcherIn[i] = elem) );
  5700. }
  5701. }
  5702. postFinder( null, (matcherOut = []), temp, xml );
  5703. }
  5704. // Move matched elements from seed to results to keep them synchronized
  5705. i = matcherOut.length;
  5706. while ( i-- ) {
  5707. if ( (elem = matcherOut[i]) &&
  5708. (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
  5709. seed[temp] = !(results[temp] = elem);
  5710. }
  5711. }
  5712. }
  5713. // Add elements to results, through postFinder if defined
  5714. } else {
  5715. matcherOut = condense(
  5716. matcherOut === results ?
  5717. matcherOut.splice( preexisting, matcherOut.length ) :
  5718. matcherOut
  5719. );
  5720. if ( postFinder ) {
  5721. postFinder( null, results, matcherOut, xml );
  5722. } else {
  5723. push.apply( results, matcherOut );
  5724. }
  5725. }
  5726. });
  5727. }
  5728. function matcherFromTokens( tokens ) {
  5729. var checkContext, matcher, j,
  5730. len = tokens.length,
  5731. leadingRelative = Expr.relative[ tokens[0].type ],
  5732. implicitRelative = leadingRelative || Expr.relative[" "],
  5733. i = leadingRelative ? 1 : 0,
  5734. // The foundational matcher ensures that elements are reachable from top-level context(s)
  5735. matchContext = addCombinator( function( elem ) {
  5736. return elem === checkContext;
  5737. }, implicitRelative, true ),
  5738. matchAnyContext = addCombinator( function( elem ) {
  5739. return indexOf( checkContext, elem ) > -1;
  5740. }, implicitRelative, true ),
  5741. matchers = [ function( elem, context, xml ) {
  5742. var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
  5743. (checkContext = context).nodeType ?
  5744. matchContext( elem, context, xml ) :
  5745. matchAnyContext( elem, context, xml ) );
  5746. // Avoid hanging onto element (issue #299)
  5747. checkContext = null;
  5748. return ret;
  5749. } ];
  5750. for ( ; i < len; i++ ) {
  5751. if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
  5752. matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
  5753. } else {
  5754. matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
  5755. // Return special upon seeing a positional matcher
  5756. if ( matcher[ expando ] ) {
  5757. // Find the next relative operator (if any) for proper handling
  5758. j = ++i;
  5759. for ( ; j < len; j++ ) {
  5760. if ( Expr.relative[ tokens[j].type ] ) {
  5761. break;
  5762. }
  5763. }
  5764. return setMatcher(
  5765. i > 1 && elementMatcher( matchers ),
  5766. i > 1 && toSelector(
  5767. // If the preceding token was a descendant combinator, insert an implicit any-element `*`
  5768. tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
  5769. ).replace( rtrim, "$1" ),
  5770. matcher,
  5771. i < j && matcherFromTokens( tokens.slice( i, j ) ),
  5772. j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
  5773. j < len && toSelector( tokens )
  5774. );
  5775. }
  5776. matchers.push( matcher );
  5777. }
  5778. }
  5779. return elementMatcher( matchers );
  5780. }
  5781. function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  5782. var bySet = setMatchers.length > 0,
  5783. byElement = elementMatchers.length > 0,
  5784. superMatcher = function( seed, context, xml, results, outermost ) {
  5785. var elem, j, matcher,
  5786. matchedCount = 0,
  5787. i = "0",
  5788. unmatched = seed && [],
  5789. setMatched = [],
  5790. contextBackup = outermostContext,
  5791. // We must always have either seed elements or outermost context
  5792. elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
  5793. // Use integer dirruns iff this is the outermost matcher
  5794. dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
  5795. len = elems.length;
  5796. if ( outermost ) {
  5797. outermostContext = context === document || context || outermost;
  5798. }
  5799. // Add elements passing elementMatchers directly to results
  5800. // Support: IE<9, Safari
  5801. // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
  5802. for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
  5803. if ( byElement && elem ) {
  5804. j = 0;
  5805. if ( !context && elem.ownerDocument !== document ) {
  5806. setDocument( elem );
  5807. xml = !documentIsHTML;
  5808. }
  5809. while ( (matcher = elementMatchers[j++]) ) {
  5810. if ( matcher( elem, context || document, xml) ) {
  5811. results.push( elem );
  5812. break;
  5813. }
  5814. }
  5815. if ( outermost ) {
  5816. dirruns = dirrunsUnique;
  5817. }
  5818. }
  5819. // Track unmatched elements for set filters
  5820. if ( bySet ) {
  5821. // They will have gone through all possible matchers
  5822. if ( (elem = !matcher && elem) ) {
  5823. matchedCount--;
  5824. }
  5825. // Lengthen the array for every element, matched or not
  5826. if ( seed ) {
  5827. unmatched.push( elem );
  5828. }
  5829. }
  5830. }
  5831. // `i` is now the count of elements visited above, and adding it to `matchedCount`
  5832. // makes the latter nonnegative.
  5833. matchedCount += i;
  5834. // Apply set filters to unmatched elements
  5835. // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
  5836. // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
  5837. // no element matchers and no seed.
  5838. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
  5839. // case, which will result in a "00" `matchedCount` that differs from `i` but is also
  5840. // numerically zero.
  5841. if ( bySet && i !== matchedCount ) {
  5842. j = 0;
  5843. while ( (matcher = setMatchers[j++]) ) {
  5844. matcher( unmatched, setMatched, context, xml );
  5845. }
  5846. if ( seed ) {
  5847. // Reintegrate element matches to eliminate the need for sorting
  5848. if ( matchedCount > 0 ) {
  5849. while ( i-- ) {
  5850. if ( !(unmatched[i] || setMatched[i]) ) {
  5851. setMatched[i] = pop.call( results );
  5852. }
  5853. }
  5854. }
  5855. // Discard index placeholder values to get only actual matches
  5856. setMatched = condense( setMatched );
  5857. }
  5858. // Add matches to results
  5859. push.apply( results, setMatched );
  5860. // Seedless set matches succeeding multiple successful matchers stipulate sorting
  5861. if ( outermost && !seed && setMatched.length > 0 &&
  5862. ( matchedCount + setMatchers.length ) > 1 ) {
  5863. Sizzle.uniqueSort( results );
  5864. }
  5865. }
  5866. // Override manipulation of globals by nested matchers
  5867. if ( outermost ) {
  5868. dirruns = dirrunsUnique;
  5869. outermostContext = contextBackup;
  5870. }
  5871. return unmatched;
  5872. };
  5873. return bySet ?
  5874. markFunction( superMatcher ) :
  5875. superMatcher;
  5876. }
  5877. compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
  5878. var i,
  5879. setMatchers = [],
  5880. elementMatchers = [],
  5881. cached = compilerCache[ selector + " " ];
  5882. if ( !cached ) {
  5883. // Generate a function of recursive functions that can be used to check each element
  5884. if ( !match ) {
  5885. match = tokenize( selector );
  5886. }
  5887. i = match.length;
  5888. while ( i-- ) {
  5889. cached = matcherFromTokens( match[i] );
  5890. if ( cached[ expando ] ) {
  5891. setMatchers.push( cached );
  5892. } else {
  5893. elementMatchers.push( cached );
  5894. }
  5895. }
  5896. // Cache the compiled function
  5897. cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
  5898. // Save selector and tokenization
  5899. cached.selector = selector;
  5900. }
  5901. return cached;
  5902. };
  5903. /**
  5904. * A low-level selection function that works with Sizzle's compiled
  5905. * selector functions
  5906. * @param {String|Function} selector A selector or a pre-compiled
  5907. * selector function built with Sizzle.compile
  5908. * @param {Element} context
  5909. * @param {Array} [results]
  5910. * @param {Array} [seed] A set of elements to match against
  5911. */
  5912. select = Sizzle.select = function( selector, context, results, seed ) {
  5913. var i, tokens, token, type, find,
  5914. compiled = typeof selector === "function" && selector,
  5915. match = !seed && tokenize( (selector = compiled.selector || selector) );
  5916. results = results || [];
  5917. // Try to minimize operations if there is only one selector in the list and no seed
  5918. // (the latter of which guarantees us context)
  5919. if ( match.length === 1 ) {
  5920. // Reduce context if the leading compound selector is an ID
  5921. tokens = match[0] = match[0].slice( 0 );
  5922. if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
  5923. context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
  5924. context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
  5925. if ( !context ) {
  5926. return results;
  5927. // Precompiled matchers will still verify ancestry, so step up a level
  5928. } else if ( compiled ) {
  5929. context = context.parentNode;
  5930. }
  5931. selector = selector.slice( tokens.shift().value.length );
  5932. }
  5933. // Fetch a seed set for right-to-left matching
  5934. i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
  5935. while ( i-- ) {
  5936. token = tokens[i];
  5937. // Abort if we hit a combinator
  5938. if ( Expr.relative[ (type = token.type) ] ) {
  5939. break;
  5940. }
  5941. if ( (find = Expr.find[ type ]) ) {
  5942. // Search, expanding context for leading sibling combinators
  5943. if ( (seed = find(
  5944. token.matches[0].replace( runescape, funescape ),
  5945. rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
  5946. )) ) {
  5947. // If seed is empty or no tokens remain, we can return early
  5948. tokens.splice( i, 1 );
  5949. selector = seed.length && toSelector( tokens );
  5950. if ( !selector ) {
  5951. push.apply( results, seed );
  5952. return results;
  5953. }
  5954. break;
  5955. }
  5956. }
  5957. }
  5958. }
  5959. // Compile and execute a filtering function if one is not provided
  5960. // Provide `match` to avoid retokenization if we modified the selector above
  5961. ( compiled || compile( selector, match ) )(
  5962. seed,
  5963. context,
  5964. !documentIsHTML,
  5965. results,
  5966. !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
  5967. );
  5968. return results;
  5969. };
  5970. // One-time assignments
  5971. // Sort stability
  5972. support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
  5973. // Support: Chrome 14-35+
  5974. // Always assume duplicates if they aren't passed to the comparison function
  5975. support.detectDuplicates = !!hasDuplicate;
  5976. // Initialize against the default document
  5977. setDocument();
  5978. // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
  5979. // Detached nodes confoundingly follow *each other*
  5980. support.sortDetached = assert(function( el ) {
  5981. // Should return 1, but returns 4 (following)
  5982. return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
  5983. });
  5984. // Support: IE<8
  5985. // Prevent attribute/property "interpolation"
  5986. // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
  5987. if ( !assert(function( el ) {
  5988. el.innerHTML = "<a href='#'></a>";
  5989. return el.firstChild.getAttribute("href") === "#" ;
  5990. }) ) {
  5991. addHandle( "type|href|height|width", function( elem, name, isXML ) {
  5992. if ( !isXML ) {
  5993. return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
  5994. }
  5995. });
  5996. }
  5997. // Support: IE<9
  5998. // Use defaultValue in place of getAttribute("value")
  5999. if ( !support.attributes || !assert(function( el ) {
  6000. el.innerHTML = "<input/>";
  6001. el.firstChild.setAttribute( "value", "" );
  6002. return el.firstChild.getAttribute( "value" ) === "";
  6003. }) ) {
  6004. addHandle( "value", function( elem, name, isXML ) {
  6005. if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
  6006. return elem.defaultValue;
  6007. }
  6008. });
  6009. }
  6010. // Support: IE<9
  6011. // Use getAttributeNode to fetch booleans when getAttribute lies
  6012. if ( !assert(function( el ) {
  6013. return el.getAttribute("disabled") == null;
  6014. }) ) {
  6015. addHandle( booleans, function( elem, name, isXML ) {
  6016. var val;
  6017. if ( !isXML ) {
  6018. return elem[ name ] === true ? name.toLowerCase() :
  6019. (val = elem.getAttributeNode( name )) && val.specified ?
  6020. val.value :
  6021. null;
  6022. }
  6023. });
  6024. }
  6025. return Sizzle;
  6026. })( window );
  6027. jQuery.find = Sizzle;
  6028. jQuery.expr = Sizzle.selectors;
  6029. // Deprecated
  6030. jQuery.expr[ ":" ] = jQuery.expr.pseudos;
  6031. jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
  6032. jQuery.text = Sizzle.getText;
  6033. jQuery.isXMLDoc = Sizzle.isXML;
  6034. jQuery.contains = Sizzle.contains;
  6035. jQuery.escapeSelector = Sizzle.escape;
  6036. var dir = function( elem, dir, until ) {
  6037. var matched = [],
  6038. truncate = until !== undefined;
  6039. while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
  6040. if ( elem.nodeType === 1 ) {
  6041. if ( truncate && jQuery( elem ).is( until ) ) {
  6042. break;
  6043. }
  6044. matched.push( elem );
  6045. }
  6046. }
  6047. return matched;
  6048. };
  6049. var siblings = function( n, elem ) {
  6050. var matched = [];
  6051. for ( ; n; n = n.nextSibling ) {
  6052. if ( n.nodeType === 1 && n !== elem ) {
  6053. matched.push( n );
  6054. }
  6055. }
  6056. return matched;
  6057. };
  6058. var rneedsContext = jQuery.expr.match.needsContext;
  6059. var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
  6060. var risSimple = /^.[^:#\[\.,]*$/;
  6061. // Implement the identical functionality for filter and not
  6062. function winnow( elements, qualifier, not ) {
  6063. if ( jQuery.isFunction( qualifier ) ) {
  6064. return jQuery.grep( elements, function( elem, i ) {
  6065. return !!qualifier.call( elem, i, elem ) !== not;
  6066. } );
  6067. }
  6068. // Single element
  6069. if ( qualifier.nodeType ) {
  6070. return jQuery.grep( elements, function( elem ) {
  6071. return ( elem === qualifier ) !== not;
  6072. } );
  6073. }
  6074. // Arraylike of elements (jQuery, arguments, Array)
  6075. if ( typeof qualifier !== "string" ) {
  6076. return jQuery.grep( elements, function( elem ) {
  6077. return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
  6078. } );
  6079. }
  6080. // Simple selector that can be filtered directly, removing non-Elements
  6081. if ( risSimple.test( qualifier ) ) {
  6082. return jQuery.filter( qualifier, elements, not );
  6083. }
  6084. // Complex selector, compare the two sets, removing non-Elements
  6085. qualifier = jQuery.filter( qualifier, elements );
  6086. return jQuery.grep( elements, function( elem ) {
  6087. return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
  6088. } );
  6089. }
  6090. jQuery.filter = function( expr, elems, not ) {
  6091. var elem = elems[ 0 ];
  6092. if ( not ) {
  6093. expr = ":not(" + expr + ")";
  6094. }
  6095. if ( elems.length === 1 && elem.nodeType === 1 ) {
  6096. return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
  6097. }
  6098. return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
  6099. return elem.nodeType === 1;
  6100. } ) );
  6101. };
  6102. jQuery.fn.extend( {
  6103. find: function( selector ) {
  6104. var i, ret,
  6105. len = this.length,
  6106. self = this;
  6107. if ( typeof selector !== "string" ) {
  6108. return this.pushStack( jQuery( selector ).filter( function() {
  6109. for ( i = 0; i < len; i++ ) {
  6110. if ( jQuery.contains( self[ i ], this ) ) {
  6111. return true;
  6112. }
  6113. }
  6114. } ) );
  6115. }
  6116. ret = this.pushStack( [] );
  6117. for ( i = 0; i < len; i++ ) {
  6118. jQuery.find( selector, self[ i ], ret );
  6119. }
  6120. return len > 1 ? jQuery.uniqueSort( ret ) : ret;
  6121. },
  6122. filter: function( selector ) {
  6123. return this.pushStack( winnow( this, selector || [], false ) );
  6124. },
  6125. not: function( selector ) {
  6126. return this.pushStack( winnow( this, selector || [], true ) );
  6127. },
  6128. is: function( selector ) {
  6129. return !!winnow(
  6130. this,
  6131. // If this is a positional/relative selector, check membership in the returned set
  6132. // so $("p:first").is("p:last") won't return true for a doc with two "p".
  6133. typeof selector === "string" && rneedsContext.test( selector ) ?
  6134. jQuery( selector ) :
  6135. selector || [],
  6136. false
  6137. ).length;
  6138. }
  6139. } );
  6140. // Initialize a jQuery object
  6141. // A central reference to the root jQuery(document)
  6142. var rootjQuery,
  6143. // A simple way to check for HTML strings
  6144. // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
  6145. // Strict HTML recognition (#11290: must start with <)
  6146. // Shortcut simple #id case for speed
  6147. rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
  6148. init = jQuery.fn.init = function( selector, context, root ) {
  6149. var match, elem;
  6150. // HANDLE: $(""), $(null), $(undefined), $(false)
  6151. if ( !selector ) {
  6152. return this;
  6153. }
  6154. // Method init() accepts an alternate rootjQuery
  6155. // so migrate can support jQuery.sub (gh-2101)
  6156. root = root || rootjQuery;
  6157. // Handle HTML strings
  6158. if ( typeof selector === "string" ) {
  6159. if ( selector[ 0 ] === "<" &&
  6160. selector[ selector.length - 1 ] === ">" &&
  6161. selector.length >= 3 ) {
  6162. // Assume that strings that start and end with <> are HTML and skip the regex check
  6163. match = [ null, selector, null ];
  6164. } else {
  6165. match = rquickExpr.exec( selector );
  6166. }
  6167. // Match html or make sure no context is specified for #id
  6168. if ( match && ( match[ 1 ] || !context ) ) {
  6169. // HANDLE: $(html) -> $(array)
  6170. if ( match[ 1 ] ) {
  6171. context = context instanceof jQuery ? context[ 0 ] : context;
  6172. // Option to run scripts is true for back-compat
  6173. // Intentionally let the error be thrown if parseHTML is not present
  6174. jQuery.merge( this, jQuery.parseHTML(
  6175. match[ 1 ],
  6176. context && context.nodeType ? context.ownerDocument || context : document,
  6177. true
  6178. ) );
  6179. // HANDLE: $(html, props)
  6180. if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
  6181. for ( match in context ) {
  6182. // Properties of context are called as methods if possible
  6183. if ( jQuery.isFunction( this[ match ] ) ) {
  6184. this[ match ]( context[ match ] );
  6185. // ...and otherwise set as attributes
  6186. } else {
  6187. this.attr( match, context[ match ] );
  6188. }
  6189. }
  6190. }
  6191. return this;
  6192. // HANDLE: $(#id)
  6193. } else {
  6194. elem = document.getElementById( match[ 2 ] );
  6195. if ( elem ) {
  6196. // Inject the element directly into the jQuery object
  6197. this[ 0 ] = elem;
  6198. this.length = 1;
  6199. }
  6200. return this;
  6201. }
  6202. // HANDLE: $(expr, $(...))
  6203. } else if ( !context || context.jquery ) {
  6204. return ( context || root ).find( selector );
  6205. // HANDLE: $(expr, context)
  6206. // (which is just equivalent to: $(context).find(expr)
  6207. } else {
  6208. return this.constructor( context ).find( selector );
  6209. }
  6210. // HANDLE: $(DOMElement)
  6211. } else if ( selector.nodeType ) {
  6212. this[ 0 ] = selector;
  6213. this.length = 1;
  6214. return this;
  6215. // HANDLE: $(function)
  6216. // Shortcut for document ready
  6217. } else if ( jQuery.isFunction( selector ) ) {
  6218. return root.ready !== undefined ?
  6219. root.ready( selector ) :
  6220. // Execute immediately if ready is not present
  6221. selector( jQuery );
  6222. }
  6223. return jQuery.makeArray( selector, this );
  6224. };
  6225. // Give the init function the jQuery prototype for later instantiation
  6226. init.prototype = jQuery.fn;
  6227. // Initialize central reference
  6228. rootjQuery = jQuery( document );
  6229. var rparentsprev = /^(?:parents|prev(?:Until|All))/,
  6230. // Methods guaranteed to produce a unique set when starting from a unique set
  6231. guaranteedUnique = {
  6232. children: true,
  6233. contents: true,
  6234. next: true,
  6235. prev: true
  6236. };
  6237. jQuery.fn.extend( {
  6238. has: function( target ) {
  6239. var targets = jQuery( target, this ),
  6240. l = targets.length;
  6241. return this.filter( function() {
  6242. var i = 0;
  6243. for ( ; i < l; i++ ) {
  6244. if ( jQuery.contains( this, targets[ i ] ) ) {
  6245. return true;
  6246. }
  6247. }
  6248. } );
  6249. },
  6250. closest: function( selectors, context ) {
  6251. var cur,
  6252. i = 0,
  6253. l = this.length,
  6254. matched = [],
  6255. targets = typeof selectors !== "string" && jQuery( selectors );
  6256. // Positional selectors never match, since there's no _selection_ context
  6257. if ( !rneedsContext.test( selectors ) ) {
  6258. for ( ; i < l; i++ ) {
  6259. for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
  6260. // Always skip document fragments
  6261. if ( cur.nodeType < 11 && ( targets ?
  6262. targets.index( cur ) > -1 :
  6263. // Don't pass non-elements to Sizzle
  6264. cur.nodeType === 1 &&
  6265. jQuery.find.matchesSelector( cur, selectors ) ) ) {
  6266. matched.push( cur );
  6267. break;
  6268. }
  6269. }
  6270. }
  6271. }
  6272. return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
  6273. },
  6274. // Determine the position of an element within the set
  6275. index: function( elem ) {
  6276. // No argument, return index in parent
  6277. if ( !elem ) {
  6278. return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
  6279. }
  6280. // Index in selector
  6281. if ( typeof elem === "string" ) {
  6282. return indexOf.call( jQuery( elem ), this[ 0 ] );
  6283. }
  6284. // Locate the position of the desired element
  6285. return indexOf.call( this,
  6286. // If it receives a jQuery object, the first element is used
  6287. elem.jquery ? elem[ 0 ] : elem
  6288. );
  6289. },
  6290. add: function( selector, context ) {
  6291. return this.pushStack(
  6292. jQuery.uniqueSort(
  6293. jQuery.merge( this.get(), jQuery( selector, context ) )
  6294. )
  6295. );
  6296. },
  6297. addBack: function( selector ) {
  6298. return this.add( selector == null ?
  6299. this.prevObject : this.prevObject.filter( selector )
  6300. );
  6301. }
  6302. } );
  6303. function sibling( cur, dir ) {
  6304. while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
  6305. return cur;
  6306. }
  6307. jQuery.each( {
  6308. parent: function( elem ) {
  6309. var parent = elem.parentNode;
  6310. return parent && parent.nodeType !== 11 ? parent : null;
  6311. },
  6312. parents: function( elem ) {
  6313. return dir( elem, "parentNode" );
  6314. },
  6315. parentsUntil: function( elem, i, until ) {
  6316. return dir( elem, "parentNode", until );
  6317. },
  6318. next: function( elem ) {
  6319. return sibling( elem, "nextSibling" );
  6320. },
  6321. prev: function( elem ) {
  6322. return sibling( elem, "previousSibling" );
  6323. },
  6324. nextAll: function( elem ) {
  6325. return dir( elem, "nextSibling" );
  6326. },
  6327. prevAll: function( elem ) {
  6328. return dir( elem, "previousSibling" );
  6329. },
  6330. nextUntil: function( elem, i, until ) {
  6331. return dir( elem, "nextSibling", until );
  6332. },
  6333. prevUntil: function( elem, i, until ) {
  6334. return dir( elem, "previousSibling", until );
  6335. },
  6336. siblings: function( elem ) {
  6337. return siblings( ( elem.parentNode || {} ).firstChild, elem );
  6338. },
  6339. children: function( elem ) {
  6340. return siblings( elem.firstChild );
  6341. },
  6342. contents: function( elem ) {
  6343. return elem.contentDocument || jQuery.merge( [], elem.childNodes );
  6344. }
  6345. }, function( name, fn ) {
  6346. jQuery.fn[ name ] = function( until, selector ) {
  6347. var matched = jQuery.map( this, fn, until );
  6348. if ( name.slice( -5 ) !== "Until" ) {
  6349. selector = until;
  6350. }
  6351. if ( selector && typeof selector === "string" ) {
  6352. matched = jQuery.filter( selector, matched );
  6353. }
  6354. if ( this.length > 1 ) {
  6355. // Remove duplicates
  6356. if ( !guaranteedUnique[ name ] ) {
  6357. jQuery.uniqueSort( matched );
  6358. }
  6359. // Reverse order for parents* and prev-derivatives
  6360. if ( rparentsprev.test( name ) ) {
  6361. matched.reverse();
  6362. }
  6363. }
  6364. return this.pushStack( matched );
  6365. };
  6366. } );
  6367. var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
  6368. // Convert String-formatted options into Object-formatted ones
  6369. function createOptions( options ) {
  6370. var object = {};
  6371. jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
  6372. object[ flag ] = true;
  6373. } );
  6374. return object;
  6375. }
  6376. /*
  6377. * Create a callback list using the following parameters:
  6378. *
  6379. * options: an optional list of space-separated options that will change how
  6380. * the callback list behaves or a more traditional option object
  6381. *
  6382. * By default a callback list will act like an event callback list and can be
  6383. * "fired" multiple times.
  6384. *
  6385. * Possible options:
  6386. *
  6387. * once: will ensure the callback list can only be fired once (like a Deferred)
  6388. *
  6389. * memory: will keep track of previous values and will call any callback added
  6390. * after the list has been fired right away with the latest "memorized"
  6391. * values (like a Deferred)
  6392. *
  6393. * unique: will ensure a callback can only be added once (no duplicate in the list)
  6394. *
  6395. * stopOnFalse: interrupt callings when a callback returns false
  6396. *
  6397. */
  6398. jQuery.Callbacks = function( options ) {
  6399. // Convert options from String-formatted to Object-formatted if needed
  6400. // (we check in cache first)
  6401. options = typeof options === "string" ?
  6402. createOptions( options ) :
  6403. jQuery.extend( {}, options );
  6404. var // Flag to know if list is currently firing
  6405. firing,
  6406. // Last fire value for non-forgettable lists
  6407. memory,
  6408. // Flag to know if list was already fired
  6409. fired,
  6410. // Flag to prevent firing
  6411. locked,
  6412. // Actual callback list
  6413. list = [],
  6414. // Queue of execution data for repeatable lists
  6415. queue = [],
  6416. // Index of currently firing callback (modified by add/remove as needed)
  6417. firingIndex = -1,
  6418. // Fire callbacks
  6419. fire = function() {
  6420. // Enforce single-firing
  6421. locked = options.once;
  6422. // Execute callbacks for all pending executions,
  6423. // respecting firingIndex overrides and runtime changes
  6424. fired = firing = true;
  6425. for ( ; queue.length; firingIndex = -1 ) {
  6426. memory = queue.shift();
  6427. while ( ++firingIndex < list.length ) {
  6428. // Run callback and check for early termination
  6429. if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
  6430. options.stopOnFalse ) {
  6431. // Jump to end and forget the data so .add doesn't re-fire
  6432. firingIndex = list.length;
  6433. memory = false;
  6434. }
  6435. }
  6436. }
  6437. // Forget the data if we're done with it
  6438. if ( !options.memory ) {
  6439. memory = false;
  6440. }
  6441. firing = false;
  6442. // Clean up if we're done firing for good
  6443. if ( locked ) {
  6444. // Keep an empty list if we have data for future add calls
  6445. if ( memory ) {
  6446. list = [];
  6447. // Otherwise, this object is spent
  6448. } else {
  6449. list = "";
  6450. }
  6451. }
  6452. },
  6453. // Actual Callbacks object
  6454. self = {
  6455. // Add a callback or a collection of callbacks to the list
  6456. add: function() {
  6457. if ( list ) {
  6458. // If we have memory from a past run, we should fire after adding
  6459. if ( memory && !firing ) {
  6460. firingIndex = list.length - 1;
  6461. queue.push( memory );
  6462. }
  6463. ( function add( args ) {
  6464. jQuery.each( args, function( _, arg ) {
  6465. if ( jQuery.isFunction( arg ) ) {
  6466. if ( !options.unique || !self.has( arg ) ) {
  6467. list.push( arg );
  6468. }
  6469. } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
  6470. // Inspect recursively
  6471. add( arg );
  6472. }
  6473. } );
  6474. } )( arguments );
  6475. if ( memory && !firing ) {
  6476. fire();
  6477. }
  6478. }
  6479. return this;
  6480. },
  6481. // Remove a callback from the list
  6482. remove: function() {
  6483. jQuery.each( arguments, function( _, arg ) {
  6484. var index;
  6485. while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
  6486. list.splice( index, 1 );
  6487. // Handle firing indexes
  6488. if ( index <= firingIndex ) {
  6489. firingIndex--;
  6490. }
  6491. }
  6492. } );
  6493. return this;
  6494. },
  6495. // Check if a given callback is in the list.
  6496. // If no argument is given, return whether or not list has callbacks attached.
  6497. has: function( fn ) {
  6498. return fn ?
  6499. jQuery.inArray( fn, list ) > -1 :
  6500. list.length > 0;
  6501. },
  6502. // Remove all callbacks from the list
  6503. empty: function() {
  6504. if ( list ) {
  6505. list = [];
  6506. }
  6507. return this;
  6508. },
  6509. // Disable .fire and .add
  6510. // Abort any current/pending executions
  6511. // Clear all callbacks and values
  6512. disable: function() {
  6513. locked = queue = [];
  6514. list = memory = "";
  6515. return this;
  6516. },
  6517. disabled: function() {
  6518. return !list;
  6519. },
  6520. // Disable .fire
  6521. // Also disable .add unless we have memory (since it would have no effect)
  6522. // Abort any pending executions
  6523. lock: function() {
  6524. locked = queue = [];
  6525. if ( !memory && !firing ) {
  6526. list = memory = "";
  6527. }
  6528. return this;
  6529. },
  6530. locked: function() {
  6531. return !!locked;
  6532. },
  6533. // Call all callbacks with the given context and arguments
  6534. fireWith: function( context, args ) {
  6535. if ( !locked ) {
  6536. args = args || [];
  6537. args = [ context, args.slice ? args.slice() : args ];
  6538. queue.push( args );
  6539. if ( !firing ) {
  6540. fire();
  6541. }
  6542. }
  6543. return this;
  6544. },
  6545. // Call all the callbacks with the given arguments
  6546. fire: function() {
  6547. self.fireWith( this, arguments );
  6548. return this;
  6549. },
  6550. // To know if the callbacks have already been called at least once
  6551. fired: function() {
  6552. return !!fired;
  6553. }
  6554. };
  6555. return self;
  6556. };
  6557. function Identity( v ) {
  6558. return v;
  6559. }
  6560. function Thrower( ex ) {
  6561. throw ex;
  6562. }
  6563. function adoptValue( value, resolve, reject ) {
  6564. var method;
  6565. try {
  6566. // Check for promise aspect first to privilege synchronous behavior
  6567. if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
  6568. method.call( value ).done( resolve ).fail( reject );
  6569. // Other thenables
  6570. } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
  6571. method.call( value, resolve, reject );
  6572. // Other non-thenables
  6573. } else {
  6574. // Support: Android 4.0 only
  6575. // Strict mode functions invoked without .call/.apply get global-object context
  6576. resolve.call( undefined, value );
  6577. }
  6578. // For Promises/A+, convert exceptions into rejections
  6579. // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
  6580. // Deferred#then to conditionally suppress rejection.
  6581. } catch ( value ) {
  6582. // Support: Android 4.0 only
  6583. // Strict mode functions invoked without .call/.apply get global-object context
  6584. reject.call( undefined, value );
  6585. }
  6586. }
  6587. jQuery.extend( {
  6588. Deferred: function( func ) {
  6589. var tuples = [
  6590. // action, add listener, callbacks,
  6591. // ... .then handlers, argument index, [final state]
  6592. [ "notify", "progress", jQuery.Callbacks( "memory" ),
  6593. jQuery.Callbacks( "memory" ), 2 ],
  6594. [ "resolve", "done", jQuery.Callbacks( "once memory" ),
  6595. jQuery.Callbacks( "once memory" ), 0, "resolved" ],
  6596. [ "reject", "fail", jQuery.Callbacks( "once memory" ),
  6597. jQuery.Callbacks( "once memory" ), 1, "rejected" ]
  6598. ],
  6599. state = "pending",
  6600. promise = {
  6601. state: function() {
  6602. return state;
  6603. },
  6604. always: function() {
  6605. deferred.done( arguments ).fail( arguments );
  6606. return this;
  6607. },
  6608. "catch": function( fn ) {
  6609. return promise.then( null, fn );
  6610. },
  6611. // Keep pipe for back-compat
  6612. pipe: function( /* fnDone, fnFail, fnProgress */ ) {
  6613. var fns = arguments;
  6614. return jQuery.Deferred( function( newDefer ) {
  6615. jQuery.each( tuples, function( i, tuple ) {
  6616. // Map tuples (progress, done, fail) to arguments (done, fail, progress)
  6617. var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
  6618. // deferred.progress(function() { bind to newDefer or newDefer.notify })
  6619. // deferred.done(function() { bind to newDefer or newDefer.resolve })
  6620. // deferred.fail(function() { bind to newDefer or newDefer.reject })
  6621. deferred[ tuple[ 1 ] ]( function() {
  6622. var returned = fn && fn.apply( this, arguments );
  6623. if ( returned && jQuery.isFunction( returned.promise ) ) {
  6624. returned.promise()
  6625. .progress( newDefer.notify )
  6626. .done( newDefer.resolve )
  6627. .fail( newDefer.reject );
  6628. } else {
  6629. newDefer[ tuple[ 0 ] + "With" ](
  6630. this,
  6631. fn ? [ returned ] : arguments
  6632. );
  6633. }
  6634. } );
  6635. } );
  6636. fns = null;
  6637. } ).promise();
  6638. },
  6639. then: function( onFulfilled, onRejected, onProgress ) {
  6640. var maxDepth = 0;
  6641. function resolve( depth, deferred, handler, special ) {
  6642. return function() {
  6643. var that = this,
  6644. args = arguments,
  6645. mightThrow = function() {
  6646. var returned, then;
  6647. // Support: Promises/A+ section 2.3.3.3.3
  6648. // https://promisesaplus.com/#point-59
  6649. // Ignore double-resolution attempts
  6650. if ( depth < maxDepth ) {
  6651. return;
  6652. }
  6653. returned = handler.apply( that, args );
  6654. // Support: Promises/A+ section 2.3.1
  6655. // https://promisesaplus.com/#point-48
  6656. if ( returned === deferred.promise() ) {
  6657. throw new TypeError( "Thenable self-resolution" );
  6658. }
  6659. // Support: Promises/A+ sections 2.3.3.1, 3.5
  6660. // https://promisesaplus.com/#point-54
  6661. // https://promisesaplus.com/#point-75
  6662. // Retrieve `then` only once
  6663. then = returned &&
  6664. // Support: Promises/A+ section 2.3.4
  6665. // https://promisesaplus.com/#point-64
  6666. // Only check objects and functions for thenability
  6667. ( typeof returned === "object" ||
  6668. typeof returned === "function" ) &&
  6669. returned.then;
  6670. // Handle a returned thenable
  6671. if ( jQuery.isFunction( then ) ) {
  6672. // Special processors (notify) just wait for resolution
  6673. if ( special ) {
  6674. then.call(
  6675. returned,
  6676. resolve( maxDepth, deferred, Identity, special ),
  6677. resolve( maxDepth, deferred, Thrower, special )
  6678. );
  6679. // Normal processors (resolve) also hook into progress
  6680. } else {
  6681. // ...and disregard older resolution values
  6682. maxDepth++;
  6683. then.call(
  6684. returned,
  6685. resolve( maxDepth, deferred, Identity, special ),
  6686. resolve( maxDepth, deferred, Thrower, special ),
  6687. resolve( maxDepth, deferred, Identity,
  6688. deferred.notifyWith )
  6689. );
  6690. }
  6691. // Handle all other returned values
  6692. } else {
  6693. // Only substitute handlers pass on context
  6694. // and multiple values (non-spec behavior)
  6695. if ( handler !== Identity ) {
  6696. that = undefined;
  6697. args = [ returned ];
  6698. }
  6699. // Process the value(s)
  6700. // Default process is resolve
  6701. ( special || deferred.resolveWith )( that, args );
  6702. }
  6703. },
  6704. // Only normal processors (resolve) catch and reject exceptions
  6705. process = special ?
  6706. mightThrow :
  6707. function() {
  6708. try {
  6709. mightThrow();
  6710. } catch ( e ) {
  6711. if ( jQuery.Deferred.exceptionHook ) {
  6712. jQuery.Deferred.exceptionHook( e,
  6713. process.stackTrace );
  6714. }
  6715. // Support: Promises/A+ section 2.3.3.3.4.1
  6716. // https://promisesaplus.com/#point-61
  6717. // Ignore post-resolution exceptions
  6718. if ( depth + 1 >= maxDepth ) {
  6719. // Only substitute handlers pass on context
  6720. // and multiple values (non-spec behavior)
  6721. if ( handler !== Thrower ) {
  6722. that = undefined;
  6723. args = [ e ];
  6724. }
  6725. deferred.rejectWith( that, args );
  6726. }
  6727. }
  6728. };
  6729. // Support: Promises/A+ section 2.3.3.3.1
  6730. // https://promisesaplus.com/#point-57
  6731. // Re-resolve promises immediately to dodge false rejection from
  6732. // subsequent errors
  6733. if ( depth ) {
  6734. process();
  6735. } else {
  6736. // Call an optional hook to record the stack, in case of exception
  6737. // since it's otherwise lost when execution goes async
  6738. if ( jQuery.Deferred.getStackHook ) {
  6739. process.stackTrace = jQuery.Deferred.getStackHook();
  6740. }
  6741. window.setTimeout( process );
  6742. }
  6743. };
  6744. }
  6745. return jQuery.Deferred( function( newDefer ) {
  6746. // progress_handlers.add( ... )
  6747. tuples[ 0 ][ 3 ].add(
  6748. resolve(
  6749. 0,
  6750. newDefer,
  6751. jQuery.isFunction( onProgress ) ?
  6752. onProgress :
  6753. Identity,
  6754. newDefer.notifyWith
  6755. )
  6756. );
  6757. // fulfilled_handlers.add( ... )
  6758. tuples[ 1 ][ 3 ].add(
  6759. resolve(
  6760. 0,
  6761. newDefer,
  6762. jQuery.isFunction( onFulfilled ) ?
  6763. onFulfilled :
  6764. Identity
  6765. )
  6766. );
  6767. // rejected_handlers.add( ... )
  6768. tuples[ 2 ][ 3 ].add(
  6769. resolve(
  6770. 0,
  6771. newDefer,
  6772. jQuery.isFunction( onRejected ) ?
  6773. onRejected :
  6774. Thrower
  6775. )
  6776. );
  6777. } ).promise();
  6778. },
  6779. // Get a promise for this deferred
  6780. // If obj is provided, the promise aspect is added to the object
  6781. promise: function( obj ) {
  6782. return obj != null ? jQuery.extend( obj, promise ) : promise;
  6783. }
  6784. },
  6785. deferred = {};
  6786. // Add list-specific methods
  6787. jQuery.each( tuples, function( i, tuple ) {
  6788. var list = tuple[ 2 ],
  6789. stateString = tuple[ 5 ];
  6790. // promise.progress = list.add
  6791. // promise.done = list.add
  6792. // promise.fail = list.add
  6793. promise[ tuple[ 1 ] ] = list.add;
  6794. // Handle state
  6795. if ( stateString ) {
  6796. list.add(
  6797. function() {
  6798. // state = "resolved" (i.e., fulfilled)
  6799. // state = "rejected"
  6800. state = stateString;
  6801. },
  6802. // rejected_callbacks.disable
  6803. // fulfilled_callbacks.disable
  6804. tuples[ 3 - i ][ 2 ].disable,
  6805. // progress_callbacks.lock
  6806. tuples[ 0 ][ 2 ].lock
  6807. );
  6808. }
  6809. // progress_handlers.fire
  6810. // fulfilled_handlers.fire
  6811. // rejected_handlers.fire
  6812. list.add( tuple[ 3 ].fire );
  6813. // deferred.notify = function() { deferred.notifyWith(...) }
  6814. // deferred.resolve = function() { deferred.resolveWith(...) }
  6815. // deferred.reject = function() { deferred.rejectWith(...) }
  6816. deferred[ tuple[ 0 ] ] = function() {
  6817. deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
  6818. return this;
  6819. };
  6820. // deferred.notifyWith = list.fireWith
  6821. // deferred.resolveWith = list.fireWith
  6822. // deferred.rejectWith = list.fireWith
  6823. deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
  6824. } );
  6825. // Make the deferred a promise
  6826. promise.promise( deferred );
  6827. // Call given func if any
  6828. if ( func ) {
  6829. func.call( deferred, deferred );
  6830. }
  6831. // All done!
  6832. return deferred;
  6833. },
  6834. // Deferred helper
  6835. when: function( singleValue ) {
  6836. var
  6837. // count of uncompleted subordinates
  6838. remaining = arguments.length,
  6839. // count of unprocessed arguments
  6840. i = remaining,
  6841. // subordinate fulfillment data
  6842. resolveContexts = Array( i ),
  6843. resolveValues = slice.call( arguments ),
  6844. // the master Deferred
  6845. master = jQuery.Deferred(),
  6846. // subordinate callback factory
  6847. updateFunc = function( i ) {
  6848. return function( value ) {
  6849. resolveContexts[ i ] = this;
  6850. resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
  6851. if ( !( --remaining ) ) {
  6852. master.resolveWith( resolveContexts, resolveValues );
  6853. }
  6854. };
  6855. };
  6856. // Single- and empty arguments are adopted like Promise.resolve
  6857. if ( remaining <= 1 ) {
  6858. adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
  6859. // Use .then() to unwrap secondary thenables (cf. gh-3000)
  6860. if ( master.state() === "pending" ||
  6861. jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
  6862. return master.then();
  6863. }
  6864. }
  6865. // Multiple arguments are aggregated like Promise.all array elements
  6866. while ( i-- ) {
  6867. adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
  6868. }
  6869. return master.promise();
  6870. }
  6871. } );
  6872. // These usually indicate a programmer mistake during development,
  6873. // warn about them ASAP rather than swallowing them by default.
  6874. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
  6875. jQuery.Deferred.exceptionHook = function( error, stack ) {
  6876. // Support: IE 8 - 9 only
  6877. // Console exists when dev tools are open, which can happen at any time
  6878. if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
  6879. window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
  6880. }
  6881. };
  6882. jQuery.readyException = function( error ) {
  6883. window.setTimeout( function() {
  6884. throw error;
  6885. } );
  6886. };
  6887. // The deferred used on DOM ready
  6888. var readyList = jQuery.Deferred();
  6889. jQuery.fn.ready = function( fn ) {
  6890. readyList
  6891. .then( fn )
  6892. // Wrap jQuery.readyException in a function so that the lookup
  6893. // happens at the time of error handling instead of callback
  6894. // registration.
  6895. .catch( function( error ) {
  6896. jQuery.readyException( error );
  6897. } );
  6898. return this;
  6899. };
  6900. jQuery.extend( {
  6901. // Is the DOM ready to be used? Set to true once it occurs.
  6902. isReady: false,
  6903. // A counter to track how many items to wait for before
  6904. // the ready event fires. See #6781
  6905. readyWait: 1,
  6906. // Hold (or release) the ready event
  6907. holdReady: function( hold ) {
  6908. if ( hold ) {
  6909. jQuery.readyWait++;
  6910. } else {
  6911. jQuery.ready( true );
  6912. }
  6913. },
  6914. // Handle when the DOM is ready
  6915. ready: function( wait ) {
  6916. // Abort if there are pending holds or we're already ready
  6917. if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
  6918. return;
  6919. }
  6920. // Remember that the DOM is ready
  6921. jQuery.isReady = true;
  6922. // If a normal DOM Ready event fired, decrement, and wait if need be
  6923. if ( wait !== true && --jQuery.readyWait > 0 ) {
  6924. return;
  6925. }
  6926. // If there are functions bound, to execute
  6927. readyList.resolveWith( document, [ jQuery ] );
  6928. }
  6929. } );
  6930. jQuery.ready.then = readyList.then;
  6931. // The ready event handler and self cleanup method
  6932. function completed() {
  6933. document.removeEventListener( "DOMContentLoaded", completed );
  6934. window.removeEventListener( "load", completed );
  6935. jQuery.ready();
  6936. }
  6937. // Catch cases where $(document).ready() is called
  6938. // after the browser event has already occurred.
  6939. // Support: IE <=9 - 10 only
  6940. // Older IE sometimes signals "interactive" too soon
  6941. if ( document.readyState === "complete" ||
  6942. ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
  6943. // Handle it asynchronously to allow scripts the opportunity to delay ready
  6944. window.setTimeout( jQuery.ready );
  6945. } else {
  6946. // Use the handy event callback
  6947. document.addEventListener( "DOMContentLoaded", completed );
  6948. // A fallback to window.onload, that will always work
  6949. window.addEventListener( "load", completed );
  6950. }
  6951. // Multifunctional method to get and set values of a collection
  6952. // The value/s can optionally be executed if it's a function
  6953. var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
  6954. var i = 0,
  6955. len = elems.length,
  6956. bulk = key == null;
  6957. // Sets many values
  6958. if ( jQuery.type( key ) === "object" ) {
  6959. chainable = true;
  6960. for ( i in key ) {
  6961. access( elems, fn, i, key[ i ], true, emptyGet, raw );
  6962. }
  6963. // Sets one value
  6964. } else if ( value !== undefined ) {
  6965. chainable = true;
  6966. if ( !jQuery.isFunction( value ) ) {
  6967. raw = true;
  6968. }
  6969. if ( bulk ) {
  6970. // Bulk operations run against the entire set
  6971. if ( raw ) {
  6972. fn.call( elems, value );
  6973. fn = null;
  6974. // ...except when executing function values
  6975. } else {
  6976. bulk = fn;
  6977. fn = function( elem, key, value ) {
  6978. return bulk.call( jQuery( elem ), value );
  6979. };
  6980. }
  6981. }
  6982. if ( fn ) {
  6983. for ( ; i < len; i++ ) {
  6984. fn(
  6985. elems[ i ], key, raw ?
  6986. value :
  6987. value.call( elems[ i ], i, fn( elems[ i ], key ) )
  6988. );
  6989. }
  6990. }
  6991. }
  6992. if ( chainable ) {
  6993. return elems;
  6994. }
  6995. // Gets
  6996. if ( bulk ) {
  6997. return fn.call( elems );
  6998. }
  6999. return len ? fn( elems[ 0 ], key ) : emptyGet;
  7000. };
  7001. var acceptData = function( owner ) {
  7002. // Accepts only:
  7003. // - Node
  7004. // - Node.ELEMENT_NODE
  7005. // - Node.DOCUMENT_NODE
  7006. // - Object
  7007. // - Any
  7008. return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
  7009. };
  7010. function Data() {
  7011. this.expando = jQuery.expando + Data.uid++;
  7012. }
  7013. Data.uid = 1;
  7014. Data.prototype = {
  7015. cache: function( owner ) {
  7016. // Check if the owner object already has a cache
  7017. var value = owner[ this.expando ];
  7018. // If not, create one
  7019. if ( !value ) {
  7020. value = {};
  7021. // We can accept data for non-element nodes in modern browsers,
  7022. // but we should not, see #8335.
  7023. // Always return an empty object.
  7024. if ( acceptData( owner ) ) {
  7025. // If it is a node unlikely to be stringify-ed or looped over
  7026. // use plain assignment
  7027. if ( owner.nodeType ) {
  7028. owner[ this.expando ] = value;
  7029. // Otherwise secure it in a non-enumerable property
  7030. // configurable must be true to allow the property to be
  7031. // deleted when data is removed
  7032. } else {
  7033. Object.defineProperty( owner, this.expando, {
  7034. value: value,
  7035. configurable: true
  7036. } );
  7037. }
  7038. }
  7039. }
  7040. return value;
  7041. },
  7042. set: function( owner, data, value ) {
  7043. var prop,
  7044. cache = this.cache( owner );
  7045. // Handle: [ owner, key, value ] args
  7046. // Always use camelCase key (gh-2257)
  7047. if ( typeof data === "string" ) {
  7048. cache[ jQuery.camelCase( data ) ] = value;
  7049. // Handle: [ owner, { properties } ] args
  7050. } else {
  7051. // Copy the properties one-by-one to the cache object
  7052. for ( prop in data ) {
  7053. cache[ jQuery.camelCase( prop ) ] = data[ prop ];
  7054. }
  7055. }
  7056. return cache;
  7057. },
  7058. get: function( owner, key ) {
  7059. return key === undefined ?
  7060. this.cache( owner ) :
  7061. // Always use camelCase key (gh-2257)
  7062. owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
  7063. },
  7064. access: function( owner, key, value ) {
  7065. // In cases where either:
  7066. //
  7067. // 1. No key was specified
  7068. // 2. A string key was specified, but no value provided
  7069. //
  7070. // Take the "read" path and allow the get method to determine
  7071. // which value to return, respectively either:
  7072. //
  7073. // 1. The entire cache object
  7074. // 2. The data stored at the key
  7075. //
  7076. if ( key === undefined ||
  7077. ( ( key && typeof key === "string" ) && value === undefined ) ) {
  7078. return this.get( owner, key );
  7079. }
  7080. // When the key is not a string, or both a key and value
  7081. // are specified, set or extend (existing objects) with either:
  7082. //
  7083. // 1. An object of properties
  7084. // 2. A key and value
  7085. //
  7086. this.set( owner, key, value );
  7087. // Since the "set" path can have two possible entry points
  7088. // return the expected data based on which path was taken[*]
  7089. return value !== undefined ? value : key;
  7090. },
  7091. remove: function( owner, key ) {
  7092. var i,
  7093. cache = owner[ this.expando ];
  7094. if ( cache === undefined ) {
  7095. return;
  7096. }
  7097. if ( key !== undefined ) {
  7098. // Support array or space separated string of keys
  7099. if ( jQuery.isArray( key ) ) {
  7100. // If key is an array of keys...
  7101. // We always set camelCase keys, so remove that.
  7102. key = key.map( jQuery.camelCase );
  7103. } else {
  7104. key = jQuery.camelCase( key );
  7105. // If a key with the spaces exists, use it.
  7106. // Otherwise, create an array by matching non-whitespace
  7107. key = key in cache ?
  7108. [ key ] :
  7109. ( key.match( rnothtmlwhite ) || [] );
  7110. }
  7111. i = key.length;
  7112. while ( i-- ) {
  7113. delete cache[ key[ i ] ];
  7114. }
  7115. }
  7116. // Remove the expando if there's no more data
  7117. if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
  7118. // Support: Chrome <=35 - 45
  7119. // Webkit & Blink performance suffers when deleting properties
  7120. // from DOM nodes, so set to undefined instead
  7121. // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
  7122. if ( owner.nodeType ) {
  7123. owner[ this.expando ] = undefined;
  7124. } else {
  7125. delete owner[ this.expando ];
  7126. }
  7127. }
  7128. },
  7129. hasData: function( owner ) {
  7130. var cache = owner[ this.expando ];
  7131. return cache !== undefined && !jQuery.isEmptyObject( cache );
  7132. }
  7133. };
  7134. var dataPriv = new Data();
  7135. var dataUser = new Data();
  7136. // Implementation Summary
  7137. //
  7138. // 1. Enforce API surface and semantic compatibility with 1.9.x branch
  7139. // 2. Improve the module's maintainability by reducing the storage
  7140. // paths to a single mechanism.
  7141. // 3. Use the same single mechanism to support "private" and "user" data.
  7142. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
  7143. // 5. Avoid exposing implementation details on user objects (eg. expando properties)
  7144. // 6. Provide a clear path for implementation upgrade to WeakMap in 2014
  7145. var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
  7146. rmultiDash = /[A-Z]/g;
  7147. function getData( data ) {
  7148. if ( data === "true" ) {
  7149. return true;
  7150. }
  7151. if ( data === "false" ) {
  7152. return false;
  7153. }
  7154. if ( data === "null" ) {
  7155. return null;
  7156. }
  7157. // Only convert to a number if it doesn't change the string
  7158. if ( data === +data + "" ) {
  7159. return +data;
  7160. }
  7161. if ( rbrace.test( data ) ) {
  7162. return JSON.parse( data );
  7163. }
  7164. return data;
  7165. }
  7166. function dataAttr( elem, key, data ) {
  7167. var name;
  7168. // If nothing was found internally, try to fetch any
  7169. // data from the HTML5 data-* attribute
  7170. if ( data === undefined && elem.nodeType === 1 ) {
  7171. name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
  7172. data = elem.getAttribute( name );
  7173. if ( typeof data === "string" ) {
  7174. try {
  7175. data = getData( data );
  7176. } catch ( e ) {}
  7177. // Make sure we set the data so it isn't changed later
  7178. dataUser.set( elem, key, data );
  7179. } else {
  7180. data = undefined;
  7181. }
  7182. }
  7183. return data;
  7184. }
  7185. jQuery.extend( {
  7186. hasData: function( elem ) {
  7187. return dataUser.hasData( elem ) || dataPriv.hasData( elem );
  7188. },
  7189. data: function( elem, name, data ) {
  7190. return dataUser.access( elem, name, data );
  7191. },
  7192. removeData: function( elem, name ) {
  7193. dataUser.remove( elem, name );
  7194. },
  7195. // TODO: Now that all calls to _data and _removeData have been replaced
  7196. // with direct calls to dataPriv methods, these can be deprecated.
  7197. _data: function( elem, name, data ) {
  7198. return dataPriv.access( elem, name, data );
  7199. },
  7200. _removeData: function( elem, name ) {
  7201. dataPriv.remove( elem, name );
  7202. }
  7203. } );
  7204. jQuery.fn.extend( {
  7205. data: function( key, value ) {
  7206. var i, name, data,
  7207. elem = this[ 0 ],
  7208. attrs = elem && elem.attributes;
  7209. // Gets all values
  7210. if ( key === undefined ) {
  7211. if ( this.length ) {
  7212. data = dataUser.get( elem );
  7213. if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
  7214. i = attrs.length;
  7215. while ( i-- ) {
  7216. // Support: IE 11 only
  7217. // The attrs elements can be null (#14894)
  7218. if ( attrs[ i ] ) {
  7219. name = attrs[ i ].name;
  7220. if ( name.indexOf( "data-" ) === 0 ) {
  7221. name = jQuery.camelCase( name.slice( 5 ) );
  7222. dataAttr( elem, name, data[ name ] );
  7223. }
  7224. }
  7225. }
  7226. dataPriv.set( elem, "hasDataAttrs", true );
  7227. }
  7228. }
  7229. return data;
  7230. }
  7231. // Sets multiple values
  7232. if ( typeof key === "object" ) {
  7233. return this.each( function() {
  7234. dataUser.set( this, key );
  7235. } );
  7236. }
  7237. return access( this, function( value ) {
  7238. var data;
  7239. // The calling jQuery object (element matches) is not empty
  7240. // (and therefore has an element appears at this[ 0 ]) and the
  7241. // `value` parameter was not undefined. An empty jQuery object
  7242. // will result in `undefined` for elem = this[ 0 ] which will
  7243. // throw an exception if an attempt to read a data cache is made.
  7244. if ( elem && value === undefined ) {
  7245. // Attempt to get data from the cache
  7246. // The key will always be camelCased in Data
  7247. data = dataUser.get( elem, key );
  7248. if ( data !== undefined ) {
  7249. return data;
  7250. }
  7251. // Attempt to "discover" the data in
  7252. // HTML5 custom data-* attrs
  7253. data = dataAttr( elem, key );
  7254. if ( data !== undefined ) {
  7255. return data;
  7256. }
  7257. // We tried really hard, but the data doesn't exist.
  7258. return;
  7259. }
  7260. // Set the data...
  7261. this.each( function() {
  7262. // We always store the camelCased key
  7263. dataUser.set( this, key, value );
  7264. } );
  7265. }, null, value, arguments.length > 1, null, true );
  7266. },
  7267. removeData: function( key ) {
  7268. return this.each( function() {
  7269. dataUser.remove( this, key );
  7270. } );
  7271. }
  7272. } );
  7273. jQuery.extend( {
  7274. queue: function( elem, type, data ) {
  7275. var queue;
  7276. if ( elem ) {
  7277. type = ( type || "fx" ) + "queue";
  7278. queue = dataPriv.get( elem, type );
  7279. // Speed up dequeue by getting out quickly if this is just a lookup
  7280. if ( data ) {
  7281. if ( !queue || jQuery.isArray( data ) ) {
  7282. queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
  7283. } else {
  7284. queue.push( data );
  7285. }
  7286. }
  7287. return queue || [];
  7288. }
  7289. },
  7290. dequeue: function( elem, type ) {
  7291. type = type || "fx";
  7292. var queue = jQuery.queue( elem, type ),
  7293. startLength = queue.length,
  7294. fn = queue.shift(),
  7295. hooks = jQuery._queueHooks( elem, type ),
  7296. next = function() {
  7297. jQuery.dequeue( elem, type );
  7298. };
  7299. // If the fx queue is dequeued, always remove the progress sentinel
  7300. if ( fn === "inprogress" ) {
  7301. fn = queue.shift();
  7302. startLength--;
  7303. }
  7304. if ( fn ) {
  7305. // Add a progress sentinel to prevent the fx queue from being
  7306. // automatically dequeued
  7307. if ( type === "fx" ) {
  7308. queue.unshift( "inprogress" );
  7309. }
  7310. // Clear up the last queue stop function
  7311. delete hooks.stop;
  7312. fn.call( elem, next, hooks );
  7313. }
  7314. if ( !startLength && hooks ) {
  7315. hooks.empty.fire();
  7316. }
  7317. },
  7318. // Not public - generate a queueHooks object, or return the current one
  7319. _queueHooks: function( elem, type ) {
  7320. var key = type + "queueHooks";
  7321. return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
  7322. empty: jQuery.Callbacks( "once memory" ).add( function() {
  7323. dataPriv.remove( elem, [ type + "queue", key ] );
  7324. } )
  7325. } );
  7326. }
  7327. } );
  7328. jQuery.fn.extend( {
  7329. queue: function( type, data ) {
  7330. var setter = 2;
  7331. if ( typeof type !== "string" ) {
  7332. data = type;
  7333. type = "fx";
  7334. setter--;
  7335. }
  7336. if ( arguments.length < setter ) {
  7337. return jQuery.queue( this[ 0 ], type );
  7338. }
  7339. return data === undefined ?
  7340. this :
  7341. this.each( function() {
  7342. var queue = jQuery.queue( this, type, data );
  7343. // Ensure a hooks for this queue
  7344. jQuery._queueHooks( this, type );
  7345. if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
  7346. jQuery.dequeue( this, type );
  7347. }
  7348. } );
  7349. },
  7350. dequeue: function( type ) {
  7351. return this.each( function() {
  7352. jQuery.dequeue( this, type );
  7353. } );
  7354. },
  7355. clearQueue: function( type ) {
  7356. return this.queue( type || "fx", [] );
  7357. },
  7358. // Get a promise resolved when queues of a certain type
  7359. // are emptied (fx is the type by default)
  7360. promise: function( type, obj ) {
  7361. var tmp,
  7362. count = 1,
  7363. defer = jQuery.Deferred(),
  7364. elements = this,
  7365. i = this.length,
  7366. resolve = function() {
  7367. if ( !( --count ) ) {
  7368. defer.resolveWith( elements, [ elements ] );
  7369. }
  7370. };
  7371. if ( typeof type !== "string" ) {
  7372. obj = type;
  7373. type = undefined;
  7374. }
  7375. type = type || "fx";
  7376. while ( i-- ) {
  7377. tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
  7378. if ( tmp && tmp.empty ) {
  7379. count++;
  7380. tmp.empty.add( resolve );
  7381. }
  7382. }
  7383. resolve();
  7384. return defer.promise( obj );
  7385. }
  7386. } );
  7387. var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
  7388. var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
  7389. var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
  7390. var isHiddenWithinTree = function( elem, el ) {
  7391. // isHiddenWithinTree might be called from jQuery#filter function;
  7392. // in that case, element will be second argument
  7393. elem = el || elem;
  7394. // Inline style trumps all
  7395. return elem.style.display === "none" ||
  7396. elem.style.display === "" &&
  7397. // Otherwise, check computed style
  7398. // Support: Firefox <=43 - 45
  7399. // Disconnected elements can have computed display: none, so first confirm that elem is
  7400. // in the document.
  7401. jQuery.contains( elem.ownerDocument, elem ) &&
  7402. jQuery.css( elem, "display" ) === "none";
  7403. };
  7404. var swap = function( elem, options, callback, args ) {
  7405. var ret, name,
  7406. old = {};
  7407. // Remember the old values, and insert the new ones
  7408. for ( name in options ) {
  7409. old[ name ] = elem.style[ name ];
  7410. elem.style[ name ] = options[ name ];
  7411. }
  7412. ret = callback.apply( elem, args || [] );
  7413. // Revert the old values
  7414. for ( name in options ) {
  7415. elem.style[ name ] = old[ name ];
  7416. }
  7417. return ret;
  7418. };
  7419. function adjustCSS( elem, prop, valueParts, tween ) {
  7420. var adjusted,
  7421. scale = 1,
  7422. maxIterations = 20,
  7423. currentValue = tween ?
  7424. function() {
  7425. return tween.cur();
  7426. } :
  7427. function() {
  7428. return jQuery.css( elem, prop, "" );
  7429. },
  7430. initial = currentValue(),
  7431. unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
  7432. // Starting value computation is required for potential unit mismatches
  7433. initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
  7434. rcssNum.exec( jQuery.css( elem, prop ) );
  7435. if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
  7436. // Trust units reported by jQuery.css
  7437. unit = unit || initialInUnit[ 3 ];
  7438. // Make sure we update the tween properties later on
  7439. valueParts = valueParts || [];
  7440. // Iteratively approximate from a nonzero starting point
  7441. initialInUnit = +initial || 1;
  7442. do {
  7443. // If previous iteration zeroed out, double until we get *something*.
  7444. // Use string for doubling so we don't accidentally see scale as unchanged below
  7445. scale = scale || ".5";
  7446. // Adjust and apply
  7447. initialInUnit = initialInUnit / scale;
  7448. jQuery.style( elem, prop, initialInUnit + unit );
  7449. // Update scale, tolerating zero or NaN from tween.cur()
  7450. // Break the loop if scale is unchanged or perfect, or if we've just had enough.
  7451. } while (
  7452. scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
  7453. );
  7454. }
  7455. if ( valueParts ) {
  7456. initialInUnit = +initialInUnit || +initial || 0;
  7457. // Apply relative offset (+=/-=) if specified
  7458. adjusted = valueParts[ 1 ] ?
  7459. initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
  7460. +valueParts[ 2 ];
  7461. if ( tween ) {
  7462. tween.unit = unit;
  7463. tween.start = initialInUnit;
  7464. tween.end = adjusted;
  7465. }
  7466. }
  7467. return adjusted;
  7468. }
  7469. var defaultDisplayMap = {};
  7470. function getDefaultDisplay( elem ) {
  7471. var temp,
  7472. doc = elem.ownerDocument,
  7473. nodeName = elem.nodeName,
  7474. display = defaultDisplayMap[ nodeName ];
  7475. if ( display ) {
  7476. return display;
  7477. }
  7478. temp = doc.body.appendChild( doc.createElement( nodeName ) );
  7479. display = jQuery.css( temp, "display" );
  7480. temp.parentNode.removeChild( temp );
  7481. if ( display === "none" ) {
  7482. display = "block";
  7483. }
  7484. defaultDisplayMap[ nodeName ] = display;
  7485. return display;
  7486. }
  7487. function showHide( elements, show ) {
  7488. var display, elem,
  7489. values = [],
  7490. index = 0,
  7491. length = elements.length;
  7492. // Determine new display value for elements that need to change
  7493. for ( ; index < length; index++ ) {
  7494. elem = elements[ index ];
  7495. if ( !elem.style ) {
  7496. continue;
  7497. }
  7498. display = elem.style.display;
  7499. if ( show ) {
  7500. // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
  7501. // check is required in this first loop unless we have a nonempty display value (either
  7502. // inline or about-to-be-restored)
  7503. if ( display === "none" ) {
  7504. values[ index ] = dataPriv.get( elem, "display" ) || null;
  7505. if ( !values[ index ] ) {
  7506. elem.style.display = "";
  7507. }
  7508. }
  7509. if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
  7510. values[ index ] = getDefaultDisplay( elem );
  7511. }
  7512. } else {
  7513. if ( display !== "none" ) {
  7514. values[ index ] = "none";
  7515. // Remember what we're overwriting
  7516. dataPriv.set( elem, "display", display );
  7517. }
  7518. }
  7519. }
  7520. // Set the display of the elements in a second loop to avoid constant reflow
  7521. for ( index = 0; index < length; index++ ) {
  7522. if ( values[ index ] != null ) {
  7523. elements[ index ].style.display = values[ index ];
  7524. }
  7525. }
  7526. return elements;
  7527. }
  7528. jQuery.fn.extend( {
  7529. show: function() {
  7530. return showHide( this, true );
  7531. },
  7532. hide: function() {
  7533. return showHide( this );
  7534. },
  7535. toggle: function( state ) {
  7536. if ( typeof state === "boolean" ) {
  7537. return state ? this.show() : this.hide();
  7538. }
  7539. return this.each( function() {
  7540. if ( isHiddenWithinTree( this ) ) {
  7541. jQuery( this ).show();
  7542. } else {
  7543. jQuery( this ).hide();
  7544. }
  7545. } );
  7546. }
  7547. } );
  7548. var rcheckableType = ( /^(?:checkbox|radio)$/i );
  7549. var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
  7550. var rscriptType = ( /^$|\/(?:java|ecma)script/i );
  7551. // We have to close these tags to support XHTML (#13200)
  7552. var wrapMap = {
  7553. // Support: IE <=9 only
  7554. option: [ 1, "<select multiple='multiple'>", "</select>" ],
  7555. // XHTML parsers do not magically insert elements in the
  7556. // same way that tag soup parsers do. So we cannot shorten
  7557. // this by omitting <tbody> or other required elements.
  7558. thead: [ 1, "<table>", "</table>" ],
  7559. col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
  7560. tr: [ 2, "<table><tbody>", "</tbody></table>" ],
  7561. td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
  7562. _default: [ 0, "", "" ]
  7563. };
  7564. // Support: IE <=9 only
  7565. wrapMap.optgroup = wrapMap.option;
  7566. wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  7567. wrapMap.th = wrapMap.td;
  7568. function getAll( context, tag ) {
  7569. // Support: IE <=9 - 11 only
  7570. // Use typeof to avoid zero-argument method invocation on host objects (#15151)
  7571. var ret;
  7572. if ( typeof context.getElementsByTagName !== "undefined" ) {
  7573. ret = context.getElementsByTagName( tag || "*" );
  7574. } else if ( typeof context.querySelectorAll !== "undefined" ) {
  7575. ret = context.querySelectorAll( tag || "*" );
  7576. } else {
  7577. ret = [];
  7578. }
  7579. if ( tag === undefined || tag && jQuery.nodeName( context, tag ) ) {
  7580. return jQuery.merge( [ context ], ret );
  7581. }
  7582. return ret;
  7583. }
  7584. // Mark scripts as having already been evaluated
  7585. function setGlobalEval( elems, refElements ) {
  7586. var i = 0,
  7587. l = elems.length;
  7588. for ( ; i < l; i++ ) {
  7589. dataPriv.set(
  7590. elems[ i ],
  7591. "globalEval",
  7592. !refElements || dataPriv.get( refElements[ i ], "globalEval" )
  7593. );
  7594. }
  7595. }
  7596. var rhtml = /<|&#?\w+;/;
  7597. function buildFragment( elems, context, scripts, selection, ignored ) {
  7598. var elem, tmp, tag, wrap, contains, j,
  7599. fragment = context.createDocumentFragment(),
  7600. nodes = [],
  7601. i = 0,
  7602. l = elems.length;
  7603. for ( ; i < l; i++ ) {
  7604. elem = elems[ i ];
  7605. if ( elem || elem === 0 ) {
  7606. // Add nodes directly
  7607. if ( jQuery.type( elem ) === "object" ) {
  7608. // Support: Android <=4.0 only, PhantomJS 1 only
  7609. // push.apply(_, arraylike) throws on ancient WebKit
  7610. jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
  7611. // Convert non-html into a text node
  7612. } else if ( !rhtml.test( elem ) ) {
  7613. nodes.push( context.createTextNode( elem ) );
  7614. // Convert html into DOM nodes
  7615. } else {
  7616. tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
  7617. // Deserialize a standard representation
  7618. tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
  7619. wrap = wrapMap[ tag ] || wrapMap._default;
  7620. tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
  7621. // Descend through wrappers to the right content
  7622. j = wrap[ 0 ];
  7623. while ( j-- ) {
  7624. tmp = tmp.lastChild;
  7625. }
  7626. // Support: Android <=4.0 only, PhantomJS 1 only
  7627. // push.apply(_, arraylike) throws on ancient WebKit
  7628. jQuery.merge( nodes, tmp.childNodes );
  7629. // Remember the top-level container
  7630. tmp = fragment.firstChild;
  7631. // Ensure the created nodes are orphaned (#12392)
  7632. tmp.textContent = "";
  7633. }
  7634. }
  7635. }
  7636. // Remove wrapper from fragment
  7637. fragment.textContent = "";
  7638. i = 0;
  7639. while ( ( elem = nodes[ i++ ] ) ) {
  7640. // Skip elements already in the context collection (trac-4087)
  7641. if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
  7642. if ( ignored ) {
  7643. ignored.push( elem );
  7644. }
  7645. continue;
  7646. }
  7647. contains = jQuery.contains( elem.ownerDocument, elem );
  7648. // Append to fragment
  7649. tmp = getAll( fragment.appendChild( elem ), "script" );
  7650. // Preserve script evaluation history
  7651. if ( contains ) {
  7652. setGlobalEval( tmp );
  7653. }
  7654. // Capture executables
  7655. if ( scripts ) {
  7656. j = 0;
  7657. while ( ( elem = tmp[ j++ ] ) ) {
  7658. if ( rscriptType.test( elem.type || "" ) ) {
  7659. scripts.push( elem );
  7660. }
  7661. }
  7662. }
  7663. }
  7664. return fragment;
  7665. }
  7666. ( function() {
  7667. var fragment = document.createDocumentFragment(),
  7668. div = fragment.appendChild( document.createElement( "div" ) ),
  7669. input = document.createElement( "input" );
  7670. // Support: Android 4.0 - 4.3 only
  7671. // Check state lost if the name is set (#11217)
  7672. // Support: Windows Web Apps (WWA)
  7673. // `name` and `type` must use .setAttribute for WWA (#14901)
  7674. input.setAttribute( "type", "radio" );
  7675. input.setAttribute( "checked", "checked" );
  7676. input.setAttribute( "name", "t" );
  7677. div.appendChild( input );
  7678. // Support: Android <=4.1 only
  7679. // Older WebKit doesn't clone checked state correctly in fragments
  7680. support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
  7681. // Support: IE <=11 only
  7682. // Make sure textarea (and checkbox) defaultValue is properly cloned
  7683. div.innerHTML = "<textarea>x</textarea>";
  7684. support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
  7685. } )();
  7686. var documentElement = document.documentElement;
  7687. var
  7688. rkeyEvent = /^key/,
  7689. rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
  7690. rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
  7691. function returnTrue() {
  7692. return true;
  7693. }
  7694. function returnFalse() {
  7695. return false;
  7696. }
  7697. // Support: IE <=9 only
  7698. // See #13393 for more info
  7699. function safeActiveElement() {
  7700. try {
  7701. return document.activeElement;
  7702. } catch ( err ) { }
  7703. }
  7704. function on( elem, types, selector, data, fn, one ) {
  7705. var origFn, type;
  7706. // Types can be a map of types/handlers
  7707. if ( typeof types === "object" ) {
  7708. // ( types-Object, selector, data )
  7709. if ( typeof selector !== "string" ) {
  7710. // ( types-Object, data )
  7711. data = data || selector;
  7712. selector = undefined;
  7713. }
  7714. for ( type in types ) {
  7715. on( elem, type, selector, data, types[ type ], one );
  7716. }
  7717. return elem;
  7718. }
  7719. if ( data == null && fn == null ) {
  7720. // ( types, fn )
  7721. fn = selector;
  7722. data = selector = undefined;
  7723. } else if ( fn == null ) {
  7724. if ( typeof selector === "string" ) {
  7725. // ( types, selector, fn )
  7726. fn = data;
  7727. data = undefined;
  7728. } else {
  7729. // ( types, data, fn )
  7730. fn = data;
  7731. data = selector;
  7732. selector = undefined;
  7733. }
  7734. }
  7735. if ( fn === false ) {
  7736. fn = returnFalse;
  7737. } else if ( !fn ) {
  7738. return elem;
  7739. }
  7740. if ( one === 1 ) {
  7741. origFn = fn;
  7742. fn = function( event ) {
  7743. // Can use an empty set, since event contains the info
  7744. jQuery().off( event );
  7745. return origFn.apply( this, arguments );
  7746. };
  7747. // Use same guid so caller can remove using origFn
  7748. fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
  7749. }
  7750. return elem.each( function() {
  7751. jQuery.event.add( this, types, fn, data, selector );
  7752. } );
  7753. }
  7754. /*
  7755. * Helper functions for managing events -- not part of the public interface.
  7756. * Props to Dean Edwards' addEvent library for many of the ideas.
  7757. */
  7758. jQuery.event = {
  7759. global: {},
  7760. add: function( elem, types, handler, data, selector ) {
  7761. var handleObjIn, eventHandle, tmp,
  7762. events, t, handleObj,
  7763. special, handlers, type, namespaces, origType,
  7764. elemData = dataPriv.get( elem );
  7765. // Don't attach events to noData or text/comment nodes (but allow plain objects)
  7766. if ( !elemData ) {
  7767. return;
  7768. }
  7769. // Caller can pass in an object of custom data in lieu of the handler
  7770. if ( handler.handler ) {
  7771. handleObjIn = handler;
  7772. handler = handleObjIn.handler;
  7773. selector = handleObjIn.selector;
  7774. }
  7775. // Ensure that invalid selectors throw exceptions at attach time
  7776. // Evaluate against documentElement in case elem is a non-element node (e.g., document)
  7777. if ( selector ) {
  7778. jQuery.find.matchesSelector( documentElement, selector );
  7779. }
  7780. // Make sure that the handler has a unique ID, used to find/remove it later
  7781. if ( !handler.guid ) {
  7782. handler.guid = jQuery.guid++;
  7783. }
  7784. // Init the element's event structure and main handler, if this is the first
  7785. if ( !( events = elemData.events ) ) {
  7786. events = elemData.events = {};
  7787. }
  7788. if ( !( eventHandle = elemData.handle ) ) {
  7789. eventHandle = elemData.handle = function( e ) {
  7790. // Discard the second event of a jQuery.event.trigger() and
  7791. // when an event is called after a page has unloaded
  7792. return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
  7793. jQuery.event.dispatch.apply( elem, arguments ) : undefined;
  7794. };
  7795. }
  7796. // Handle multiple events separated by a space
  7797. types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
  7798. t = types.length;
  7799. while ( t-- ) {
  7800. tmp = rtypenamespace.exec( types[ t ] ) || [];
  7801. type = origType = tmp[ 1 ];
  7802. namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
  7803. // There *must* be a type, no attaching namespace-only handlers
  7804. if ( !type ) {
  7805. continue;
  7806. }
  7807. // If event changes its type, use the special event handlers for the changed type
  7808. special = jQuery.event.special[ type ] || {};
  7809. // If selector defined, determine special event api type, otherwise given type
  7810. type = ( selector ? special.delegateType : special.bindType ) || type;
  7811. // Update special based on newly reset type
  7812. special = jQuery.event.special[ type ] || {};
  7813. // handleObj is passed to all event handlers
  7814. handleObj = jQuery.extend( {
  7815. type: type,
  7816. origType: origType,
  7817. data: data,
  7818. handler: handler,
  7819. guid: handler.guid,
  7820. selector: selector,
  7821. needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
  7822. namespace: namespaces.join( "." )
  7823. }, handleObjIn );
  7824. // Init the event handler queue if we're the first
  7825. if ( !( handlers = events[ type ] ) ) {
  7826. handlers = events[ type ] = [];
  7827. handlers.delegateCount = 0;
  7828. // Only use addEventListener if the special events handler returns false
  7829. if ( !special.setup ||
  7830. special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
  7831. if ( elem.addEventListener ) {
  7832. elem.addEventListener( type, eventHandle );
  7833. }
  7834. }
  7835. }
  7836. if ( special.add ) {
  7837. special.add.call( elem, handleObj );
  7838. if ( !handleObj.handler.guid ) {
  7839. handleObj.handler.guid = handler.guid;
  7840. }
  7841. }
  7842. // Add to the element's handler list, delegates in front
  7843. if ( selector ) {
  7844. handlers.splice( handlers.delegateCount++, 0, handleObj );
  7845. } else {
  7846. handlers.push( handleObj );
  7847. }
  7848. // Keep track of which events have ever been used, for event optimization
  7849. jQuery.event.global[ type ] = true;
  7850. }
  7851. },
  7852. // Detach an event or set of events from an element
  7853. remove: function( elem, types, handler, selector, mappedTypes ) {
  7854. var j, origCount, tmp,
  7855. events, t, handleObj,
  7856. special, handlers, type, namespaces, origType,
  7857. elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
  7858. if ( !elemData || !( events = elemData.events ) ) {
  7859. return;
  7860. }
  7861. // Once for each type.namespace in types; type may be omitted
  7862. types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
  7863. t = types.length;
  7864. while ( t-- ) {
  7865. tmp = rtypenamespace.exec( types[ t ] ) || [];
  7866. type = origType = tmp[ 1 ];
  7867. namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
  7868. // Unbind all events (on this namespace, if provided) for the element
  7869. if ( !type ) {
  7870. for ( type in events ) {
  7871. jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
  7872. }
  7873. continue;
  7874. }
  7875. special = jQuery.event.special[ type ] || {};
  7876. type = ( selector ? special.delegateType : special.bindType ) || type;
  7877. handlers = events[ type ] || [];
  7878. tmp = tmp[ 2 ] &&
  7879. new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
  7880. // Remove matching events
  7881. origCount = j = handlers.length;
  7882. while ( j-- ) {
  7883. handleObj = handlers[ j ];
  7884. if ( ( mappedTypes || origType === handleObj.origType ) &&
  7885. ( !handler || handler.guid === handleObj.guid ) &&
  7886. ( !tmp || tmp.test( handleObj.namespace ) ) &&
  7887. ( !selector || selector === handleObj.selector ||
  7888. selector === "**" && handleObj.selector ) ) {
  7889. handlers.splice( j, 1 );
  7890. if ( handleObj.selector ) {
  7891. handlers.delegateCount--;
  7892. }
  7893. if ( special.remove ) {
  7894. special.remove.call( elem, handleObj );
  7895. }
  7896. }
  7897. }
  7898. // Remove generic event handler if we removed something and no more handlers exist
  7899. // (avoids potential for endless recursion during removal of special event handlers)
  7900. if ( origCount && !handlers.length ) {
  7901. if ( !special.teardown ||
  7902. special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
  7903. jQuery.removeEvent( elem, type, elemData.handle );
  7904. }
  7905. delete events[ type ];
  7906. }
  7907. }
  7908. // Remove data and the expando if it's no longer used
  7909. if ( jQuery.isEmptyObject( events ) ) {
  7910. dataPriv.remove( elem, "handle events" );
  7911. }
  7912. },
  7913. dispatch: function( nativeEvent ) {
  7914. // Make a writable jQuery.Event from the native event object
  7915. var event = jQuery.event.fix( nativeEvent );
  7916. var i, j, ret, matched, handleObj, handlerQueue,
  7917. args = new Array( arguments.length ),
  7918. handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
  7919. special = jQuery.event.special[ event.type ] || {};
  7920. // Use the fix-ed jQuery.Event rather than the (read-only) native event
  7921. args[ 0 ] = event;
  7922. for ( i = 1; i < arguments.length; i++ ) {
  7923. args[ i ] = arguments[ i ];
  7924. }
  7925. event.delegateTarget = this;
  7926. // Call the preDispatch hook for the mapped type, and let it bail if desired
  7927. if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
  7928. return;
  7929. }
  7930. // Determine handlers
  7931. handlerQueue = jQuery.event.handlers.call( this, event, handlers );
  7932. // Run delegates first; they may want to stop propagation beneath us
  7933. i = 0;
  7934. while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
  7935. event.currentTarget = matched.elem;
  7936. j = 0;
  7937. while ( ( handleObj = matched.handlers[ j++ ] ) &&
  7938. !event.isImmediatePropagationStopped() ) {
  7939. // Triggered event must either 1) have no namespace, or 2) have namespace(s)
  7940. // a subset or equal to those in the bound event (both can have no namespace).
  7941. if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
  7942. event.handleObj = handleObj;
  7943. event.data = handleObj.data;
  7944. ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
  7945. handleObj.handler ).apply( matched.elem, args );
  7946. if ( ret !== undefined ) {
  7947. if ( ( event.result = ret ) === false ) {
  7948. event.preventDefault();
  7949. event.stopPropagation();
  7950. }
  7951. }
  7952. }
  7953. }
  7954. }
  7955. // Call the postDispatch hook for the mapped type
  7956. if ( special.postDispatch ) {
  7957. special.postDispatch.call( this, event );
  7958. }
  7959. return event.result;
  7960. },
  7961. handlers: function( event, handlers ) {
  7962. var i, handleObj, sel, matchedHandlers, matchedSelectors,
  7963. handlerQueue = [],
  7964. delegateCount = handlers.delegateCount,
  7965. cur = event.target;
  7966. // Find delegate handlers
  7967. if ( delegateCount &&
  7968. // Support: IE <=9
  7969. // Black-hole SVG <use> instance trees (trac-13180)
  7970. cur.nodeType &&
  7971. // Support: Firefox <=42
  7972. // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
  7973. // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
  7974. // Support: IE 11 only
  7975. // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
  7976. !( event.type === "click" && event.button >= 1 ) ) {
  7977. for ( ; cur !== this; cur = cur.parentNode || this ) {
  7978. // Don't check non-elements (#13208)
  7979. // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
  7980. if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
  7981. matchedHandlers = [];
  7982. matchedSelectors = {};
  7983. for ( i = 0; i < delegateCount; i++ ) {
  7984. handleObj = handlers[ i ];
  7985. // Don't conflict with Object.prototype properties (#13203)
  7986. sel = handleObj.selector + " ";
  7987. if ( matchedSelectors[ sel ] === undefined ) {
  7988. matchedSelectors[ sel ] = handleObj.needsContext ?
  7989. jQuery( sel, this ).index( cur ) > -1 :
  7990. jQuery.find( sel, this, null, [ cur ] ).length;
  7991. }
  7992. if ( matchedSelectors[ sel ] ) {
  7993. matchedHandlers.push( handleObj );
  7994. }
  7995. }
  7996. if ( matchedHandlers.length ) {
  7997. handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
  7998. }
  7999. }
  8000. }
  8001. }
  8002. // Add the remaining (directly-bound) handlers
  8003. cur = this;
  8004. if ( delegateCount < handlers.length ) {
  8005. handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
  8006. }
  8007. return handlerQueue;
  8008. },
  8009. addProp: function( name, hook ) {
  8010. Object.defineProperty( jQuery.Event.prototype, name, {
  8011. enumerable: true,
  8012. configurable: true,
  8013. get: jQuery.isFunction( hook ) ?
  8014. function() {
  8015. if ( this.originalEvent ) {
  8016. return hook( this.originalEvent );
  8017. }
  8018. } :
  8019. function() {
  8020. if ( this.originalEvent ) {
  8021. return this.originalEvent[ name ];
  8022. }
  8023. },
  8024. set: function( value ) {
  8025. Object.defineProperty( this, name, {
  8026. enumerable: true,
  8027. configurable: true,
  8028. writable: true,
  8029. value: value
  8030. } );
  8031. }
  8032. } );
  8033. },
  8034. fix: function( originalEvent ) {
  8035. return originalEvent[ jQuery.expando ] ?
  8036. originalEvent :
  8037. new jQuery.Event( originalEvent );
  8038. },
  8039. special: {
  8040. load: {
  8041. // Prevent triggered image.load events from bubbling to window.load
  8042. noBubble: true
  8043. },
  8044. focus: {
  8045. // Fire native event if possible so blur/focus sequence is correct
  8046. trigger: function() {
  8047. if ( this !== safeActiveElement() && this.focus ) {
  8048. this.focus();
  8049. return false;
  8050. }
  8051. },
  8052. delegateType: "focusin"
  8053. },
  8054. blur: {
  8055. trigger: function() {
  8056. if ( this === safeActiveElement() && this.blur ) {
  8057. this.blur();
  8058. return false;
  8059. }
  8060. },
  8061. delegateType: "focusout"
  8062. },
  8063. click: {
  8064. // For checkbox, fire native event so checked state will be right
  8065. trigger: function() {
  8066. if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
  8067. this.click();
  8068. return false;
  8069. }
  8070. },
  8071. // For cross-browser consistency, don't fire native .click() on links
  8072. _default: function( event ) {
  8073. return jQuery.nodeName( event.target, "a" );
  8074. }
  8075. },
  8076. beforeunload: {
  8077. postDispatch: function( event ) {
  8078. // Support: Firefox 20+
  8079. // Firefox doesn't alert if the returnValue field is not set.
  8080. if ( event.result !== undefined && event.originalEvent ) {
  8081. event.originalEvent.returnValue = event.result;
  8082. }
  8083. }
  8084. }
  8085. }
  8086. };
  8087. jQuery.removeEvent = function( elem, type, handle ) {
  8088. // This "if" is needed for plain objects
  8089. if ( elem.removeEventListener ) {
  8090. elem.removeEventListener( type, handle );
  8091. }
  8092. };
  8093. jQuery.Event = function( src, props ) {
  8094. // Allow instantiation without the 'new' keyword
  8095. if ( !( this instanceof jQuery.Event ) ) {
  8096. return new jQuery.Event( src, props );
  8097. }
  8098. // Event object
  8099. if ( src && src.type ) {
  8100. this.originalEvent = src;
  8101. this.type = src.type;
  8102. // Events bubbling up the document may have been marked as prevented
  8103. // by a handler lower down the tree; reflect the correct value.
  8104. this.isDefaultPrevented = src.defaultPrevented ||
  8105. src.defaultPrevented === undefined &&
  8106. // Support: Android <=2.3 only
  8107. src.returnValue === false ?
  8108. returnTrue :
  8109. returnFalse;
  8110. // Create target properties
  8111. // Support: Safari <=6 - 7 only
  8112. // Target should not be a text node (#504, #13143)
  8113. this.target = ( src.target && src.target.nodeType === 3 ) ?
  8114. src.target.parentNode :
  8115. src.target;
  8116. this.currentTarget = src.currentTarget;
  8117. this.relatedTarget = src.relatedTarget;
  8118. // Event type
  8119. } else {
  8120. this.type = src;
  8121. }
  8122. // Put explicitly provided properties onto the event object
  8123. if ( props ) {
  8124. jQuery.extend( this, props );
  8125. }
  8126. // Create a timestamp if incoming event doesn't have one
  8127. this.timeStamp = src && src.timeStamp || jQuery.now();
  8128. // Mark it as fixed
  8129. this[ jQuery.expando ] = true;
  8130. };
  8131. // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  8132. // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  8133. jQuery.Event.prototype = {
  8134. constructor: jQuery.Event,
  8135. isDefaultPrevented: returnFalse,
  8136. isPropagationStopped: returnFalse,
  8137. isImmediatePropagationStopped: returnFalse,
  8138. isSimulated: false,
  8139. preventDefault: function() {
  8140. var e = this.originalEvent;
  8141. this.isDefaultPrevented = returnTrue;
  8142. if ( e && !this.isSimulated ) {
  8143. e.preventDefault();
  8144. }
  8145. },
  8146. stopPropagation: function() {
  8147. var e = this.originalEvent;
  8148. this.isPropagationStopped = returnTrue;
  8149. if ( e && !this.isSimulated ) {
  8150. e.stopPropagation();
  8151. }
  8152. },
  8153. stopImmediatePropagation: function() {
  8154. var e = this.originalEvent;
  8155. this.isImmediatePropagationStopped = returnTrue;
  8156. if ( e && !this.isSimulated ) {
  8157. e.stopImmediatePropagation();
  8158. }
  8159. this.stopPropagation();
  8160. }
  8161. };
  8162. // Includes all common event props including KeyEvent and MouseEvent specific props
  8163. jQuery.each( {
  8164. altKey: true,
  8165. bubbles: true,
  8166. cancelable: true,
  8167. changedTouches: true,
  8168. ctrlKey: true,
  8169. detail: true,
  8170. eventPhase: true,
  8171. metaKey: true,
  8172. pageX: true,
  8173. pageY: true,
  8174. shiftKey: true,
  8175. view: true,
  8176. "char": true,
  8177. charCode: true,
  8178. key: true,
  8179. keyCode: true,
  8180. button: true,
  8181. buttons: true,
  8182. clientX: true,
  8183. clientY: true,
  8184. offsetX: true,
  8185. offsetY: true,
  8186. pointerId: true,
  8187. pointerType: true,
  8188. screenX: true,
  8189. screenY: true,
  8190. targetTouches: true,
  8191. toElement: true,
  8192. touches: true,
  8193. which: function( event ) {
  8194. var button = event.button;
  8195. // Add which for key events
  8196. if ( event.which == null && rkeyEvent.test( event.type ) ) {
  8197. return event.charCode != null ? event.charCode : event.keyCode;
  8198. }
  8199. // Add which for click: 1 === left; 2 === middle; 3 === right
  8200. if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
  8201. if ( button & 1 ) {
  8202. return 1;
  8203. }
  8204. if ( button & 2 ) {
  8205. return 3;
  8206. }
  8207. if ( button & 4 ) {
  8208. return 2;
  8209. }
  8210. return 0;
  8211. }
  8212. return event.which;
  8213. }
  8214. }, jQuery.event.addProp );
  8215. // Create mouseenter/leave events using mouseover/out and event-time checks
  8216. // so that event delegation works in jQuery.
  8217. // Do the same for pointerenter/pointerleave and pointerover/pointerout
  8218. //
  8219. // Support: Safari 7 only
  8220. // Safari sends mouseenter too often; see:
  8221. // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
  8222. // for the description of the bug (it existed in older Chrome versions as well).
  8223. jQuery.each( {
  8224. mouseenter: "mouseover",
  8225. mouseleave: "mouseout",
  8226. pointerenter: "pointerover",
  8227. pointerleave: "pointerout"
  8228. }, function( orig, fix ) {
  8229. jQuery.event.special[ orig ] = {
  8230. delegateType: fix,
  8231. bindType: fix,
  8232. handle: function( event ) {
  8233. var ret,
  8234. target = this,
  8235. related = event.relatedTarget,
  8236. handleObj = event.handleObj;
  8237. // For mouseenter/leave call the handler if related is outside the target.
  8238. // NB: No relatedTarget if the mouse left/entered the browser window
  8239. if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
  8240. event.type = handleObj.origType;
  8241. ret = handleObj.handler.apply( this, arguments );
  8242. event.type = fix;
  8243. }
  8244. return ret;
  8245. }
  8246. };
  8247. } );
  8248. jQuery.fn.extend( {
  8249. on: function( types, selector, data, fn ) {
  8250. return on( this, types, selector, data, fn );
  8251. },
  8252. one: function( types, selector, data, fn ) {
  8253. return on( this, types, selector, data, fn, 1 );
  8254. },
  8255. off: function( types, selector, fn ) {
  8256. var handleObj, type;
  8257. if ( types && types.preventDefault && types.handleObj ) {
  8258. // ( event ) dispatched jQuery.Event
  8259. handleObj = types.handleObj;
  8260. jQuery( types.delegateTarget ).off(
  8261. handleObj.namespace ?
  8262. handleObj.origType + "." + handleObj.namespace :
  8263. handleObj.origType,
  8264. handleObj.selector,
  8265. handleObj.handler
  8266. );
  8267. return this;
  8268. }
  8269. if ( typeof types === "object" ) {
  8270. // ( types-object [, selector] )
  8271. for ( type in types ) {
  8272. this.off( type, selector, types[ type ] );
  8273. }
  8274. return this;
  8275. }
  8276. if ( selector === false || typeof selector === "function" ) {
  8277. // ( types [, fn] )
  8278. fn = selector;
  8279. selector = undefined;
  8280. }
  8281. if ( fn === false ) {
  8282. fn = returnFalse;
  8283. }
  8284. return this.each( function() {
  8285. jQuery.event.remove( this, types, fn, selector );
  8286. } );
  8287. }
  8288. } );
  8289. var
  8290. /* eslint-disable max-len */
  8291. // See https://github.com/eslint/eslint/issues/3229
  8292. rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
  8293. /* eslint-enable */
  8294. // Support: IE <=10 - 11, Edge 12 - 13
  8295. // In IE/Edge using regex groups here causes severe slowdowns.
  8296. // See https://connect.microsoft.com/IE/feedback/details/1736512/
  8297. rnoInnerhtml = /<script|<style|<link/i,
  8298. // checked="checked" or checked
  8299. rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
  8300. rscriptTypeMasked = /^true\/(.*)/,
  8301. rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
  8302. function manipulationTarget( elem, content ) {
  8303. if ( jQuery.nodeName( elem, "table" ) &&
  8304. jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
  8305. return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
  8306. }
  8307. return elem;
  8308. }
  8309. // Replace/restore the type attribute of script elements for safe DOM manipulation
  8310. function disableScript( elem ) {
  8311. elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
  8312. return elem;
  8313. }
  8314. function restoreScript( elem ) {
  8315. var match = rscriptTypeMasked.exec( elem.type );
  8316. if ( match ) {
  8317. elem.type = match[ 1 ];
  8318. } else {
  8319. elem.removeAttribute( "type" );
  8320. }
  8321. return elem;
  8322. }
  8323. function cloneCopyEvent( src, dest ) {
  8324. var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
  8325. if ( dest.nodeType !== 1 ) {
  8326. return;
  8327. }
  8328. // 1. Copy private data: events, handlers, etc.
  8329. if ( dataPriv.hasData( src ) ) {
  8330. pdataOld = dataPriv.access( src );
  8331. pdataCur = dataPriv.set( dest, pdataOld );
  8332. events = pdataOld.events;
  8333. if ( events ) {
  8334. delete pdataCur.handle;
  8335. pdataCur.events = {};
  8336. for ( type in events ) {
  8337. for ( i = 0, l = events[ type ].length; i < l; i++ ) {
  8338. jQuery.event.add( dest, type, events[ type ][ i ] );
  8339. }
  8340. }
  8341. }
  8342. }
  8343. // 2. Copy user data
  8344. if ( dataUser.hasData( src ) ) {
  8345. udataOld = dataUser.access( src );
  8346. udataCur = jQuery.extend( {}, udataOld );
  8347. dataUser.set( dest, udataCur );
  8348. }
  8349. }
  8350. // Fix IE bugs, see support tests
  8351. function fixInput( src, dest ) {
  8352. var nodeName = dest.nodeName.toLowerCase();
  8353. // Fails to persist the checked state of a cloned checkbox or radio button.
  8354. if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
  8355. dest.checked = src.checked;
  8356. // Fails to return the selected option to the default selected state when cloning options
  8357. } else if ( nodeName === "input" || nodeName === "textarea" ) {
  8358. dest.defaultValue = src.defaultValue;
  8359. }
  8360. }
  8361. function domManip( collection, args, callback, ignored ) {
  8362. // Flatten any nested arrays
  8363. args = concat.apply( [], args );
  8364. var fragment, first, scripts, hasScripts, node, doc,
  8365. i = 0,
  8366. l = collection.length,
  8367. iNoClone = l - 1,
  8368. value = args[ 0 ],
  8369. isFunction = jQuery.isFunction( value );
  8370. // We can't cloneNode fragments that contain checked, in WebKit
  8371. if ( isFunction ||
  8372. ( l > 1 && typeof value === "string" &&
  8373. !support.checkClone && rchecked.test( value ) ) ) {
  8374. return collection.each( function( index ) {
  8375. var self = collection.eq( index );
  8376. if ( isFunction ) {
  8377. args[ 0 ] = value.call( this, index, self.html() );
  8378. }
  8379. domManip( self, args, callback, ignored );
  8380. } );
  8381. }
  8382. if ( l ) {
  8383. fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
  8384. first = fragment.firstChild;
  8385. if ( fragment.childNodes.length === 1 ) {
  8386. fragment = first;
  8387. }
  8388. // Require either new content or an interest in ignored elements to invoke the callback
  8389. if ( first || ignored ) {
  8390. scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
  8391. hasScripts = scripts.length;
  8392. // Use the original fragment for the last item
  8393. // instead of the first because it can end up
  8394. // being emptied incorrectly in certain situations (#8070).
  8395. for ( ; i < l; i++ ) {
  8396. node = fragment;
  8397. if ( i !== iNoClone ) {
  8398. node = jQuery.clone( node, true, true );
  8399. // Keep references to cloned scripts for later restoration
  8400. if ( hasScripts ) {
  8401. // Support: Android <=4.0 only, PhantomJS 1 only
  8402. // push.apply(_, arraylike) throws on ancient WebKit
  8403. jQuery.merge( scripts, getAll( node, "script" ) );
  8404. }
  8405. }
  8406. callback.call( collection[ i ], node, i );
  8407. }
  8408. if ( hasScripts ) {
  8409. doc = scripts[ scripts.length - 1 ].ownerDocument;
  8410. // Reenable scripts
  8411. jQuery.map( scripts, restoreScript );
  8412. // Evaluate executable scripts on first document insertion
  8413. for ( i = 0; i < hasScripts; i++ ) {
  8414. node = scripts[ i ];
  8415. if ( rscriptType.test( node.type || "" ) &&
  8416. !dataPriv.access( node, "globalEval" ) &&
  8417. jQuery.contains( doc, node ) ) {
  8418. if ( node.src ) {
  8419. // Optional AJAX dependency, but won't run scripts if not present
  8420. if ( jQuery._evalUrl ) {
  8421. jQuery._evalUrl( node.src );
  8422. }
  8423. } else {
  8424. DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
  8425. }
  8426. }
  8427. }
  8428. }
  8429. }
  8430. }
  8431. return collection;
  8432. }
  8433. function remove( elem, selector, keepData ) {
  8434. var node,
  8435. nodes = selector ? jQuery.filter( selector, elem ) : elem,
  8436. i = 0;
  8437. for ( ; ( node = nodes[ i ] ) != null; i++ ) {
  8438. if ( !keepData && node.nodeType === 1 ) {
  8439. jQuery.cleanData( getAll( node ) );
  8440. }
  8441. if ( node.parentNode ) {
  8442. if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
  8443. setGlobalEval( getAll( node, "script" ) );
  8444. }
  8445. node.parentNode.removeChild( node );
  8446. }
  8447. }
  8448. return elem;
  8449. }
  8450. jQuery.extend( {
  8451. htmlPrefilter: function( html ) {
  8452. return html.replace( rxhtmlTag, "<$1></$2>" );
  8453. },
  8454. clone: function( elem, dataAndEvents, deepDataAndEvents ) {
  8455. var i, l, srcElements, destElements,
  8456. clone = elem.cloneNode( true ),
  8457. inPage = jQuery.contains( elem.ownerDocument, elem );
  8458. // Fix IE cloning issues
  8459. if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
  8460. !jQuery.isXMLDoc( elem ) ) {
  8461. // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
  8462. destElements = getAll( clone );
  8463. srcElements = getAll( elem );
  8464. for ( i = 0, l = srcElements.length; i < l; i++ ) {
  8465. fixInput( srcElements[ i ], destElements[ i ] );
  8466. }
  8467. }
  8468. // Copy the events from the original to the clone
  8469. if ( dataAndEvents ) {
  8470. if ( deepDataAndEvents ) {
  8471. srcElements = srcElements || getAll( elem );
  8472. destElements = destElements || getAll( clone );
  8473. for ( i = 0, l = srcElements.length; i < l; i++ ) {
  8474. cloneCopyEvent( srcElements[ i ], destElements[ i ] );
  8475. }
  8476. } else {
  8477. cloneCopyEvent( elem, clone );
  8478. }
  8479. }
  8480. // Preserve script evaluation history
  8481. destElements = getAll( clone, "script" );
  8482. if ( destElements.length > 0 ) {
  8483. setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
  8484. }
  8485. // Return the cloned set
  8486. return clone;
  8487. },
  8488. cleanData: function( elems ) {
  8489. var data, elem, type,
  8490. special = jQuery.event.special,
  8491. i = 0;
  8492. for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
  8493. if ( acceptData( elem ) ) {
  8494. if ( ( data = elem[ dataPriv.expando ] ) ) {
  8495. if ( data.events ) {
  8496. for ( type in data.events ) {
  8497. if ( special[ type ] ) {
  8498. jQuery.event.remove( elem, type );
  8499. // This is a shortcut to avoid jQuery.event.remove's overhead
  8500. } else {
  8501. jQuery.removeEvent( elem, type, data.handle );
  8502. }
  8503. }
  8504. }
  8505. // Support: Chrome <=35 - 45+
  8506. // Assign undefined instead of using delete, see Data#remove
  8507. elem[ dataPriv.expando ] = undefined;
  8508. }
  8509. if ( elem[ dataUser.expando ] ) {
  8510. // Support: Chrome <=35 - 45+
  8511. // Assign undefined instead of using delete, see Data#remove
  8512. elem[ dataUser.expando ] = undefined;
  8513. }
  8514. }
  8515. }
  8516. }
  8517. } );
  8518. jQuery.fn.extend( {
  8519. detach: function( selector ) {
  8520. return remove( this, selector, true );
  8521. },
  8522. remove: function( selector ) {
  8523. return remove( this, selector );
  8524. },
  8525. text: function( value ) {
  8526. return access( this, function( value ) {
  8527. return value === undefined ?
  8528. jQuery.text( this ) :
  8529. this.empty().each( function() {
  8530. if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  8531. this.textContent = value;
  8532. }
  8533. } );
  8534. }, null, value, arguments.length );
  8535. },
  8536. append: function() {
  8537. return domManip( this, arguments, function( elem ) {
  8538. if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  8539. var target = manipulationTarget( this, elem );
  8540. target.appendChild( elem );
  8541. }
  8542. } );
  8543. },
  8544. prepend: function() {
  8545. return domManip( this, arguments, function( elem ) {
  8546. if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  8547. var target = manipulationTarget( this, elem );
  8548. target.insertBefore( elem, target.firstChild );
  8549. }
  8550. } );
  8551. },
  8552. before: function() {
  8553. return domManip( this, arguments, function( elem ) {
  8554. if ( this.parentNode ) {
  8555. this.parentNode.insertBefore( elem, this );
  8556. }
  8557. } );
  8558. },
  8559. after: function() {
  8560. return domManip( this, arguments, function( elem ) {
  8561. if ( this.parentNode ) {
  8562. this.parentNode.insertBefore( elem, this.nextSibling );
  8563. }
  8564. } );
  8565. },
  8566. empty: function() {
  8567. var elem,
  8568. i = 0;
  8569. for ( ; ( elem = this[ i ] ) != null; i++ ) {
  8570. if ( elem.nodeType === 1 ) {
  8571. // Prevent memory leaks
  8572. jQuery.cleanData( getAll( elem, false ) );
  8573. // Remove any remaining nodes
  8574. elem.textContent = "";
  8575. }
  8576. }
  8577. return this;
  8578. },
  8579. clone: function( dataAndEvents, deepDataAndEvents ) {
  8580. dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
  8581. deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
  8582. return this.map( function() {
  8583. return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
  8584. } );
  8585. },
  8586. html: function( value ) {
  8587. return access( this, function( value ) {
  8588. var elem = this[ 0 ] || {},
  8589. i = 0,
  8590. l = this.length;
  8591. if ( value === undefined && elem.nodeType === 1 ) {
  8592. return elem.innerHTML;
  8593. }
  8594. // See if we can take a shortcut and just use innerHTML
  8595. if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
  8596. !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
  8597. value = jQuery.htmlPrefilter( value );
  8598. try {
  8599. for ( ; i < l; i++ ) {
  8600. elem = this[ i ] || {};
  8601. // Remove element nodes and prevent memory leaks
  8602. if ( elem.nodeType === 1 ) {
  8603. jQuery.cleanData( getAll( elem, false ) );
  8604. elem.innerHTML = value;
  8605. }
  8606. }
  8607. elem = 0;
  8608. // If using innerHTML throws an exception, use the fallback method
  8609. } catch ( e ) {}
  8610. }
  8611. if ( elem ) {
  8612. this.empty().append( value );
  8613. }
  8614. }, null, value, arguments.length );
  8615. },
  8616. replaceWith: function() {
  8617. var ignored = [];
  8618. // Make the changes, replacing each non-ignored context element with the new content
  8619. return domManip( this, arguments, function( elem ) {
  8620. var parent = this.parentNode;
  8621. if ( jQuery.inArray( this, ignored ) < 0 ) {
  8622. jQuery.cleanData( getAll( this ) );
  8623. if ( parent ) {
  8624. parent.replaceChild( elem, this );
  8625. }
  8626. }
  8627. // Force callback invocation
  8628. }, ignored );
  8629. }
  8630. } );
  8631. jQuery.each( {
  8632. appendTo: "append",
  8633. prependTo: "prepend",
  8634. insertBefore: "before",
  8635. insertAfter: "after",
  8636. replaceAll: "replaceWith"
  8637. }, function( name, original ) {
  8638. jQuery.fn[ name ] = function( selector ) {
  8639. var elems,
  8640. ret = [],
  8641. insert = jQuery( selector ),
  8642. last = insert.length - 1,
  8643. i = 0;
  8644. for ( ; i <= last; i++ ) {
  8645. elems = i === last ? this : this.clone( true );
  8646. jQuery( insert[ i ] )[ original ]( elems );
  8647. // Support: Android <=4.0 only, PhantomJS 1 only
  8648. // .get() because push.apply(_, arraylike) throws on ancient WebKit
  8649. push.apply( ret, elems.get() );
  8650. }
  8651. return this.pushStack( ret );
  8652. };
  8653. } );
  8654. var rmargin = ( /^margin/ );
  8655. var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
  8656. var getStyles = function( elem ) {
  8657. // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
  8658. // IE throws on elements created in popups
  8659. // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
  8660. var view = elem.ownerDocument.defaultView;
  8661. if ( !view || !view.opener ) {
  8662. view = window;
  8663. }
  8664. return view.getComputedStyle( elem );
  8665. };
  8666. ( function() {
  8667. // Executing both pixelPosition & boxSizingReliable tests require only one layout
  8668. // so they're executed at the same time to save the second computation.
  8669. function computeStyleTests() {
  8670. // This is a singleton, we need to execute it only once
  8671. if ( !div ) {
  8672. return;
  8673. }
  8674. div.style.cssText =
  8675. "box-sizing:border-box;" +
  8676. "position:relative;display:block;" +
  8677. "margin:auto;border:1px;padding:1px;" +
  8678. "top:1%;width:50%";
  8679. div.innerHTML = "";
  8680. documentElement.appendChild( container );
  8681. var divStyle = window.getComputedStyle( div );
  8682. pixelPositionVal = divStyle.top !== "1%";
  8683. // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
  8684. reliableMarginLeftVal = divStyle.marginLeft === "2px";
  8685. boxSizingReliableVal = divStyle.width === "4px";
  8686. // Support: Android 4.0 - 4.3 only
  8687. // Some styles come back with percentage values, even though they shouldn't
  8688. div.style.marginRight = "50%";
  8689. pixelMarginRightVal = divStyle.marginRight === "4px";
  8690. documentElement.removeChild( container );
  8691. // Nullify the div so it wouldn't be stored in the memory and
  8692. // it will also be a sign that checks already performed
  8693. div = null;
  8694. }
  8695. var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
  8696. container = document.createElement( "div" ),
  8697. div = document.createElement( "div" );
  8698. // Finish early in limited (non-browser) environments
  8699. if ( !div.style ) {
  8700. return;
  8701. }
  8702. // Support: IE <=9 - 11 only
  8703. // Style of cloned element affects source element cloned (#8908)
  8704. div.style.backgroundClip = "content-box";
  8705. div.cloneNode( true ).style.backgroundClip = "";
  8706. support.clearCloneStyle = div.style.backgroundClip === "content-box";
  8707. container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
  8708. "padding:0;margin-top:1px;position:absolute";
  8709. container.appendChild( div );
  8710. jQuery.extend( support, {
  8711. pixelPosition: function() {
  8712. computeStyleTests();
  8713. return pixelPositionVal;
  8714. },
  8715. boxSizingReliable: function() {
  8716. computeStyleTests();
  8717. return boxSizingReliableVal;
  8718. },
  8719. pixelMarginRight: function() {
  8720. computeStyleTests();
  8721. return pixelMarginRightVal;
  8722. },
  8723. reliableMarginLeft: function() {
  8724. computeStyleTests();
  8725. return reliableMarginLeftVal;
  8726. }
  8727. } );
  8728. } )();
  8729. function curCSS( elem, name, computed ) {
  8730. var width, minWidth, maxWidth, ret,
  8731. style = elem.style;
  8732. computed = computed || getStyles( elem );
  8733. // Support: IE <=9 only
  8734. // getPropertyValue is only needed for .css('filter') (#12537)
  8735. if ( computed ) {
  8736. ret = computed.getPropertyValue( name ) || computed[ name ];
  8737. if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
  8738. ret = jQuery.style( elem, name );
  8739. }
  8740. // A tribute to the "awesome hack by Dean Edwards"
  8741. // Android Browser returns percentage for some values,
  8742. // but width seems to be reliably pixels.
  8743. // This is against the CSSOM draft spec:
  8744. // https://drafts.csswg.org/cssom/#resolved-values
  8745. if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
  8746. // Remember the original values
  8747. width = style.width;
  8748. minWidth = style.minWidth;
  8749. maxWidth = style.maxWidth;
  8750. // Put in the new values to get a computed value out
  8751. style.minWidth = style.maxWidth = style.width = ret;
  8752. ret = computed.width;
  8753. // Revert the changed values
  8754. style.width = width;
  8755. style.minWidth = minWidth;
  8756. style.maxWidth = maxWidth;
  8757. }
  8758. }
  8759. return ret !== undefined ?
  8760. // Support: IE <=9 - 11 only
  8761. // IE returns zIndex value as an integer.
  8762. ret + "" :
  8763. ret;
  8764. }
  8765. function addGetHookIf( conditionFn, hookFn ) {
  8766. // Define the hook, we'll check on the first run if it's really needed.
  8767. return {
  8768. get: function() {
  8769. if ( conditionFn() ) {
  8770. // Hook not needed (or it's not possible to use it due
  8771. // to missing dependency), remove it.
  8772. delete this.get;
  8773. return;
  8774. }
  8775. // Hook needed; redefine it so that the support test is not executed again.
  8776. return ( this.get = hookFn ).apply( this, arguments );
  8777. }
  8778. };
  8779. }
  8780. var
  8781. // Swappable if display is none or starts with table
  8782. // except "table", "table-cell", or "table-caption"
  8783. // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
  8784. rdisplayswap = /^(none|table(?!-c[ea]).+)/,
  8785. cssShow = { position: "absolute", visibility: "hidden", display: "block" },
  8786. cssNormalTransform = {
  8787. letterSpacing: "0",
  8788. fontWeight: "400"
  8789. },
  8790. cssPrefixes = [ "Webkit", "Moz", "ms" ],
  8791. emptyStyle = document.createElement( "div" ).style;
  8792. // Return a css property mapped to a potentially vendor prefixed property
  8793. function vendorPropName( name ) {
  8794. // Shortcut for names that are not vendor prefixed
  8795. if ( name in emptyStyle ) {
  8796. return name;
  8797. }
  8798. // Check for vendor prefixed names
  8799. var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
  8800. i = cssPrefixes.length;
  8801. while ( i-- ) {
  8802. name = cssPrefixes[ i ] + capName;
  8803. if ( name in emptyStyle ) {
  8804. return name;
  8805. }
  8806. }
  8807. }
  8808. function setPositiveNumber( elem, value, subtract ) {
  8809. // Any relative (+/-) values have already been
  8810. // normalized at this point
  8811. var matches = rcssNum.exec( value );
  8812. return matches ?
  8813. // Guard against undefined "subtract", e.g., when used as in cssHooks
  8814. Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
  8815. value;
  8816. }
  8817. function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  8818. var i,
  8819. val = 0;
  8820. // If we already have the right measurement, avoid augmentation
  8821. if ( extra === ( isBorderBox ? "border" : "content" ) ) {
  8822. i = 4;
  8823. // Otherwise initialize for horizontal or vertical properties
  8824. } else {
  8825. i = name === "width" ? 1 : 0;
  8826. }
  8827. for ( ; i < 4; i += 2 ) {
  8828. // Both box models exclude margin, so add it if we want it
  8829. if ( extra === "margin" ) {
  8830. val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
  8831. }
  8832. if ( isBorderBox ) {
  8833. // border-box includes padding, so remove it if we want content
  8834. if ( extra === "content" ) {
  8835. val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
  8836. }
  8837. // At this point, extra isn't border nor margin, so remove border
  8838. if ( extra !== "margin" ) {
  8839. val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
  8840. }
  8841. } else {
  8842. // At this point, extra isn't content, so add padding
  8843. val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
  8844. // At this point, extra isn't content nor padding, so add border
  8845. if ( extra !== "padding" ) {
  8846. val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
  8847. }
  8848. }
  8849. }
  8850. return val;
  8851. }
  8852. function getWidthOrHeight( elem, name, extra ) {
  8853. // Start with offset property, which is equivalent to the border-box value
  8854. var val,
  8855. valueIsBorderBox = true,
  8856. styles = getStyles( elem ),
  8857. isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
  8858. // Support: IE <=11 only
  8859. // Running getBoundingClientRect on a disconnected node
  8860. // in IE throws an error.
  8861. if ( elem.getClientRects().length ) {
  8862. val = elem.getBoundingClientRect()[ name ];
  8863. }
  8864. // Some non-html elements return undefined for offsetWidth, so check for null/undefined
  8865. // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
  8866. // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
  8867. if ( val <= 0 || val == null ) {
  8868. // Fall back to computed then uncomputed css if necessary
  8869. val = curCSS( elem, name, styles );
  8870. if ( val < 0 || val == null ) {
  8871. val = elem.style[ name ];
  8872. }
  8873. // Computed unit is not pixels. Stop here and return.
  8874. if ( rnumnonpx.test( val ) ) {
  8875. return val;
  8876. }
  8877. // Check for style in case a browser which returns unreliable values
  8878. // for getComputedStyle silently falls back to the reliable elem.style
  8879. valueIsBorderBox = isBorderBox &&
  8880. ( support.boxSizingReliable() || val === elem.style[ name ] );
  8881. // Normalize "", auto, and prepare for extra
  8882. val = parseFloat( val ) || 0;
  8883. }
  8884. // Use the active box-sizing model to add/subtract irrelevant styles
  8885. return ( val +
  8886. augmentWidthOrHeight(
  8887. elem,
  8888. name,
  8889. extra || ( isBorderBox ? "border" : "content" ),
  8890. valueIsBorderBox,
  8891. styles
  8892. )
  8893. ) + "px";
  8894. }
  8895. jQuery.extend( {
  8896. // Add in style property hooks for overriding the default
  8897. // behavior of getting and setting a style property
  8898. cssHooks: {
  8899. opacity: {
  8900. get: function( elem, computed ) {
  8901. if ( computed ) {
  8902. // We should always get a number back from opacity
  8903. var ret = curCSS( elem, "opacity" );
  8904. return ret === "" ? "1" : ret;
  8905. }
  8906. }
  8907. }
  8908. },
  8909. // Don't automatically add "px" to these possibly-unitless properties
  8910. cssNumber: {
  8911. "animationIterationCount": true,
  8912. "columnCount": true,
  8913. "fillOpacity": true,
  8914. "flexGrow": true,
  8915. "flexShrink": true,
  8916. "fontWeight": true,
  8917. "lineHeight": true,
  8918. "opacity": true,
  8919. "order": true,
  8920. "orphans": true,
  8921. "widows": true,
  8922. "zIndex": true,
  8923. "zoom": true
  8924. },
  8925. // Add in properties whose names you wish to fix before
  8926. // setting or getting the value
  8927. cssProps: {
  8928. "float": "cssFloat"
  8929. },
  8930. // Get and set the style property on a DOM Node
  8931. style: function( elem, name, value, extra ) {
  8932. // Don't set styles on text and comment nodes
  8933. if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
  8934. return;
  8935. }
  8936. // Make sure that we're working with the right name
  8937. var ret, type, hooks,
  8938. origName = jQuery.camelCase( name ),
  8939. style = elem.style;
  8940. name = jQuery.cssProps[ origName ] ||
  8941. ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
  8942. // Gets hook for the prefixed version, then unprefixed version
  8943. hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
  8944. // Check if we're setting a value
  8945. if ( value !== undefined ) {
  8946. type = typeof value;
  8947. // Convert "+=" or "-=" to relative numbers (#7345)
  8948. if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
  8949. value = adjustCSS( elem, name, ret );
  8950. // Fixes bug #9237
  8951. type = "number";
  8952. }
  8953. // Make sure that null and NaN values aren't set (#7116)
  8954. if ( value == null || value !== value ) {
  8955. return;
  8956. }
  8957. // If a number was passed in, add the unit (except for certain CSS properties)
  8958. if ( type === "number" ) {
  8959. value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
  8960. }
  8961. // background-* props affect original clone's values
  8962. if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
  8963. style[ name ] = "inherit";
  8964. }
  8965. // If a hook was provided, use that value, otherwise just set the specified value
  8966. if ( !hooks || !( "set" in hooks ) ||
  8967. ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
  8968. style[ name ] = value;
  8969. }
  8970. } else {