1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023 |
- /*!
- *
- * @supermap/react-iclient.(https://iclient.supermap.io)
- * Copyright© 2000 - 2021 SuperMap Software Co.Ltd
- * license: Apache-2.0
- * version: v10.1.1
- *
- */
- (function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory(require("react"), require("../public/libs/mapboxgl/mapbox-gl-enhance.js"), require("../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js"), require("antd"), require("echarts"), require("../public/libs/echarts-layer/EchartsLayer.js"), require("../public/libs/deckgl/deck.gl.min.js"), require("three/build/three"));
- else if(typeof define === 'function' && define.amd)
- define(["react", "../public/libs/mapboxgl/mapbox-gl-enhance.js", "../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js", "antd", "echarts", "../public/libs/echarts-layer/EchartsLayer.js", "../public/libs/deckgl/deck.gl.min.js", "three/build/three"], factory);
- else if(typeof exports === 'object')
- exports["Components"] = factory(require("react"), require("../public/libs/mapboxgl/mapbox-gl-enhance.js"), require("../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js"), require("antd"), require("echarts"), require("../public/libs/echarts-layer/EchartsLayer.js"), require("../public/libs/deckgl/deck.gl.min.js"), require("three/build/three"));
- else
- root["SuperMap"] = root["SuperMap"] || {}, root["SuperMap"]["Components"] = factory(root["React"], root["mapboxgl"], root["SuperMap"], root["antd"], root["echarts"], root["EchartsLayer"], root["DeckGL"], root["THREE"]);
- })(window, function(__WEBPACK_EXTERNAL_MODULE__5__, __WEBPACK_EXTERNAL_MODULE__7__, __WEBPACK_EXTERNAL_MODULE__12__, __WEBPACK_EXTERNAL_MODULE__36__, __WEBPACK_EXTERNAL_MODULE__50__, __WEBPACK_EXTERNAL_MODULE__51__, __WEBPACK_EXTERNAL_MODULE__126__, __WEBPACK_EXTERNAL_MODULE__142__) {
- return /******/ (function(modules) { // webpackBootstrap
- /******/ // The module cache
- /******/ var installedModules = {};
- /******/
- /******/ // The require function
- /******/ function __webpack_require__(moduleId) {
- /******/
- /******/ // Check if module is in cache
- /******/ if(installedModules[moduleId]) {
- /******/ return installedModules[moduleId].exports;
- /******/ }
- /******/ // Create a new module (and put it into the cache)
- /******/ var module = installedModules[moduleId] = {
- /******/ i: moduleId,
- /******/ l: false,
- /******/ exports: {}
- /******/ };
- /******/
- /******/ // Execute the module function
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
- /******/
- /******/ // Flag the module as loaded
- /******/ module.l = true;
- /******/
- /******/ // Return the exports of the module
- /******/ return module.exports;
- /******/ }
- /******/
- /******/
- /******/ // expose the modules object (__webpack_modules__)
- /******/ __webpack_require__.m = modules;
- /******/
- /******/ // expose the module cache
- /******/ __webpack_require__.c = installedModules;
- /******/
- /******/ // define getter function for harmony exports
- /******/ __webpack_require__.d = function(exports, name, getter) {
- /******/ if(!__webpack_require__.o(exports, name)) {
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
- /******/ }
- /******/ };
- /******/
- /******/ // define __esModule on exports
- /******/ __webpack_require__.r = function(exports) {
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
- /******/ }
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
- /******/ };
- /******/
- /******/ // create a fake namespace object
- /******/ // mode & 1: value is a module id, require it
- /******/ // mode & 2: merge all properties of value into the ns
- /******/ // mode & 4: return value when already ns object
- /******/ // mode & 8|1: behave like require
- /******/ __webpack_require__.t = function(value, mode) {
- /******/ if(mode & 1) value = __webpack_require__(value);
- /******/ if(mode & 8) return value;
- /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
- /******/ var ns = Object.create(null);
- /******/ __webpack_require__.r(ns);
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
- /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
- /******/ return ns;
- /******/ };
- /******/
- /******/ // getDefaultExport function for compatibility with non-harmony modules
- /******/ __webpack_require__.n = function(module) {
- /******/ var getter = module && module.__esModule ?
- /******/ function getDefault() { return module['default']; } :
- /******/ function getModuleExports() { return module; };
- /******/ __webpack_require__.d(getter, 'a', getter);
- /******/ return getter;
- /******/ };
- /******/
- /******/ // Object.prototype.hasOwnProperty.call
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
- /******/
- /******/ // __webpack_public_path__
- /******/ __webpack_require__.p = "";
- /******/
- /******/
- /******/ // Load entry module and return exports
- /******/ return __webpack_require__(__webpack_require__.s = 60);
- /******/ })
- /************************************************************************/
- /******/ ([
- /* 0 */
- /***/ (function(module, exports) {
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- "default": obj
- };
- }
- module.exports = _interopRequireDefault;
- /***/ }),
- /* 1 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _classCallCheck; });
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
- /***/ }),
- /* 2 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _createClass; });
- function _defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
- function _createClass(Constructor, protoProps, staticProps) {
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
- if (staticProps) _defineProperties(Constructor, staticProps);
- return Constructor;
- }
- /***/ }),
- /* 3 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js
- function _getPrototypeOf(o) {
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
- return o.__proto__ || Object.getPrototypeOf(o);
- };
- return _getPrototypeOf(o);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js
- function _isNativeReflectConstruct() {
- if (typeof Reflect === "undefined" || !Reflect.construct) return false;
- if (Reflect.construct.sham) return false;
- if (typeof Proxy === "function") return true;
- try {
- Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
- return true;
- } catch (e) {
- return false;
- }
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function _typeof(obj) {
- return typeof obj;
- };
- } else {
- _typeof = function _typeof(obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
- };
- }
- return _typeof(obj);
- }
- // EXTERNAL MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
- var assertThisInitialized = __webpack_require__(18);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js
- function _possibleConstructorReturn(self, call) {
- if (call && (_typeof(call) === "object" || typeof call === "function")) {
- return call;
- }
- return Object(assertThisInitialized["default"])(self);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createSuper.js
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _createSuper; });
- function _createSuper(Derived) {
- return function () {
- var Super = _getPrototypeOf(Derived),
- result;
- if (_isNativeReflectConstruct()) {
- var NewTarget = _getPrototypeOf(this).constructor;
- result = Reflect.construct(Super, arguments, NewTarget);
- } else {
- result = Super.apply(this, arguments);
- }
- return _possibleConstructorReturn(this, result);
- };
- }
- /***/ }),
- /* 4 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js
- function _setPrototypeOf(o, p) {
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
- o.__proto__ = p;
- return o;
- };
- return _setPrototypeOf(o, p);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/inherits.js
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _inherits; });
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function");
- }
- subClass.prototype = Object.create(superClass && superClass.prototype, {
- constructor: {
- value: subClass,
- writable: true,
- configurable: true
- }
- });
- if (superClass) _setPrototypeOf(subClass, superClass);
- }
- /***/ }),
- /* 5 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__5__;
- /***/ }),
- /* 6 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=mapGetter;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(18));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _wrapDisplayName2=_interopRequireDefault(__webpack_require__(55));var _react=_interopRequireDefault(__webpack_require__(5));var _hoistNonReactStatics=_interopRequireDefault(__webpack_require__(56));var _antd=__webpack_require__(36);var _mapEvent=_interopRequireDefault(__webpack_require__(27));var _globalEvent=_interopRequireDefault(__webpack_require__(40));var _util=__webpack_require__(11);function mapGetter(WrappedComponent){var MapGetter=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(MapGetter,_React$Component);var _super=(0,_createSuper2.default)(MapGetter);function MapGetter(props){var _this;(0,_classCallCheck2.default)(this,MapGetter);_this=_super.call(this,props);_this.map=void 0;_this.webmap=void 0;_this.instanceRef=void 0;_this.getComponentInstance=void 0;_this.loadMapSucceed=_this.loadMapSucceed.bind((0,_assertThisInitialized2.default)(_this));_this.deleteMapSucceed=_this.deleteMapSucceed.bind((0,_assertThisInitialized2.default)(_this));_this.getComponentInstance=_util.getComponentInstance.bind((0,_assertThisInitialized2.default)(_this));return _this;}(0,_createClass2.default)(MapGetter,[{key:"componentDidMount",value:function componentDidMount(){var targetName=this.getTargetName();if(_mapEvent.default.getMap(targetName)){this.loadMap(targetName);}_mapEvent.default.on('load-map',this.loadMapSucceed);_globalEvent.default.on('delete-map',this.deleteMapSucceed);}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var mapTarget=this.props.mapTarget;var prevMapTarget=prevProps.mapTarget;if(mapTarget&&prevMapTarget&&mapTarget!==prevMapTarget){this.mapTargetChanged(mapTarget);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){_mapEvent.default.off('load-map',this.loadMapSucceed);_globalEvent.default.off('delete-map',this.deleteMapSucceed);}},{key:"getTargetName",value:function getTargetName(){/**
- * 便于区分存在多个map时,子组件对应的map的渲染;
- * map 和 webmap 的 props 属性是 target 其他组件都叫 mapTarget
- * 如果子组件包裹在 map 组件里面,若没有传 mapTarget, 则 targetName 直接取父元素的target 的值
- * 如果子组件和 map 同层级,且没有设置 mapTarget 时,则默认渲染到第一个 map 上
- *
- */ // const selfParent = this._reactInternalInstance._currentElement._owner._instance;
- // console.log(selfParent);
- // console.log('selfParent: ', selfParent);
- // const parentTarget =
- // selfParent && selfParent.name.toLowerCase() === 'smwebmap' &&
- // selfParent.target;
- // return this.props.mapTarget || parentTarget || Object.keys(mapEvent.getAllMaps())[0];
- var maps=_mapEvent.default.getAllMaps();return this.props.mapTarget||(0,_util.getFirstMapTarget)(maps);}},{key:"loadMapSucceed",value:function loadMapSucceed(map,target){var targetName=this.getTargetName();if(target===targetName){this.loadMap(target);}}},{key:"mapTargetChanged",value:function mapTargetChanged(target){// 多个map切换的时候,需要删除该组件与前一个map的图层绑定, 如果新的target没有对应的map,那么默认绑定第一个地图
- var maps=_mapEvent.default.getAllMaps();var targetName=(0,_util.getFirstMapTarget)(maps);var firstMap=_mapEvent.default.getMap(targetName);this.resetData();if(_mapEvent.default.getMap(target)||firstMap){this.loadMap(target);}}},{key:"loadMap",value:function loadMap(targetName){this.map=_mapEvent.default.getMap(targetName);this.webmap=_mapEvent.default.getWebMap(targetName);(0,_util.callHook)(this.instanceRef,'loaded',this.map);// 控制与map组件同级的组件的显示加载
- // setTimeout(() => {
- // /**
- // * @event loaded
- // * @desc 组件加载渲染完成之后触发。
- // */
- // this.$emit('loaded');
- // }, 0);
- }},{key:"deleteMapSucceed",value:function deleteMapSucceed(target){var targetName=this.getTargetName();if(target===targetName){this.resetData();}}},{key:"resetData",value:function resetData(){this.map=null;this.webmap=null;(0,_util.callHook)(this.instanceRef,'removed',this.map);}},{key:"mapNotLoadedTip",value:function mapNotLoadedTip(){if(!this.map){_antd.message.destroy();// TODO
- // message.warning(this.$t('warning.unassociatedMap'));
- _antd.message.warning('您需要配置关联地图!');return true;}return false;}},{key:"render",value:function render(){return/*#__PURE__*/_react.default.createElement(WrappedComponent,Object.assign({},this.props,{ref:this.getComponentInstance,mapNotLoadedTip:this.mapNotLoadedTip}));}}]);return MapGetter;}(_react.default.Component);MapGetter.displayName=(0,_wrapDisplayName2.default)(WrappedComponent,'mapGetter');return(0,_hoistNonReactStatics.default)(MapGetter,WrappedComponent);}
- /***/ }),
- /* 7 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__7__;
- /***/ }),
- /* 8 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- exports.__esModule = true;
- exports.default = void 0;
- var compose = function compose() {
- for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {
- funcs[_key] = arguments[_key];
- }
- return funcs.reduce(function (a, b) {
- return function () {
- return a(b.apply(void 0, arguments));
- };
- }, function (arg) {
- return arg;
- });
- };
- var _default = compose;
- exports.default = _default;
- /***/ }),
- /* 9 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireWildcard=__webpack_require__(19);var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=withLayer;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(18));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _wrapDisplayName2=_interopRequireDefault(__webpack_require__(55));var _react=_interopRequireWildcard(__webpack_require__(5));var _hoistNonReactStatics=_interopRequireDefault(__webpack_require__(56));var _lodash=_interopRequireDefault(__webpack_require__(52));var _lodash2=_interopRequireDefault(__webpack_require__(26));var _util=__webpack_require__(11);function withLayer(WrappedComponent){var BaseLayer=/*#__PURE__*/function(_PureComponent){(0,_inherits2.default)(BaseLayer,_PureComponent);var _super=(0,_createSuper2.default)(BaseLayer);function BaseLayer(props){var _this;(0,_classCallCheck2.default)(this,BaseLayer);_this=_super.call(this,props);_this.map=void 0;_this.instanceRef=void 0;_this.eventList=void 0;_this.registerEvents=[];_this.overLayer=void 0;_this.getComponentInstance=void 0;_this.$_emitEvent=function(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(_this.props[originEventName])){_this.props[originEventName]((0,_objectSpread2.default)({map:_this.map,layerId:_this.props.layerId},data));}};_this.$_emitLayerMapEvent=function(event){_this.$_emitEvent(event.type,{mapboxEvent:event});};_this.$_bindLayerEvents=function(){Object.keys(_this.props).forEach(function(eventName){if(_this.eventList.includes(eventName)){var layerId=_this.props.layerId;// @ts-ignore
- var layer=_this.map.overlayLayersManager[layerId];var name=eventName.replace('on','');var registerEventName=name.toLowerCase();_this.registerEvents.push(registerEventName);if(layer){_this.overLayer=layer;layer.on(registerEventName,_this.$_emitLayerMapEvent);}else{_this.map.on(registerEventName,layerId,_this.$_emitLayerMapEvent);}}});};_this.$_unbindLayerEvents=function(events){if(_this.map){events.forEach(function(eventName){!_this.overLayer&&_this.map.off(eventName,_this.props.layerId,_this.$_emitLayerMapEvent);});}};_this.move=function(beforeId){_this.map.moveLayer(_this.props.layerId,beforeId);_this.$_emitEvent('layer-moved',{beforeId:beforeId});};_this.remove=function(){var layerId=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_this.props.layerId;if(_this.registerEvents&&_this.registerEvents.length){_this.$_unbindLayerEvents(_this.registerEvents);}_this.map.removeLayer(layerId);_this.$_emitEvent('layer-removed');};_this.eventList=['onMousedown','onMouseup','onClick','onDblclick','onMousemove','onMouseenter','onMouseleave','onMouseover','onMouseout','onContextmenu','onTouchstart','onTouchend','onTouchcancel'];_this.getComponentInstance=_util.getComponentInstance.bind((0,_assertThisInitialized2.default)(_this));return _this;}(0,_createClass2.default)(BaseLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(prevProps.minzoom!==this.props.minzoom||prevProps.maxzoom!==this.props.maxzoom){this.map.setLayerZoomRange(this.props.layerId,this.props.minzoom,this.props.maxzoom);}if(prevProps.filter!==this.props.filter){this.map.setFilter(this.props.layerId,this.props.filter);}if(this.props.layout&&prevProps.layout!==this.props.layout){for(var _i=0,_Object$keys=Object.keys(this.props.layout);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];this.map.setLayoutProperty(this.props.layerId,prop,this.props.layout[prop]);}}if(this.props.paint&&prevProps.paint!==this.props.paint){for(var _i2=0,_Object$keys2=Object.keys(this.props.paint);_i2<_Object$keys2.length;_i2++){var _prop=_Object$keys2[_i2];this.map.setPaintProperty(this.props.layerId,_prop,this.props.paint[_prop]);}}if(this.props.metadata&&prevProps.metadata!==this.props.metadata){var layer=this.map.getLayer(this.props.layerId),metadata=layer.metadata;if(metadata){Object.assign(layer.metadata,this.props.metadata);}else{layer.metadata=this.props.metadata;}}if(prevProps.before!==this.props.before){this.move(this.props.before);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.remove();}},{key:"loaded",value:function loaded(map){this.map=map;(0,_util.callHook)(this.instanceRef,'loaded',this.map);this.$_bindLayerEvents();}},{key:"removed",value:function removed(map){if(this.props.layerId&&this.map){this.remove();}this.map=map;(0,_util.callHook)(this.instanceRef,'removed',this.map);}},{key:"render",value:function render(){// const { layerId } = this.props;
- // const id = source || layerId;
- // const sourceLoaded =
- // this.map && layerId ? this.map.isSourceLoaded(layerId) : false;
- // const mapLayer = this.map ? this.map.getLayer(layerId) : null;
- // const mapSource =
- // this.map && layerId ? this.map.getSource(layerId) : null;
- var newProps=Object.assign({},this.props,{// sourceLoaded,
- // mapLayer,
- // mapSource
- });return/*#__PURE__*/_react.default.createElement(WrappedComponent,Object.assign({},newProps,{ref:this.getComponentInstance,move:this.move,remove:this.remove}));}}]);return BaseLayer;}(_react.PureComponent);BaseLayer.displayName=(0,_wrapDisplayName2.default)(WrappedComponent,'withLayer');BaseLayer.defaultProps={layerId:(0,_lodash.default)("".concat(WrappedComponent.name.toLowerCase(),"-")),minzoom:0,maxzoom:22,before:undefined};;return(0,_hoistNonReactStatics.default)(BaseLayer,WrappedComponent);};
- /***/ }),
- /* 10 */
- /***/ (function(module, exports) {
- var g;
- // This works in non-strict mode
- g = (function() {
- return this;
- })();
- try {
- // This works if eval is allowed (see CSP)
- g = g || new Function("return this")();
- } catch (e) {
- // This works if the window reference is available
- if (typeof window === "object") g = window;
- }
- // g can still be undefined, but nothing to do about it...
- // We return undefined, instead of nothing here, so it's
- // easier to handle this case. if(!global) { ...}
- module.exports = g;
- /***/ }),
- /* 11 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.hexToRgba=hexToRgba;exports.reservedDecimal=reservedDecimal;exports.clearNumberComma=clearNumberComma;exports.isXField=isXField;exports.isYField=isYField;exports.getColorWithOpacity=getColorWithOpacity;exports.callHook=callHook;exports.getComponentInstance=getComponentInstance;exports.isFunction=isFunction;exports.getFirstMapTarget=getFirstMapTarget;var _colorcolor=_interopRequireDefault(__webpack_require__(41));// 获取当前时间返回置顶格式
- // export function getDateTime(timeType) {
- // return geti18n().d(new Date(), timeType.replace(/\+/g, '_'), getLanguage());
- // }
- // hex -> rgba
- function hexToRgba(hex,opacity){return'rgba('+parseInt('0x'+hex.slice(1,3))+','+parseInt('0x'+hex.slice(3,5))+','+parseInt('0x'+hex.slice(5,7))+','+opacity+')';}// export function isTransparent(color) {
- // const rgba = colorcolor(color, 'rgba');
- // return +rgba.match(/(\d(\.\d+)?)+/g)[3] === 0;
- // }
- // 保留指定位数的小数
- function reservedDecimal(val,precise){return Number(val).toFixed(precise);}// 清除数字(字符串型的)的逗号
- function clearNumberComma(num){if(num.replace){num=num.replace(/,/g,'');}return num;}/**
- * 判断是否地理X坐标
- * @param data
- */function isXField(data){var lowerdata=data.toLowerCase();return lowerdata==='x'||lowerdata==='smx'||lowerdata==='jd'||lowerdata==='经度'||lowerdata==='东经'||lowerdata==='longitude'||lowerdata==='lot'||lowerdata==='lon'||lowerdata==='lng'||lowerdata==='x坐标';}/**
- * 判断是否地理Y坐标
- * @param data
- */function isYField(data){var lowerdata=data.toLowerCase();return lowerdata==='y'||lowerdata==='smy'||lowerdata==='wd'||lowerdata==='纬度'||lowerdata==='北纬'||lowerdata==='latitude'||lowerdata==='lat'||lowerdata==='y坐标';}function getColorWithOpacity(color,opacity){if(color.indexOf('rgba')>-1){return color.substring(0,color.lastIndexOf(',')+1)+opacity+')';}var newColor=(0,_colorcolor.default)(color,'rgb');return'rgba'+newColor.substring(3,newColor.length-1)+",".concat(opacity,")");}var HOOKS=['loaded','removed'];function callHook(instanceRef,hook,map){HOOKS.includes(hook)&&instanceRef[hook]&&typeof instanceRef[hook]==='function'&&instanceRef[hook](map);}function getComponentInstance(ref){this.instanceRef=ref;}function isFunction(event){return Object.prototype.toString.call(event)==='[object Function]';}function getFirstMapTarget(maps){var firstTarget;for(var key in maps){if(!!key){firstTarget=key;break;}}return firstTarget;}
- /***/ }),
- /* 12 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__12__;
- /***/ }),
- /* 13 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global, module) {/**
- * Lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright JS Foundation and other contributors <https://js.foundation/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as the size to enable large array optimizations. */
- var LARGE_ARRAY_SIZE = 200;
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED = '__lodash_hash_undefined__';
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG = 1,
- COMPARE_UNORDERED_FLAG = 2;
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER = 9007199254740991;
- /** `Object#toString` result references. */
- var argsTag = '[object Arguments]',
- arrayTag = '[object Array]',
- asyncTag = '[object AsyncFunction]',
- boolTag = '[object Boolean]',
- dateTag = '[object Date]',
- errorTag = '[object Error]',
- funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]',
- mapTag = '[object Map]',
- numberTag = '[object Number]',
- nullTag = '[object Null]',
- objectTag = '[object Object]',
- promiseTag = '[object Promise]',
- proxyTag = '[object Proxy]',
- regexpTag = '[object RegExp]',
- setTag = '[object Set]',
- stringTag = '[object String]',
- symbolTag = '[object Symbol]',
- undefinedTag = '[object Undefined]',
- weakMapTag = '[object WeakMap]';
- var arrayBufferTag = '[object ArrayBuffer]',
- dataViewTag = '[object DataView]',
- float32Tag = '[object Float32Array]',
- float64Tag = '[object Float64Array]',
- int8Tag = '[object Int8Array]',
- int16Tag = '[object Int16Array]',
- int32Tag = '[object Int32Array]',
- uint8Tag = '[object Uint8Array]',
- uint8ClampedTag = '[object Uint8ClampedArray]',
- uint16Tag = '[object Uint16Array]',
- uint32Tag = '[object Uint32Array]';
- /**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
- var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
- /** Used to detect host constructors (Safari). */
- var reIsHostCtor = /^\[object .+?Constructor\]$/;
- /** Used to detect unsigned integer values. */
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- /** Used to identify `toStringTag` values of typed arrays. */
- var typedArrayTags = {};
- typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
- typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
- typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
- typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
- typedArrayTags[uint32Tag] = true;
- typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
- typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
- typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
- typedArrayTags[errorTag] = typedArrayTags[funcTag] =
- typedArrayTags[mapTag] = typedArrayTags[numberTag] =
- typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
- typedArrayTags[setTag] = typedArrayTags[stringTag] =
- typedArrayTags[weakMapTag] = false;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /** Detect free variable `exports`. */
- var freeExports = true && exports && !exports.nodeType && exports;
- /** Detect free variable `module`. */
- var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
- /** Detect the popular CommonJS extension `module.exports`. */
- var moduleExports = freeModule && freeModule.exports === freeExports;
- /** Detect free variable `process` from Node.js. */
- var freeProcess = moduleExports && freeGlobal.process;
- /** Used to access faster Node.js helpers. */
- var nodeUtil = (function() {
- try {
- return freeProcess && freeProcess.binding && freeProcess.binding('util');
- } catch (e) {}
- }());
- /* Node.js helper references. */
- var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
- /**
- * A specialized version of `_.filter` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
- */
- function arrayFilter(array, predicate) {
- var index = -1,
- length = array == null ? 0 : array.length,
- resIndex = 0,
- result = [];
- while (++index < length) {
- var value = array[index];
- if (predicate(value, index, array)) {
- result[resIndex++] = value;
- }
- }
- return result;
- }
- /**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
- function arrayPush(array, values) {
- var index = -1,
- length = values.length,
- offset = array.length;
- while (++index < length) {
- array[offset + index] = values[index];
- }
- return array;
- }
- /**
- * A specialized version of `_.some` for arrays without support for iteratee
- * shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- * else `false`.
- */
- function arraySome(array, predicate) {
- var index = -1,
- length = array == null ? 0 : array.length;
- while (++index < length) {
- if (predicate(array[index], index, array)) {
- return true;
- }
- }
- return false;
- }
- /**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
- function baseTimes(n, iteratee) {
- var index = -1,
- result = Array(n);
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
- /**
- * The base implementation of `_.unary` without support for storing metadata.
- *
- * @private
- * @param {Function} func The function to cap arguments for.
- * @returns {Function} Returns the new capped function.
- */
- function baseUnary(func) {
- return function(value) {
- return func(value);
- };
- }
- /**
- * Checks if a `cache` value for `key` exists.
- *
- * @private
- * @param {Object} cache The cache to query.
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function cacheHas(cache, key) {
- return cache.has(key);
- }
- /**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
- function getValue(object, key) {
- return object == null ? undefined : object[key];
- }
- /**
- * Converts `map` to its key-value pairs.
- *
- * @private
- * @param {Object} map The map to convert.
- * @returns {Array} Returns the key-value pairs.
- */
- function mapToArray(map) {
- var index = -1,
- result = Array(map.size);
- map.forEach(function(value, key) {
- result[++index] = [key, value];
- });
- return result;
- }
- /**
- * Creates a unary function that invokes `func` with its argument transformed.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
- */
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- /**
- * Converts `set` to an array of its values.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the values.
- */
- function setToArray(set) {
- var index = -1,
- result = Array(set.size);
- set.forEach(function(value) {
- result[++index] = value;
- });
- return result;
- }
- /** Used for built-in method references. */
- var arrayProto = Array.prototype,
- funcProto = Function.prototype,
- objectProto = Object.prototype;
- /** Used to detect overreaching core-js shims. */
- var coreJsData = root['__core-js_shared__'];
- /** Used to resolve the decompiled source of functions. */
- var funcToString = funcProto.toString;
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
- /** Used to detect methods masquerading as native. */
- var maskSrcKey = (function() {
- var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
- return uid ? ('Symbol(src)_1.' + uid) : '';
- }());
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var nativeObjectToString = objectProto.toString;
- /** Used to detect if a method is native. */
- var reIsNative = RegExp('^' +
- funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
- );
- /** Built-in value references. */
- var Buffer = moduleExports ? root.Buffer : undefined,
- Symbol = root.Symbol,
- Uint8Array = root.Uint8Array,
- propertyIsEnumerable = objectProto.propertyIsEnumerable,
- splice = arrayProto.splice,
- symToStringTag = Symbol ? Symbol.toStringTag : undefined;
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeGetSymbols = Object.getOwnPropertySymbols,
- nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
- nativeKeys = overArg(Object.keys, Object);
- /* Built-in method references that are verified to be native. */
- var DataView = getNative(root, 'DataView'),
- Map = getNative(root, 'Map'),
- Promise = getNative(root, 'Promise'),
- Set = getNative(root, 'Set'),
- WeakMap = getNative(root, 'WeakMap'),
- nativeCreate = getNative(Object, 'create');
- /** Used to detect maps, sets, and weakmaps. */
- var dataViewCtorString = toSource(DataView),
- mapCtorString = toSource(Map),
- promiseCtorString = toSource(Promise),
- setCtorString = toSource(Set),
- weakMapCtorString = toSource(WeakMap);
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
- /**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Hash(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
- function hashClear() {
- this.__data__ = nativeCreate ? nativeCreate(null) : {};
- this.size = 0;
- }
- /**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function hashDelete(key) {
- var result = this.has(key) && delete this.__data__[key];
- this.size -= result ? 1 : 0;
- return result;
- }
- /**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function hashGet(key) {
- var data = this.__data__;
- if (nativeCreate) {
- var result = data[key];
- return result === HASH_UNDEFINED ? undefined : result;
- }
- return hasOwnProperty.call(data, key) ? data[key] : undefined;
- }
- /**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function hashHas(key) {
- var data = this.__data__;
- return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
- }
- /**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
- function hashSet(key, value) {
- var data = this.__data__;
- this.size += this.has(key) ? 0 : 1;
- data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
- return this;
- }
- // Add methods to `Hash`.
- Hash.prototype.clear = hashClear;
- Hash.prototype['delete'] = hashDelete;
- Hash.prototype.get = hashGet;
- Hash.prototype.has = hashHas;
- Hash.prototype.set = hashSet;
- /**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function ListCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
- function listCacheClear() {
- this.__data__ = [];
- this.size = 0;
- }
- /**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function listCacheDelete(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- return false;
- }
- var lastIndex = data.length - 1;
- if (index == lastIndex) {
- data.pop();
- } else {
- splice.call(data, index, 1);
- }
- --this.size;
- return true;
- }
- /**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function listCacheGet(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- return index < 0 ? undefined : data[index][1];
- }
- /**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function listCacheHas(key) {
- return assocIndexOf(this.__data__, key) > -1;
- }
- /**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
- function listCacheSet(key, value) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- ++this.size;
- data.push([key, value]);
- } else {
- data[index][1] = value;
- }
- return this;
- }
- // Add methods to `ListCache`.
- ListCache.prototype.clear = listCacheClear;
- ListCache.prototype['delete'] = listCacheDelete;
- ListCache.prototype.get = listCacheGet;
- ListCache.prototype.has = listCacheHas;
- ListCache.prototype.set = listCacheSet;
- /**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function MapCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
- function mapCacheClear() {
- this.size = 0;
- this.__data__ = {
- 'hash': new Hash,
- 'map': new (Map || ListCache),
- 'string': new Hash
- };
- }
- /**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function mapCacheDelete(key) {
- var result = getMapData(this, key)['delete'](key);
- this.size -= result ? 1 : 0;
- return result;
- }
- /**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function mapCacheGet(key) {
- return getMapData(this, key).get(key);
- }
- /**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function mapCacheHas(key) {
- return getMapData(this, key).has(key);
- }
- /**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
- function mapCacheSet(key, value) {
- var data = getMapData(this, key),
- size = data.size;
- data.set(key, value);
- this.size += data.size == size ? 0 : 1;
- return this;
- }
- // Add methods to `MapCache`.
- MapCache.prototype.clear = mapCacheClear;
- MapCache.prototype['delete'] = mapCacheDelete;
- MapCache.prototype.get = mapCacheGet;
- MapCache.prototype.has = mapCacheHas;
- MapCache.prototype.set = mapCacheSet;
- /**
- *
- * Creates an array cache object to store unique values.
- *
- * @private
- * @constructor
- * @param {Array} [values] The values to cache.
- */
- function SetCache(values) {
- var index = -1,
- length = values == null ? 0 : values.length;
- this.__data__ = new MapCache;
- while (++index < length) {
- this.add(values[index]);
- }
- }
- /**
- * Adds `value` to the array cache.
- *
- * @private
- * @name add
- * @memberOf SetCache
- * @alias push
- * @param {*} value The value to cache.
- * @returns {Object} Returns the cache instance.
- */
- function setCacheAdd(value) {
- this.__data__.set(value, HASH_UNDEFINED);
- return this;
- }
- /**
- * Checks if `value` is in the array cache.
- *
- * @private
- * @name has
- * @memberOf SetCache
- * @param {*} value The value to search for.
- * @returns {number} Returns `true` if `value` is found, else `false`.
- */
- function setCacheHas(value) {
- return this.__data__.has(value);
- }
- // Add methods to `SetCache`.
- SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
- SetCache.prototype.has = setCacheHas;
- /**
- * Creates a stack cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Stack(entries) {
- var data = this.__data__ = new ListCache(entries);
- this.size = data.size;
- }
- /**
- * Removes all key-value entries from the stack.
- *
- * @private
- * @name clear
- * @memberOf Stack
- */
- function stackClear() {
- this.__data__ = new ListCache;
- this.size = 0;
- }
- /**
- * Removes `key` and its value from the stack.
- *
- * @private
- * @name delete
- * @memberOf Stack
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function stackDelete(key) {
- var data = this.__data__,
- result = data['delete'](key);
- this.size = data.size;
- return result;
- }
- /**
- * Gets the stack value for `key`.
- *
- * @private
- * @name get
- * @memberOf Stack
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function stackGet(key) {
- return this.__data__.get(key);
- }
- /**
- * Checks if a stack value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Stack
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function stackHas(key) {
- return this.__data__.has(key);
- }
- /**
- * Sets the stack `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Stack
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the stack cache instance.
- */
- function stackSet(key, value) {
- var data = this.__data__;
- if (data instanceof ListCache) {
- var pairs = data.__data__;
- if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
- pairs.push([key, value]);
- this.size = ++data.size;
- return this;
- }
- data = this.__data__ = new MapCache(pairs);
- }
- data.set(key, value);
- this.size = data.size;
- return this;
- }
- // Add methods to `Stack`.
- Stack.prototype.clear = stackClear;
- Stack.prototype['delete'] = stackDelete;
- Stack.prototype.get = stackGet;
- Stack.prototype.has = stackHas;
- Stack.prototype.set = stackSet;
- /**
- * Creates an array of the enumerable property names of the array-like `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @param {boolean} inherited Specify returning inherited property names.
- * @returns {Array} Returns the array of property names.
- */
- function arrayLikeKeys(value, inherited) {
- var isArr = isArray(value),
- isArg = !isArr && isArguments(value),
- isBuff = !isArr && !isArg && isBuffer(value),
- isType = !isArr && !isArg && !isBuff && isTypedArray(value),
- skipIndexes = isArr || isArg || isBuff || isType,
- result = skipIndexes ? baseTimes(value.length, String) : [],
- length = result.length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) &&
- !(skipIndexes && (
- // Safari 9 has enumerable `arguments.length` in strict mode.
- key == 'length' ||
- // Node.js 0.10 has enumerable non-index properties on buffers.
- (isBuff && (key == 'offset' || key == 'parent')) ||
- // PhantomJS 2 has enumerable non-index properties on typed arrays.
- (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
- // Skip index properties.
- isIndex(key, length)
- ))) {
- result.push(key);
- }
- }
- return result;
- }
- /**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function assocIndexOf(array, key) {
- var length = array.length;
- while (length--) {
- if (eq(array[length][0], key)) {
- return length;
- }
- }
- return -1;
- }
- /**
- * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
- * `keysFunc` and `symbolsFunc` to get the enumerable property names and
- * symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @param {Function} symbolsFunc The function to get the symbols of `object`.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function baseGetAllKeys(object, keysFunc, symbolsFunc) {
- var result = keysFunc(object);
- return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
- }
- /**
- * The base implementation of `getTag` without fallbacks for buggy environments.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- function baseGetTag(value) {
- if (value == null) {
- return value === undefined ? undefinedTag : nullTag;
- }
- return (symToStringTag && symToStringTag in Object(value))
- ? getRawTag(value)
- : objectToString(value);
- }
- /**
- * The base implementation of `_.isArguments`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- */
- function baseIsArguments(value) {
- return isObjectLike(value) && baseGetTag(value) == argsTag;
- }
- /**
- * The base implementation of `_.isEqual` which supports partial comparisons
- * and tracks traversed objects.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {boolean} bitmask The bitmask flags.
- * 1 - Unordered comparison
- * 2 - Partial comparison
- * @param {Function} [customizer] The function to customize comparisons.
- * @param {Object} [stack] Tracks traversed `value` and `other` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
- function baseIsEqual(value, other, bitmask, customizer, stack) {
- if (value === other) {
- return true;
- }
- if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
- return value !== value && other !== other;
- }
- return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
- }
- /**
- * A specialized version of `baseIsEqual` for arrays and objects which performs
- * deep comparisons and tracks traversed objects enabling objects with circular
- * references to be compared.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} [stack] Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
- var objIsArr = isArray(object),
- othIsArr = isArray(other),
- objTag = objIsArr ? arrayTag : getTag(object),
- othTag = othIsArr ? arrayTag : getTag(other);
- objTag = objTag == argsTag ? objectTag : objTag;
- othTag = othTag == argsTag ? objectTag : othTag;
- var objIsObj = objTag == objectTag,
- othIsObj = othTag == objectTag,
- isSameTag = objTag == othTag;
- if (isSameTag && isBuffer(object)) {
- if (!isBuffer(other)) {
- return false;
- }
- objIsArr = true;
- objIsObj = false;
- }
- if (isSameTag && !objIsObj) {
- stack || (stack = new Stack);
- return (objIsArr || isTypedArray(object))
- ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
- : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
- }
- if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
- var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
- othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
- if (objIsWrapped || othIsWrapped) {
- var objUnwrapped = objIsWrapped ? object.value() : object,
- othUnwrapped = othIsWrapped ? other.value() : other;
- stack || (stack = new Stack);
- return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
- }
- }
- if (!isSameTag) {
- return false;
- }
- stack || (stack = new Stack);
- return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
- }
- /**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- * else `false`.
- */
- function baseIsNative(value) {
- if (!isObject(value) || isMasked(value)) {
- return false;
- }
- var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
- return pattern.test(toSource(value));
- }
- /**
- * The base implementation of `_.isTypedArray` without Node.js optimizations.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- */
- function baseIsTypedArray(value) {
- return isObjectLike(value) &&
- isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
- }
- /**
- * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != 'constructor') {
- result.push(key);
- }
- }
- return result;
- }
- /**
- * A specialized version of `baseIsEqualDeep` for arrays with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Array} array The array to compare.
- * @param {Array} other The other array to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `array` and `other` objects.
- * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
- */
- function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
- arrLength = array.length,
- othLength = other.length;
- if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
- return false;
- }
- // Assume cyclic values are equal.
- var stacked = stack.get(array);
- if (stacked && stack.get(other)) {
- return stacked == other;
- }
- var index = -1,
- result = true,
- seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
- stack.set(array, other);
- stack.set(other, array);
- // Ignore non-index properties.
- while (++index < arrLength) {
- var arrValue = array[index],
- othValue = other[index];
- if (customizer) {
- var compared = isPartial
- ? customizer(othValue, arrValue, index, other, array, stack)
- : customizer(arrValue, othValue, index, array, other, stack);
- }
- if (compared !== undefined) {
- if (compared) {
- continue;
- }
- result = false;
- break;
- }
- // Recursively compare arrays (susceptible to call stack limits).
- if (seen) {
- if (!arraySome(other, function(othValue, othIndex) {
- if (!cacheHas(seen, othIndex) &&
- (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
- return seen.push(othIndex);
- }
- })) {
- result = false;
- break;
- }
- } else if (!(
- arrValue === othValue ||
- equalFunc(arrValue, othValue, bitmask, customizer, stack)
- )) {
- result = false;
- break;
- }
- }
- stack['delete'](array);
- stack['delete'](other);
- return result;
- }
- /**
- * A specialized version of `baseIsEqualDeep` for comparing objects of
- * the same `toStringTag`.
- *
- * **Note:** This function only supports comparing values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {string} tag The `toStringTag` of the objects to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
- switch (tag) {
- case dataViewTag:
- if ((object.byteLength != other.byteLength) ||
- (object.byteOffset != other.byteOffset)) {
- return false;
- }
- object = object.buffer;
- other = other.buffer;
- case arrayBufferTag:
- if ((object.byteLength != other.byteLength) ||
- !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
- return false;
- }
- return true;
- case boolTag:
- case dateTag:
- case numberTag:
- // Coerce booleans to `1` or `0` and dates to milliseconds.
- // Invalid dates are coerced to `NaN`.
- return eq(+object, +other);
- case errorTag:
- return object.name == other.name && object.message == other.message;
- case regexpTag:
- case stringTag:
- // Coerce regexes to strings and treat strings, primitives and objects,
- // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
- // for more details.
- return object == (other + '');
- case mapTag:
- var convert = mapToArray;
- case setTag:
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
- convert || (convert = setToArray);
- if (object.size != other.size && !isPartial) {
- return false;
- }
- // Assume cyclic values are equal.
- var stacked = stack.get(object);
- if (stacked) {
- return stacked == other;
- }
- bitmask |= COMPARE_UNORDERED_FLAG;
- // Recursively compare objects (susceptible to call stack limits).
- stack.set(object, other);
- var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
- stack['delete'](object);
- return result;
- case symbolTag:
- if (symbolValueOf) {
- return symbolValueOf.call(object) == symbolValueOf.call(other);
- }
- }
- return false;
- }
- /**
- * A specialized version of `baseIsEqualDeep` for objects with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
- objProps = getAllKeys(object),
- objLength = objProps.length,
- othProps = getAllKeys(other),
- othLength = othProps.length;
- if (objLength != othLength && !isPartial) {
- return false;
- }
- var index = objLength;
- while (index--) {
- var key = objProps[index];
- if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
- return false;
- }
- }
- // Assume cyclic values are equal.
- var stacked = stack.get(object);
- if (stacked && stack.get(other)) {
- return stacked == other;
- }
- var result = true;
- stack.set(object, other);
- stack.set(other, object);
- var skipCtor = isPartial;
- while (++index < objLength) {
- key = objProps[index];
- var objValue = object[key],
- othValue = other[key];
- if (customizer) {
- var compared = isPartial
- ? customizer(othValue, objValue, key, other, object, stack)
- : customizer(objValue, othValue, key, object, other, stack);
- }
- // Recursively compare objects (susceptible to call stack limits).
- if (!(compared === undefined
- ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
- : compared
- )) {
- result = false;
- break;
- }
- skipCtor || (skipCtor = key == 'constructor');
- }
- if (result && !skipCtor) {
- var objCtor = object.constructor,
- othCtor = other.constructor;
- // Non `Object` object instances with different constructors are not equal.
- if (objCtor != othCtor &&
- ('constructor' in object && 'constructor' in other) &&
- !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
- typeof othCtor == 'function' && othCtor instanceof othCtor)) {
- result = false;
- }
- }
- stack['delete'](object);
- stack['delete'](other);
- return result;
- }
- /**
- * Creates an array of own enumerable property names and symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function getAllKeys(object) {
- return baseGetAllKeys(object, keys, getSymbols);
- }
- /**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
- function getMapData(map, key) {
- var data = map.__data__;
- return isKeyable(key)
- ? data[typeof key == 'string' ? 'string' : 'hash']
- : data.map;
- }
- /**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
- function getNative(object, key) {
- var value = getValue(object, key);
- return baseIsNative(value) ? value : undefined;
- }
- /**
- * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the raw `toStringTag`.
- */
- function getRawTag(value) {
- var isOwn = hasOwnProperty.call(value, symToStringTag),
- tag = value[symToStringTag];
- try {
- value[symToStringTag] = undefined;
- var unmasked = true;
- } catch (e) {}
- var result = nativeObjectToString.call(value);
- if (unmasked) {
- if (isOwn) {
- value[symToStringTag] = tag;
- } else {
- delete value[symToStringTag];
- }
- }
- return result;
- }
- /**
- * Creates an array of the own enumerable symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
- */
- var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
- if (object == null) {
- return [];
- }
- object = Object(object);
- return arrayFilter(nativeGetSymbols(object), function(symbol) {
- return propertyIsEnumerable.call(object, symbol);
- });
- };
- /**
- * Gets the `toStringTag` of `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- var getTag = baseGetTag;
- // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
- if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
- (Map && getTag(new Map) != mapTag) ||
- (Promise && getTag(Promise.resolve()) != promiseTag) ||
- (Set && getTag(new Set) != setTag) ||
- (WeakMap && getTag(new WeakMap) != weakMapTag)) {
- getTag = function(value) {
- var result = baseGetTag(value),
- Ctor = result == objectTag ? value.constructor : undefined,
- ctorString = Ctor ? toSource(Ctor) : '';
- if (ctorString) {
- switch (ctorString) {
- case dataViewCtorString: return dataViewTag;
- case mapCtorString: return mapTag;
- case promiseCtorString: return promiseTag;
- case setCtorString: return setTag;
- case weakMapCtorString: return weakMapTag;
- }
- }
- return result;
- };
- }
- /**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length &&
- (typeof value == 'number' || reIsUint.test(value)) &&
- (value > -1 && value % 1 == 0 && value < length);
- }
- /**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
- function isKeyable(value) {
- var type = typeof value;
- return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
- ? (value !== '__proto__')
- : (value === null);
- }
- /**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
- function isMasked(func) {
- return !!maskSrcKey && (maskSrcKey in func);
- }
- /**
- * Checks if `value` is likely a prototype object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
- */
- function isPrototype(value) {
- var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
- return value === proto;
- }
- /**
- * Converts `value` to a string using `Object.prototype.toString`.
- *
- * @private
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- */
- function objectToString(value) {
- return nativeObjectToString.call(value);
- }
- /**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to convert.
- * @returns {string} Returns the source code.
- */
- function toSource(func) {
- if (func != null) {
- try {
- return funcToString.call(func);
- } catch (e) {}
- try {
- return (func + '');
- } catch (e) {}
- }
- return '';
- }
- /**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
- function eq(value, other) {
- return value === other || (value !== value && other !== other);
- }
- /**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- * else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
- return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
- !propertyIsEnumerable.call(value, 'callee');
- };
- /**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
- var isArray = Array.isArray;
- /**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- /**
- * Checks if `value` is a buffer.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
- * @example
- *
- * _.isBuffer(new Buffer(2));
- * // => true
- *
- * _.isBuffer(new Uint8Array(2));
- * // => false
- */
- var isBuffer = nativeIsBuffer || stubFalse;
- /**
- * Performs a deep comparison between two values to determine if they are
- * equivalent.
- *
- * **Note:** This method supports comparing arrays, array buffers, booleans,
- * date objects, error objects, maps, numbers, `Object` objects, regexes,
- * sets, strings, symbols, and typed arrays. `Object` objects are compared
- * by their own, not inherited, enumerable properties. Functions and DOM
- * nodes are compared by strict equality, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.isEqual(object, other);
- * // => true
- *
- * object === other;
- * // => false
- */
- function isEqual(value, other) {
- return baseIsEqual(value, other);
- }
- /**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
- function isFunction(value) {
- if (!isObject(value)) {
- return false;
- }
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 9 which returns 'object' for typed arrays and other constructors.
- var tag = baseGetTag(value);
- return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
- }
- /**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
- function isLength(value) {
- return typeof value == 'number' &&
- value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return value != null && (type == 'object' || type == 'function');
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return value != null && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
- var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
- /**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- /**
- * This method returns a new empty array.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {Array} Returns the new empty array.
- * @example
- *
- * var arrays = _.times(2, _.stubArray);
- *
- * console.log(arrays);
- * // => [[], []]
- *
- * console.log(arrays[0] === arrays[1]);
- * // => false
- */
- function stubArray() {
- return [];
- }
- /**
- * This method returns `false`.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {boolean} Returns `false`.
- * @example
- *
- * _.times(2, _.stubFalse);
- * // => [false, false]
- */
- function stubFalse() {
- return false;
- }
- module.exports = isEqual;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10), __webpack_require__(38)(module)))
- /***/ }),
- /* 14 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- // a duplex stream is just a stream that is both readable and writable.
- // Since JS doesn't have multiple prototypal inheritance, this class
- // prototypally inherits from Readable, and then parasitically from
- // Writable.
- /*<replacement>*/
- var pna = __webpack_require__(24);
- /*</replacement>*/
- /*<replacement>*/
- var objectKeys = Object.keys || function (obj) {
- var keys = [];
- for (var key in obj) {
- keys.push(key);
- }return keys;
- };
- /*</replacement>*/
- module.exports = Duplex;
- /*<replacement>*/
- var util = __webpack_require__(21);
- util.inherits = __webpack_require__(16);
- /*</replacement>*/
- var Readable = __webpack_require__(45);
- var Writable = __webpack_require__(29);
- util.inherits(Duplex, Readable);
- {
- // avoid scope creep, the keys array can then be collected
- var keys = objectKeys(Writable.prototype);
- for (var v = 0; v < keys.length; v++) {
- var method = keys[v];
- if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
- }
- }
- function Duplex(options) {
- if (!(this instanceof Duplex)) return new Duplex(options);
- Readable.call(this, options);
- Writable.call(this, options);
- if (options && options.readable === false) this.readable = false;
- if (options && options.writable === false) this.writable = false;
- this.allowHalfOpen = true;
- if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
- this.once('end', onend);
- }
- Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._writableState.highWaterMark;
- }
- });
- // the no-half-open enforcer
- function onend() {
- // if we allow half-open state, or if the writable side ended,
- // then we're ok.
- if (this.allowHalfOpen || this._writableState.ended) return;
- // no more data can be written.
- // But allow more writes to happen in this tick.
- pna.nextTick(onEndNT, this);
- }
- function onEndNT(self) {
- self.end();
- }
- Object.defineProperty(Duplex.prototype, 'destroyed', {
- get: function () {
- if (this._readableState === undefined || this._writableState === undefined) {
- return false;
- }
- return this._readableState.destroyed && this._writableState.destroyed;
- },
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (this._readableState === undefined || this._writableState === undefined) {
- return;
- }
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._readableState.destroyed = value;
- this._writableState.destroyed = value;
- }
- });
- Duplex.prototype._destroy = function (err, cb) {
- this.push(null);
- this.end();
- pna.nextTick(cb, err);
- };
- /***/ }),
- /* 15 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js
- function _defineProperty(obj, key, value) {
- if (key in obj) {
- Object.defineProperty(obj, key, {
- value: value,
- enumerable: true,
- configurable: true,
- writable: true
- });
- } else {
- obj[key] = value;
- }
- return obj;
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _objectSpread2; });
- function ownKeys(object, enumerableOnly) {
- var keys = Object.keys(object);
- if (Object.getOwnPropertySymbols) {
- var symbols = Object.getOwnPropertySymbols(object);
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
- });
- keys.push.apply(keys, symbols);
- }
- return keys;
- }
- function _objectSpread2(target) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i] != null ? arguments[i] : {};
- if (i % 2) {
- ownKeys(Object(source), true).forEach(function (key) {
- _defineProperty(target, key, source[key]);
- });
- } else if (Object.getOwnPropertyDescriptors) {
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
- } else {
- ownKeys(Object(source)).forEach(function (key) {
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
- });
- }
- }
- return target;
- }
- /***/ }),
- /* 16 */
- /***/ (function(module, exports) {
- if (typeof Object.create === 'function') {
- // implementation from standard node.js 'util' module
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- })
- }
- };
- } else {
- // old school shim for old browsers
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor
- var TempCtor = function () {}
- TempCtor.prototype = superCtor.prototype
- ctor.prototype = new TempCtor()
- ctor.prototype.constructor = ctor
- }
- }
- }
- /***/ }),
- /* 17 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _util=__webpack_require__(11);var Marker=/*#__PURE__*/function(){function Marker(features){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,Marker);this.features=void 0;this.markersElement=[];this.options=void 0;this.features=features;this.options=options;}(0,_createClass2.default)(Marker,[{key:"setFeatures",value:function setFeatures(features){this.markersElement=[];this.features=features;this.features&&this._createMarker();}},{key:"getMarkersElement",value:function getMarkersElement(){return this.markersElement;}},{key:"setMarkersTextField",value:function setMarkersTextField(textField){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.options.textField=textField;var name=document.getElementsByClassName('sm-component-animate-marker__name');for(var i=0;i<name.length;i++){var properties=this.features.features[i]&&this.features.features[i].properties;if(properties&&properties[textField]){name[i].innerHTML=properties[textField];}else{name[i].innerHTML='';}}}},{key:"setMarkersTextFontSize",value:function setMarkersTextFontSize(textFontSize){this.options.textFontSize=textFontSize;var pulse=document.getElementsByClassName('sm-component-animate-marker__name-container');for(var i=0;i<pulse.length;i++){// @ts-ignore
- pulse[i].style.fontSize=textFontSize+'px';}}},{key:"setMarkersTextColor",value:function setMarkersTextColor(textColor){this.options.textColor=textColor;var pulse=document.getElementsByClassName('sm-component-animate-marker__name-container');for(var i=0;i<pulse.length;i++){// @ts-ignore
- pulse[i].style.color=textColor;}}},{key:"_getColorWithOpacity",value:function _getColorWithOpacity(color,opacity){return(0,_util.getColorWithOpacity)(color,opacity);}},{key:"_getTextContainer",value:function _getTextContainer(point,className){var name;if(point.properties&&Object.keys(point.properties).length!==0&&this.options.textField){name=point.properties[this.options.textField];}var nameContainer=document.createElement('div');nameContainer.className="sm-component-animate-marker__name-container sm-component-animate-marker__name-container--".concat(className);this.options.textColor&&(nameContainer.style.color=this.options.textColor);this.options.textFontSize&&(nameContainer.style.fontSize=this.options.textFontSize+'px');var nameSpan=document.createElement('span');nameSpan.className="sm-component-animate-marker__".concat(className," sm-component-animate-marker__name");nameSpan.innerHTML=name||'';nameContainer.appendChild(nameSpan);return nameContainer;}}]);return Marker;}();exports.default=Marker;
- /***/ }),
- /* 18 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _assertThisInitialized; });
- function _assertThisInitialized(self) {
- if (self === void 0) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }
- return self;
- }
- /***/ }),
- /* 19 */
- /***/ (function(module, exports, __webpack_require__) {
- var _typeof = __webpack_require__(62);
- function _getRequireWildcardCache() {
- if (typeof WeakMap !== "function") return null;
- var cache = new WeakMap();
- _getRequireWildcardCache = function _getRequireWildcardCache() {
- return cache;
- };
- return cache;
- }
- function _interopRequireWildcard(obj) {
- if (obj && obj.__esModule) {
- return obj;
- }
- if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
- return {
- "default": obj
- };
- }
- var cache = _getRequireWildcardCache();
- if (cache && cache.has(obj)) {
- return cache.get(obj);
- }
- var newObj = {};
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
- for (var key in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
- if (desc && (desc.get || desc.set)) {
- Object.defineProperty(newObj, key, desc);
- } else {
- newObj[key] = obj[key];
- }
- }
- }
- newObj["default"] = obj;
- if (cache) {
- cache.set(obj, newObj);
- }
- return newObj;
- }
- module.exports = _interopRequireWildcard;
- /***/ }),
- /* 20 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- var R = typeof Reflect === 'object' ? Reflect : null
- var ReflectApply = R && typeof R.apply === 'function'
- ? R.apply
- : function ReflectApply(target, receiver, args) {
- return Function.prototype.apply.call(target, receiver, args);
- }
- var ReflectOwnKeys
- if (R && typeof R.ownKeys === 'function') {
- ReflectOwnKeys = R.ownKeys
- } else if (Object.getOwnPropertySymbols) {
- ReflectOwnKeys = function ReflectOwnKeys(target) {
- return Object.getOwnPropertyNames(target)
- .concat(Object.getOwnPropertySymbols(target));
- };
- } else {
- ReflectOwnKeys = function ReflectOwnKeys(target) {
- return Object.getOwnPropertyNames(target);
- };
- }
- function ProcessEmitWarning(warning) {
- if (console && console.warn) console.warn(warning);
- }
- var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
- return value !== value;
- }
- function EventEmitter() {
- EventEmitter.init.call(this);
- }
- module.exports = EventEmitter;
- // Backwards-compat with node 0.10.x
- EventEmitter.EventEmitter = EventEmitter;
- EventEmitter.prototype._events = undefined;
- EventEmitter.prototype._eventsCount = 0;
- EventEmitter.prototype._maxListeners = undefined;
- // By default EventEmitters will print a warning if more than 10 listeners are
- // added to it. This is a useful default which helps finding memory leaks.
- var defaultMaxListeners = 10;
- Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
- enumerable: true,
- get: function() {
- return defaultMaxListeners;
- },
- set: function(arg) {
- if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
- throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
- }
- defaultMaxListeners = arg;
- }
- });
- EventEmitter.init = function() {
- if (this._events === undefined ||
- this._events === Object.getPrototypeOf(this)._events) {
- this._events = Object.create(null);
- this._eventsCount = 0;
- }
- this._maxListeners = this._maxListeners || undefined;
- };
- // Obviously not all Emitters should be limited to 10. This function allows
- // that to be increased. Set to zero for unlimited.
- EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
- if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
- throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
- }
- this._maxListeners = n;
- return this;
- };
- function $getMaxListeners(that) {
- if (that._maxListeners === undefined)
- return EventEmitter.defaultMaxListeners;
- return that._maxListeners;
- }
- EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
- return $getMaxListeners(this);
- };
- EventEmitter.prototype.emit = function emit(type) {
- var args = [];
- for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
- var doError = (type === 'error');
- var events = this._events;
- if (events !== undefined)
- doError = (doError && events.error === undefined);
- else if (!doError)
- return false;
- // If there is no 'error' event listener then throw.
- if (doError) {
- var er;
- if (args.length > 0)
- er = args[0];
- if (er instanceof Error) {
- // Note: The comments on the `throw` lines are intentional, they show
- // up in Node's output if this results in an unhandled exception.
- throw er; // Unhandled 'error' event
- }
- // At least give some kind of context to the user
- var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
- err.context = er;
- throw err; // Unhandled 'error' event
- }
- var handler = events[type];
- if (handler === undefined)
- return false;
- if (typeof handler === 'function') {
- ReflectApply(handler, this, args);
- } else {
- var len = handler.length;
- var listeners = arrayClone(handler, len);
- for (var i = 0; i < len; ++i)
- ReflectApply(listeners[i], this, args);
- }
- return true;
- };
- function _addListener(target, type, listener, prepend) {
- var m;
- var events;
- var existing;
- if (typeof listener !== 'function') {
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
- }
- events = target._events;
- if (events === undefined) {
- events = target._events = Object.create(null);
- target._eventsCount = 0;
- } else {
- // To avoid recursion in the case that type === "newListener"! Before
- // adding it to the listeners, first emit "newListener".
- if (events.newListener !== undefined) {
- target.emit('newListener', type,
- listener.listener ? listener.listener : listener);
- // Re-assign `events` because a newListener handler could have caused the
- // this._events to be assigned to a new object
- events = target._events;
- }
- existing = events[type];
- }
- if (existing === undefined) {
- // Optimize the case of one listener. Don't need the extra array object.
- existing = events[type] = listener;
- ++target._eventsCount;
- } else {
- if (typeof existing === 'function') {
- // Adding the second element, need to change to array.
- existing = events[type] =
- prepend ? [listener, existing] : [existing, listener];
- // If we've already got an array, just append.
- } else if (prepend) {
- existing.unshift(listener);
- } else {
- existing.push(listener);
- }
- // Check for listener leak
- m = $getMaxListeners(target);
- if (m > 0 && existing.length > m && !existing.warned) {
- existing.warned = true;
- // No error code for this since it is a Warning
- // eslint-disable-next-line no-restricted-syntax
- var w = new Error('Possible EventEmitter memory leak detected. ' +
- existing.length + ' ' + String(type) + ' listeners ' +
- 'added. Use emitter.setMaxListeners() to ' +
- 'increase limit');
- w.name = 'MaxListenersExceededWarning';
- w.emitter = target;
- w.type = type;
- w.count = existing.length;
- ProcessEmitWarning(w);
- }
- }
- return target;
- }
- EventEmitter.prototype.addListener = function addListener(type, listener) {
- return _addListener(this, type, listener, false);
- };
- EventEmitter.prototype.on = EventEmitter.prototype.addListener;
- EventEmitter.prototype.prependListener =
- function prependListener(type, listener) {
- return _addListener(this, type, listener, true);
- };
- function onceWrapper() {
- var args = [];
- for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
- if (!this.fired) {
- this.target.removeListener(this.type, this.wrapFn);
- this.fired = true;
- ReflectApply(this.listener, this.target, args);
- }
- }
- function _onceWrap(target, type, listener) {
- var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
- var wrapped = onceWrapper.bind(state);
- wrapped.listener = listener;
- state.wrapFn = wrapped;
- return wrapped;
- }
- EventEmitter.prototype.once = function once(type, listener) {
- if (typeof listener !== 'function') {
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
- }
- this.on(type, _onceWrap(this, type, listener));
- return this;
- };
- EventEmitter.prototype.prependOnceListener =
- function prependOnceListener(type, listener) {
- if (typeof listener !== 'function') {
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
- }
- this.prependListener(type, _onceWrap(this, type, listener));
- return this;
- };
- // Emits a 'removeListener' event if and only if the listener was removed.
- EventEmitter.prototype.removeListener =
- function removeListener(type, listener) {
- var list, events, position, i, originalListener;
- if (typeof listener !== 'function') {
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
- }
- events = this._events;
- if (events === undefined)
- return this;
- list = events[type];
- if (list === undefined)
- return this;
- if (list === listener || list.listener === listener) {
- if (--this._eventsCount === 0)
- this._events = Object.create(null);
- else {
- delete events[type];
- if (events.removeListener)
- this.emit('removeListener', type, list.listener || listener);
- }
- } else if (typeof list !== 'function') {
- position = -1;
- for (i = list.length - 1; i >= 0; i--) {
- if (list[i] === listener || list[i].listener === listener) {
- originalListener = list[i].listener;
- position = i;
- break;
- }
- }
- if (position < 0)
- return this;
- if (position === 0)
- list.shift();
- else {
- spliceOne(list, position);
- }
- if (list.length === 1)
- events[type] = list[0];
- if (events.removeListener !== undefined)
- this.emit('removeListener', type, originalListener || listener);
- }
- return this;
- };
- EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
- EventEmitter.prototype.removeAllListeners =
- function removeAllListeners(type) {
- var listeners, events, i;
- events = this._events;
- if (events === undefined)
- return this;
- // not listening for removeListener, no need to emit
- if (events.removeListener === undefined) {
- if (arguments.length === 0) {
- this._events = Object.create(null);
- this._eventsCount = 0;
- } else if (events[type] !== undefined) {
- if (--this._eventsCount === 0)
- this._events = Object.create(null);
- else
- delete events[type];
- }
- return this;
- }
- // emit removeListener for all listeners on all events
- if (arguments.length === 0) {
- var keys = Object.keys(events);
- var key;
- for (i = 0; i < keys.length; ++i) {
- key = keys[i];
- if (key === 'removeListener') continue;
- this.removeAllListeners(key);
- }
- this.removeAllListeners('removeListener');
- this._events = Object.create(null);
- this._eventsCount = 0;
- return this;
- }
- listeners = events[type];
- if (typeof listeners === 'function') {
- this.removeListener(type, listeners);
- } else if (listeners !== undefined) {
- // LIFO order
- for (i = listeners.length - 1; i >= 0; i--) {
- this.removeListener(type, listeners[i]);
- }
- }
- return this;
- };
- function _listeners(target, type, unwrap) {
- var events = target._events;
- if (events === undefined)
- return [];
- var evlistener = events[type];
- if (evlistener === undefined)
- return [];
- if (typeof evlistener === 'function')
- return unwrap ? [evlistener.listener || evlistener] : [evlistener];
- return unwrap ?
- unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
- }
- EventEmitter.prototype.listeners = function listeners(type) {
- return _listeners(this, type, true);
- };
- EventEmitter.prototype.rawListeners = function rawListeners(type) {
- return _listeners(this, type, false);
- };
- EventEmitter.listenerCount = function(emitter, type) {
- if (typeof emitter.listenerCount === 'function') {
- return emitter.listenerCount(type);
- } else {
- return listenerCount.call(emitter, type);
- }
- };
- EventEmitter.prototype.listenerCount = listenerCount;
- function listenerCount(type) {
- var events = this._events;
- if (events !== undefined) {
- var evlistener = events[type];
- if (typeof evlistener === 'function') {
- return 1;
- } else if (evlistener !== undefined) {
- return evlistener.length;
- }
- }
- return 0;
- }
- EventEmitter.prototype.eventNames = function eventNames() {
- return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
- };
- function arrayClone(arr, n) {
- var copy = new Array(n);
- for (var i = 0; i < n; ++i)
- copy[i] = arr[i];
- return copy;
- }
- function spliceOne(list, index) {
- for (; index + 1 < list.length; index++)
- list[index] = list[index + 1];
- list.pop();
- }
- function unwrapListeners(arr) {
- var ret = new Array(arr.length);
- for (var i = 0; i < ret.length; ++i) {
- ret[i] = arr[i].listener || arr[i];
- }
- return ret;
- }
- /***/ }),
- /* 21 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- // NOTE: These type checking functions intentionally don't use `instanceof`
- // because it is fragile and can be easily faked with `Object.create()`.
- function isArray(arg) {
- if (Array.isArray) {
- return Array.isArray(arg);
- }
- return objectToString(arg) === '[object Array]';
- }
- exports.isArray = isArray;
- function isBoolean(arg) {
- return typeof arg === 'boolean';
- }
- exports.isBoolean = isBoolean;
- function isNull(arg) {
- return arg === null;
- }
- exports.isNull = isNull;
- function isNullOrUndefined(arg) {
- return arg == null;
- }
- exports.isNullOrUndefined = isNullOrUndefined;
- function isNumber(arg) {
- return typeof arg === 'number';
- }
- exports.isNumber = isNumber;
- function isString(arg) {
- return typeof arg === 'string';
- }
- exports.isString = isString;
- function isSymbol(arg) {
- return typeof arg === 'symbol';
- }
- exports.isSymbol = isSymbol;
- function isUndefined(arg) {
- return arg === void 0;
- }
- exports.isUndefined = isUndefined;
- function isRegExp(re) {
- return objectToString(re) === '[object RegExp]';
- }
- exports.isRegExp = isRegExp;
- function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
- }
- exports.isObject = isObject;
- function isDate(d) {
- return objectToString(d) === '[object Date]';
- }
- exports.isDate = isDate;
- function isError(e) {
- return (objectToString(e) === '[object Error]' || e instanceof Error);
- }
- exports.isError = isError;
- function isFunction(arg) {
- return typeof arg === 'function';
- }
- exports.isFunction = isFunction;
- function isPrimitive(arg) {
- return arg === null ||
- typeof arg === 'boolean' ||
- typeof arg === 'number' ||
- typeof arg === 'string' ||
- typeof arg === 'symbol' || // ES6 symbol
- typeof arg === 'undefined';
- }
- exports.isPrimitive = isPrimitive;
- exports.isBuffer = Buffer.isBuffer;
- function objectToString(o) {
- return Object.prototype.toString.call(o);
- }
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(22).Buffer))
- /***/ }),
- /* 22 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(global) {/*!
- * The buffer module from node.js, for the browser.
- *
- * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * @license MIT
- */
- /* eslint-disable no-proto */
- var base64 = __webpack_require__(81)
- var ieee754 = __webpack_require__(82)
- var isArray = __webpack_require__(44)
- exports.Buffer = Buffer
- exports.SlowBuffer = SlowBuffer
- exports.INSPECT_MAX_BYTES = 50
- /**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- * === true Use Uint8Array implementation (fastest)
- * === false Use Object implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- * incorrect length in some situations.
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
- Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
- ? global.TYPED_ARRAY_SUPPORT
- : typedArraySupport()
- /*
- * Export kMaxLength after typed array support is determined.
- */
- exports.kMaxLength = kMaxLength()
- function typedArraySupport () {
- try {
- var arr = new Uint8Array(1)
- arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
- return arr.foo() === 42 && // typed array instances can be augmented
- typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
- arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
- } catch (e) {
- return false
- }
- }
- function kMaxLength () {
- return Buffer.TYPED_ARRAY_SUPPORT
- ? 0x7fffffff
- : 0x3fffffff
- }
- function createBuffer (that, length) {
- if (kMaxLength() < length) {
- throw new RangeError('Invalid typed array length')
- }
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- // Return an augmented `Uint8Array` instance, for best performance
- that = new Uint8Array(length)
- that.__proto__ = Buffer.prototype
- } else {
- // Fallback: Return an object instance of the Buffer class
- if (that === null) {
- that = new Buffer(length)
- }
- that.length = length
- }
- return that
- }
- /**
- * The Buffer constructor returns instances of `Uint8Array` that have their
- * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
- * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
- * and the `Uint8Array` methods. Square bracket notation works as expected -- it
- * returns a single octet.
- *
- * The `Uint8Array` prototype remains unmodified.
- */
- function Buffer (arg, encodingOrOffset, length) {
- if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
- return new Buffer(arg, encodingOrOffset, length)
- }
- // Common case.
- if (typeof arg === 'number') {
- if (typeof encodingOrOffset === 'string') {
- throw new Error(
- 'If encoding is specified then the first argument must be a string'
- )
- }
- return allocUnsafe(this, arg)
- }
- return from(this, arg, encodingOrOffset, length)
- }
- Buffer.poolSize = 8192 // not used by this implementation
- // TODO: Legacy, not needed anymore. Remove in next major version.
- Buffer._augment = function (arr) {
- arr.__proto__ = Buffer.prototype
- return arr
- }
- function from (that, value, encodingOrOffset, length) {
- if (typeof value === 'number') {
- throw new TypeError('"value" argument must not be a number')
- }
- if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
- return fromArrayBuffer(that, value, encodingOrOffset, length)
- }
- if (typeof value === 'string') {
- return fromString(that, value, encodingOrOffset)
- }
- return fromObject(that, value)
- }
- /**
- * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
- * if value is a number.
- * Buffer.from(str[, encoding])
- * Buffer.from(array)
- * Buffer.from(buffer)
- * Buffer.from(arrayBuffer[, byteOffset[, length]])
- **/
- Buffer.from = function (value, encodingOrOffset, length) {
- return from(null, value, encodingOrOffset, length)
- }
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- Buffer.prototype.__proto__ = Uint8Array.prototype
- Buffer.__proto__ = Uint8Array
- if (typeof Symbol !== 'undefined' && Symbol.species &&
- Buffer[Symbol.species] === Buffer) {
- // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
- Object.defineProperty(Buffer, Symbol.species, {
- value: null,
- configurable: true
- })
- }
- }
- function assertSize (size) {
- if (typeof size !== 'number') {
- throw new TypeError('"size" argument must be a number')
- } else if (size < 0) {
- throw new RangeError('"size" argument must not be negative')
- }
- }
- function alloc (that, size, fill, encoding) {
- assertSize(size)
- if (size <= 0) {
- return createBuffer(that, size)
- }
- if (fill !== undefined) {
- // Only pay attention to encoding if it's a string. This
- // prevents accidentally sending in a number that would
- // be interpretted as a start offset.
- return typeof encoding === 'string'
- ? createBuffer(that, size).fill(fill, encoding)
- : createBuffer(that, size).fill(fill)
- }
- return createBuffer(that, size)
- }
- /**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
- Buffer.alloc = function (size, fill, encoding) {
- return alloc(null, size, fill, encoding)
- }
- function allocUnsafe (that, size) {
- assertSize(size)
- that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
- if (!Buffer.TYPED_ARRAY_SUPPORT) {
- for (var i = 0; i < size; ++i) {
- that[i] = 0
- }
- }
- return that
- }
- /**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
- Buffer.allocUnsafe = function (size) {
- return allocUnsafe(null, size)
- }
- /**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
- Buffer.allocUnsafeSlow = function (size) {
- return allocUnsafe(null, size)
- }
- function fromString (that, string, encoding) {
- if (typeof encoding !== 'string' || encoding === '') {
- encoding = 'utf8'
- }
- if (!Buffer.isEncoding(encoding)) {
- throw new TypeError('"encoding" must be a valid string encoding')
- }
- var length = byteLength(string, encoding) | 0
- that = createBuffer(that, length)
- var actual = that.write(string, encoding)
- if (actual !== length) {
- // Writing a hex string, for example, that contains invalid characters will
- // cause everything after the first invalid character to be ignored. (e.g.
- // 'abxxcd' will be treated as 'ab')
- that = that.slice(0, actual)
- }
- return that
- }
- function fromArrayLike (that, array) {
- var length = array.length < 0 ? 0 : checked(array.length) | 0
- that = createBuffer(that, length)
- for (var i = 0; i < length; i += 1) {
- that[i] = array[i] & 255
- }
- return that
- }
- function fromArrayBuffer (that, array, byteOffset, length) {
- array.byteLength // this throws if `array` is not a valid ArrayBuffer
- if (byteOffset < 0 || array.byteLength < byteOffset) {
- throw new RangeError('\'offset\' is out of bounds')
- }
- if (array.byteLength < byteOffset + (length || 0)) {
- throw new RangeError('\'length\' is out of bounds')
- }
- if (byteOffset === undefined && length === undefined) {
- array = new Uint8Array(array)
- } else if (length === undefined) {
- array = new Uint8Array(array, byteOffset)
- } else {
- array = new Uint8Array(array, byteOffset, length)
- }
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- // Return an augmented `Uint8Array` instance, for best performance
- that = array
- that.__proto__ = Buffer.prototype
- } else {
- // Fallback: Return an object instance of the Buffer class
- that = fromArrayLike(that, array)
- }
- return that
- }
- function fromObject (that, obj) {
- if (Buffer.isBuffer(obj)) {
- var len = checked(obj.length) | 0
- that = createBuffer(that, len)
- if (that.length === 0) {
- return that
- }
- obj.copy(that, 0, 0, len)
- return that
- }
- if (obj) {
- if ((typeof ArrayBuffer !== 'undefined' &&
- obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
- if (typeof obj.length !== 'number' || isnan(obj.length)) {
- return createBuffer(that, 0)
- }
- return fromArrayLike(that, obj)
- }
- if (obj.type === 'Buffer' && isArray(obj.data)) {
- return fromArrayLike(that, obj.data)
- }
- }
- throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
- }
- function checked (length) {
- // Note: cannot use `length < kMaxLength()` here because that fails when
- // length is NaN (which is otherwise coerced to zero.)
- if (length >= kMaxLength()) {
- throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
- 'size: 0x' + kMaxLength().toString(16) + ' bytes')
- }
- return length | 0
- }
- function SlowBuffer (length) {
- if (+length != length) { // eslint-disable-line eqeqeq
- length = 0
- }
- return Buffer.alloc(+length)
- }
- Buffer.isBuffer = function isBuffer (b) {
- return !!(b != null && b._isBuffer)
- }
- Buffer.compare = function compare (a, b) {
- if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
- throw new TypeError('Arguments must be Buffers')
- }
- if (a === b) return 0
- var x = a.length
- var y = b.length
- for (var i = 0, len = Math.min(x, y); i < len; ++i) {
- if (a[i] !== b[i]) {
- x = a[i]
- y = b[i]
- break
- }
- }
- if (x < y) return -1
- if (y < x) return 1
- return 0
- }
- Buffer.isEncoding = function isEncoding (encoding) {
- switch (String(encoding).toLowerCase()) {
- case 'hex':
- case 'utf8':
- case 'utf-8':
- case 'ascii':
- case 'latin1':
- case 'binary':
- case 'base64':
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return true
- default:
- return false
- }
- }
- Buffer.concat = function concat (list, length) {
- if (!isArray(list)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
- if (list.length === 0) {
- return Buffer.alloc(0)
- }
- var i
- if (length === undefined) {
- length = 0
- for (i = 0; i < list.length; ++i) {
- length += list[i].length
- }
- }
- var buffer = Buffer.allocUnsafe(length)
- var pos = 0
- for (i = 0; i < list.length; ++i) {
- var buf = list[i]
- if (!Buffer.isBuffer(buf)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
- buf.copy(buffer, pos)
- pos += buf.length
- }
- return buffer
- }
- function byteLength (string, encoding) {
- if (Buffer.isBuffer(string)) {
- return string.length
- }
- if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
- (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
- return string.byteLength
- }
- if (typeof string !== 'string') {
- string = '' + string
- }
- var len = string.length
- if (len === 0) return 0
- // Use a for loop to avoid recursion
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'ascii':
- case 'latin1':
- case 'binary':
- return len
- case 'utf8':
- case 'utf-8':
- case undefined:
- return utf8ToBytes(string).length
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return len * 2
- case 'hex':
- return len >>> 1
- case 'base64':
- return base64ToBytes(string).length
- default:
- if (loweredCase) return utf8ToBytes(string).length // assume utf8
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
- }
- Buffer.byteLength = byteLength
- function slowToString (encoding, start, end) {
- var loweredCase = false
- // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
- // property of a typed array.
- // This behaves neither like String nor Uint8Array in that we set start/end
- // to their upper/lower bounds if the value passed is out of range.
- // undefined is handled specially as per ECMA-262 6th Edition,
- // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
- if (start === undefined || start < 0) {
- start = 0
- }
- // Return early if start > this.length. Done here to prevent potential uint32
- // coercion fail below.
- if (start > this.length) {
- return ''
- }
- if (end === undefined || end > this.length) {
- end = this.length
- }
- if (end <= 0) {
- return ''
- }
- // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
- end >>>= 0
- start >>>= 0
- if (end <= start) {
- return ''
- }
- if (!encoding) encoding = 'utf8'
- while (true) {
- switch (encoding) {
- case 'hex':
- return hexSlice(this, start, end)
- case 'utf8':
- case 'utf-8':
- return utf8Slice(this, start, end)
- case 'ascii':
- return asciiSlice(this, start, end)
- case 'latin1':
- case 'binary':
- return latin1Slice(this, start, end)
- case 'base64':
- return base64Slice(this, start, end)
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return utf16leSlice(this, start, end)
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = (encoding + '').toLowerCase()
- loweredCase = true
- }
- }
- }
- // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
- // Buffer instances.
- Buffer.prototype._isBuffer = true
- function swap (b, n, m) {
- var i = b[n]
- b[n] = b[m]
- b[m] = i
- }
- Buffer.prototype.swap16 = function swap16 () {
- var len = this.length
- if (len % 2 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 16-bits')
- }
- for (var i = 0; i < len; i += 2) {
- swap(this, i, i + 1)
- }
- return this
- }
- Buffer.prototype.swap32 = function swap32 () {
- var len = this.length
- if (len % 4 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 32-bits')
- }
- for (var i = 0; i < len; i += 4) {
- swap(this, i, i + 3)
- swap(this, i + 1, i + 2)
- }
- return this
- }
- Buffer.prototype.swap64 = function swap64 () {
- var len = this.length
- if (len % 8 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 64-bits')
- }
- for (var i = 0; i < len; i += 8) {
- swap(this, i, i + 7)
- swap(this, i + 1, i + 6)
- swap(this, i + 2, i + 5)
- swap(this, i + 3, i + 4)
- }
- return this
- }
- Buffer.prototype.toString = function toString () {
- var length = this.length | 0
- if (length === 0) return ''
- if (arguments.length === 0) return utf8Slice(this, 0, length)
- return slowToString.apply(this, arguments)
- }
- Buffer.prototype.equals = function equals (b) {
- if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
- if (this === b) return true
- return Buffer.compare(this, b) === 0
- }
- Buffer.prototype.inspect = function inspect () {
- var str = ''
- var max = exports.INSPECT_MAX_BYTES
- if (this.length > 0) {
- str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
- if (this.length > max) str += ' ... '
- }
- return '<Buffer ' + str + '>'
- }
- Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
- if (!Buffer.isBuffer(target)) {
- throw new TypeError('Argument must be a Buffer')
- }
- if (start === undefined) {
- start = 0
- }
- if (end === undefined) {
- end = target ? target.length : 0
- }
- if (thisStart === undefined) {
- thisStart = 0
- }
- if (thisEnd === undefined) {
- thisEnd = this.length
- }
- if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
- throw new RangeError('out of range index')
- }
- if (thisStart >= thisEnd && start >= end) {
- return 0
- }
- if (thisStart >= thisEnd) {
- return -1
- }
- if (start >= end) {
- return 1
- }
- start >>>= 0
- end >>>= 0
- thisStart >>>= 0
- thisEnd >>>= 0
- if (this === target) return 0
- var x = thisEnd - thisStart
- var y = end - start
- var len = Math.min(x, y)
- var thisCopy = this.slice(thisStart, thisEnd)
- var targetCopy = target.slice(start, end)
- for (var i = 0; i < len; ++i) {
- if (thisCopy[i] !== targetCopy[i]) {
- x = thisCopy[i]
- y = targetCopy[i]
- break
- }
- }
- if (x < y) return -1
- if (y < x) return 1
- return 0
- }
- // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
- // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
- //
- // Arguments:
- // - buffer - a Buffer to search
- // - val - a string, Buffer, or number
- // - byteOffset - an index into `buffer`; will be clamped to an int32
- // - encoding - an optional encoding, relevant is val is a string
- // - dir - true for indexOf, false for lastIndexOf
- function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
- // Empty buffer means no match
- if (buffer.length === 0) return -1
- // Normalize byteOffset
- if (typeof byteOffset === 'string') {
- encoding = byteOffset
- byteOffset = 0
- } else if (byteOffset > 0x7fffffff) {
- byteOffset = 0x7fffffff
- } else if (byteOffset < -0x80000000) {
- byteOffset = -0x80000000
- }
- byteOffset = +byteOffset // Coerce to Number.
- if (isNaN(byteOffset)) {
- // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
- byteOffset = dir ? 0 : (buffer.length - 1)
- }
- // Normalize byteOffset: negative offsets start from the end of the buffer
- if (byteOffset < 0) byteOffset = buffer.length + byteOffset
- if (byteOffset >= buffer.length) {
- if (dir) return -1
- else byteOffset = buffer.length - 1
- } else if (byteOffset < 0) {
- if (dir) byteOffset = 0
- else return -1
- }
- // Normalize val
- if (typeof val === 'string') {
- val = Buffer.from(val, encoding)
- }
- // Finally, search either indexOf (if dir is true) or lastIndexOf
- if (Buffer.isBuffer(val)) {
- // Special case: looking for empty string/buffer always fails
- if (val.length === 0) {
- return -1
- }
- return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
- } else if (typeof val === 'number') {
- val = val & 0xFF // Search for a byte value [0-255]
- if (Buffer.TYPED_ARRAY_SUPPORT &&
- typeof Uint8Array.prototype.indexOf === 'function') {
- if (dir) {
- return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
- } else {
- return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
- }
- }
- return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
- }
- throw new TypeError('val must be string, number or Buffer')
- }
- function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
- var indexSize = 1
- var arrLength = arr.length
- var valLength = val.length
- if (encoding !== undefined) {
- encoding = String(encoding).toLowerCase()
- if (encoding === 'ucs2' || encoding === 'ucs-2' ||
- encoding === 'utf16le' || encoding === 'utf-16le') {
- if (arr.length < 2 || val.length < 2) {
- return -1
- }
- indexSize = 2
- arrLength /= 2
- valLength /= 2
- byteOffset /= 2
- }
- }
- function read (buf, i) {
- if (indexSize === 1) {
- return buf[i]
- } else {
- return buf.readUInt16BE(i * indexSize)
- }
- }
- var i
- if (dir) {
- var foundIndex = -1
- for (i = byteOffset; i < arrLength; i++) {
- if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
- if (foundIndex === -1) foundIndex = i
- if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
- } else {
- if (foundIndex !== -1) i -= i - foundIndex
- foundIndex = -1
- }
- }
- } else {
- if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
- for (i = byteOffset; i >= 0; i--) {
- var found = true
- for (var j = 0; j < valLength; j++) {
- if (read(arr, i + j) !== read(val, j)) {
- found = false
- break
- }
- }
- if (found) return i
- }
- }
- return -1
- }
- Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
- return this.indexOf(val, byteOffset, encoding) !== -1
- }
- Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
- }
- Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
- }
- function hexWrite (buf, string, offset, length) {
- offset = Number(offset) || 0
- var remaining = buf.length - offset
- if (!length) {
- length = remaining
- } else {
- length = Number(length)
- if (length > remaining) {
- length = remaining
- }
- }
- // must be an even number of digits
- var strLen = string.length
- if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
- if (length > strLen / 2) {
- length = strLen / 2
- }
- for (var i = 0; i < length; ++i) {
- var parsed = parseInt(string.substr(i * 2, 2), 16)
- if (isNaN(parsed)) return i
- buf[offset + i] = parsed
- }
- return i
- }
- function utf8Write (buf, string, offset, length) {
- return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
- }
- function asciiWrite (buf, string, offset, length) {
- return blitBuffer(asciiToBytes(string), buf, offset, length)
- }
- function latin1Write (buf, string, offset, length) {
- return asciiWrite(buf, string, offset, length)
- }
- function base64Write (buf, string, offset, length) {
- return blitBuffer(base64ToBytes(string), buf, offset, length)
- }
- function ucs2Write (buf, string, offset, length) {
- return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
- }
- Buffer.prototype.write = function write (string, offset, length, encoding) {
- // Buffer#write(string)
- if (offset === undefined) {
- encoding = 'utf8'
- length = this.length
- offset = 0
- // Buffer#write(string, encoding)
- } else if (length === undefined && typeof offset === 'string') {
- encoding = offset
- length = this.length
- offset = 0
- // Buffer#write(string, offset[, length][, encoding])
- } else if (isFinite(offset)) {
- offset = offset | 0
- if (isFinite(length)) {
- length = length | 0
- if (encoding === undefined) encoding = 'utf8'
- } else {
- encoding = length
- length = undefined
- }
- // legacy write(string, encoding, offset, length) - remove in v0.13
- } else {
- throw new Error(
- 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
- )
- }
- var remaining = this.length - offset
- if (length === undefined || length > remaining) length = remaining
- if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
- throw new RangeError('Attempt to write outside buffer bounds')
- }
- if (!encoding) encoding = 'utf8'
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'hex':
- return hexWrite(this, string, offset, length)
- case 'utf8':
- case 'utf-8':
- return utf8Write(this, string, offset, length)
- case 'ascii':
- return asciiWrite(this, string, offset, length)
- case 'latin1':
- case 'binary':
- return latin1Write(this, string, offset, length)
- case 'base64':
- // Warning: maxLength not taken into account in base64Write
- return base64Write(this, string, offset, length)
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return ucs2Write(this, string, offset, length)
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
- }
- Buffer.prototype.toJSON = function toJSON () {
- return {
- type: 'Buffer',
- data: Array.prototype.slice.call(this._arr || this, 0)
- }
- }
- function base64Slice (buf, start, end) {
- if (start === 0 && end === buf.length) {
- return base64.fromByteArray(buf)
- } else {
- return base64.fromByteArray(buf.slice(start, end))
- }
- }
- function utf8Slice (buf, start, end) {
- end = Math.min(buf.length, end)
- var res = []
- var i = start
- while (i < end) {
- var firstByte = buf[i]
- var codePoint = null
- var bytesPerSequence = (firstByte > 0xEF) ? 4
- : (firstByte > 0xDF) ? 3
- : (firstByte > 0xBF) ? 2
- : 1
- if (i + bytesPerSequence <= end) {
- var secondByte, thirdByte, fourthByte, tempCodePoint
- switch (bytesPerSequence) {
- case 1:
- if (firstByte < 0x80) {
- codePoint = firstByte
- }
- break
- case 2:
- secondByte = buf[i + 1]
- if ((secondByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
- if (tempCodePoint > 0x7F) {
- codePoint = tempCodePoint
- }
- }
- break
- case 3:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
- if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
- codePoint = tempCodePoint
- }
- }
- break
- case 4:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- fourthByte = buf[i + 3]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
- if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
- codePoint = tempCodePoint
- }
- }
- }
- }
- if (codePoint === null) {
- // we did not generate a valid codePoint so insert a
- // replacement char (U+FFFD) and advance only 1 byte
- codePoint = 0xFFFD
- bytesPerSequence = 1
- } else if (codePoint > 0xFFFF) {
- // encode to utf16 (surrogate pair dance)
- codePoint -= 0x10000
- res.push(codePoint >>> 10 & 0x3FF | 0xD800)
- codePoint = 0xDC00 | codePoint & 0x3FF
- }
- res.push(codePoint)
- i += bytesPerSequence
- }
- return decodeCodePointsArray(res)
- }
- // Based on http://stackoverflow.com/a/22747272/680742, the browser with
- // the lowest limit is Chrome, with 0x10000 args.
- // We go 1 magnitude less, for safety
- var MAX_ARGUMENTS_LENGTH = 0x1000
- function decodeCodePointsArray (codePoints) {
- var len = codePoints.length
- if (len <= MAX_ARGUMENTS_LENGTH) {
- return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
- }
- // Decode in chunks to avoid "call stack size exceeded".
- var res = ''
- var i = 0
- while (i < len) {
- res += String.fromCharCode.apply(
- String,
- codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
- )
- }
- return res
- }
- function asciiSlice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i] & 0x7F)
- }
- return ret
- }
- function latin1Slice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i])
- }
- return ret
- }
- function hexSlice (buf, start, end) {
- var len = buf.length
- if (!start || start < 0) start = 0
- if (!end || end < 0 || end > len) end = len
- var out = ''
- for (var i = start; i < end; ++i) {
- out += toHex(buf[i])
- }
- return out
- }
- function utf16leSlice (buf, start, end) {
- var bytes = buf.slice(start, end)
- var res = ''
- for (var i = 0; i < bytes.length; i += 2) {
- res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
- }
- return res
- }
- Buffer.prototype.slice = function slice (start, end) {
- var len = this.length
- start = ~~start
- end = end === undefined ? len : ~~end
- if (start < 0) {
- start += len
- if (start < 0) start = 0
- } else if (start > len) {
- start = len
- }
- if (end < 0) {
- end += len
- if (end < 0) end = 0
- } else if (end > len) {
- end = len
- }
- if (end < start) end = start
- var newBuf
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- newBuf = this.subarray(start, end)
- newBuf.__proto__ = Buffer.prototype
- } else {
- var sliceLen = end - start
- newBuf = new Buffer(sliceLen, undefined)
- for (var i = 0; i < sliceLen; ++i) {
- newBuf[i] = this[i + start]
- }
- }
- return newBuf
- }
- /*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
- function checkOffset (offset, ext, length) {
- if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
- if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
- }
- Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
- return val
- }
- Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- checkOffset(offset, byteLength, this.length)
- }
- var val = this[offset + --byteLength]
- var mul = 1
- while (byteLength > 0 && (mul *= 0x100)) {
- val += this[offset + --byteLength] * mul
- }
- return val
- }
- Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 1, this.length)
- return this[offset]
- }
- Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- return this[offset] | (this[offset + 1] << 8)
- }
- Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- return (this[offset] << 8) | this[offset + 1]
- }
- Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ((this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16)) +
- (this[offset + 3] * 0x1000000)
- }
- Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return (this[offset] * 0x1000000) +
- ((this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- this[offset + 3])
- }
- Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
- mul *= 0x80
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
- return val
- }
- Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
- var i = byteLength
- var mul = 1
- var val = this[offset + --i]
- while (i > 0 && (mul *= 0x100)) {
- val += this[offset + --i] * mul
- }
- mul *= 0x80
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
- return val
- }
- Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 1, this.length)
- if (!(this[offset] & 0x80)) return (this[offset])
- return ((0xff - this[offset] + 1) * -1)
- }
- Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset] | (this[offset + 1] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
- }
- Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset + 1] | (this[offset] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
- }
- Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return (this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16) |
- (this[offset + 3] << 24)
- }
- Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return (this[offset] << 24) |
- (this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- (this[offset + 3])
- }
- Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, true, 23, 4)
- }
- Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, false, 23, 4)
- }
- Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, true, 52, 8)
- }
- Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, false, 52, 8)
- }
- function checkInt (buf, value, offset, ext, max, min) {
- if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
- if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
- }
- Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
- var mul = 1
- var i = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
- return offset + byteLength
- }
- Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
- var i = byteLength - 1
- var mul = 1
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
- return offset + byteLength
- }
- Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
- if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
- this[offset] = (value & 0xff)
- return offset + 1
- }
- function objectWriteUInt16 (buf, value, offset, littleEndian) {
- if (value < 0) value = 0xffff + value + 1
- for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
- buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
- (littleEndian ? i : 1 - i) * 8
- }
- }
- Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- } else {
- objectWriteUInt16(this, value, offset, true)
- }
- return offset + 2
- }
- Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- } else {
- objectWriteUInt16(this, value, offset, false)
- }
- return offset + 2
- }
- function objectWriteUInt32 (buf, value, offset, littleEndian) {
- if (value < 0) value = 0xffffffff + value + 1
- for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
- buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
- }
- }
- Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset + 3] = (value >>> 24)
- this[offset + 2] = (value >>> 16)
- this[offset + 1] = (value >>> 8)
- this[offset] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, true)
- }
- return offset + 4
- }
- Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, false)
- }
- return offset + 4
- }
- Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) {
- var limit = Math.pow(2, 8 * byteLength - 1)
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
- var i = 0
- var mul = 1
- var sub = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
- return offset + byteLength
- }
- Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) {
- var limit = Math.pow(2, 8 * byteLength - 1)
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
- var i = byteLength - 1
- var mul = 1
- var sub = 0
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
- return offset + byteLength
- }
- Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
- if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
- if (value < 0) value = 0xff + value + 1
- this[offset] = (value & 0xff)
- return offset + 1
- }
- Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- } else {
- objectWriteUInt16(this, value, offset, true)
- }
- return offset + 2
- }
- Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- } else {
- objectWriteUInt16(this, value, offset, false)
- }
- return offset + 2
- }
- Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- this[offset + 2] = (value >>> 16)
- this[offset + 3] = (value >>> 24)
- } else {
- objectWriteUInt32(this, value, offset, true)
- }
- return offset + 4
- }
- Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- if (value < 0) value = 0xffffffff + value + 1
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, false)
- }
- return offset + 4
- }
- function checkIEEE754 (buf, value, offset, ext, max, min) {
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
- if (offset < 0) throw new RangeError('Index out of range')
- }
- function writeFloat (buf, value, offset, littleEndian, noAssert) {
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
- }
- ieee754.write(buf, value, offset, littleEndian, 23, 4)
- return offset + 4
- }
- Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
- return writeFloat(this, value, offset, true, noAssert)
- }
- Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
- return writeFloat(this, value, offset, false, noAssert)
- }
- function writeDouble (buf, value, offset, littleEndian, noAssert) {
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
- }
- ieee754.write(buf, value, offset, littleEndian, 52, 8)
- return offset + 8
- }
- Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
- return writeDouble(this, value, offset, true, noAssert)
- }
- Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
- return writeDouble(this, value, offset, false, noAssert)
- }
- // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
- Buffer.prototype.copy = function copy (target, targetStart, start, end) {
- if (!start) start = 0
- if (!end && end !== 0) end = this.length
- if (targetStart >= target.length) targetStart = target.length
- if (!targetStart) targetStart = 0
- if (end > 0 && end < start) end = start
- // Copy 0 bytes; we're done
- if (end === start) return 0
- if (target.length === 0 || this.length === 0) return 0
- // Fatal error conditions
- if (targetStart < 0) {
- throw new RangeError('targetStart out of bounds')
- }
- if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
- if (end < 0) throw new RangeError('sourceEnd out of bounds')
- // Are we oob?
- if (end > this.length) end = this.length
- if (target.length - targetStart < end - start) {
- end = target.length - targetStart + start
- }
- var len = end - start
- var i
- if (this === target && start < targetStart && targetStart < end) {
- // descending copy from end
- for (i = len - 1; i >= 0; --i) {
- target[i + targetStart] = this[i + start]
- }
- } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
- // ascending copy from start
- for (i = 0; i < len; ++i) {
- target[i + targetStart] = this[i + start]
- }
- } else {
- Uint8Array.prototype.set.call(
- target,
- this.subarray(start, start + len),
- targetStart
- )
- }
- return len
- }
- // Usage:
- // buffer.fill(number[, offset[, end]])
- // buffer.fill(buffer[, offset[, end]])
- // buffer.fill(string[, offset[, end]][, encoding])
- Buffer.prototype.fill = function fill (val, start, end, encoding) {
- // Handle string cases:
- if (typeof val === 'string') {
- if (typeof start === 'string') {
- encoding = start
- start = 0
- end = this.length
- } else if (typeof end === 'string') {
- encoding = end
- end = this.length
- }
- if (val.length === 1) {
- var code = val.charCodeAt(0)
- if (code < 256) {
- val = code
- }
- }
- if (encoding !== undefined && typeof encoding !== 'string') {
- throw new TypeError('encoding must be a string')
- }
- if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
- throw new TypeError('Unknown encoding: ' + encoding)
- }
- } else if (typeof val === 'number') {
- val = val & 255
- }
- // Invalid ranges are not set to a default, so can range check early.
- if (start < 0 || this.length < start || this.length < end) {
- throw new RangeError('Out of range index')
- }
- if (end <= start) {
- return this
- }
- start = start >>> 0
- end = end === undefined ? this.length : end >>> 0
- if (!val) val = 0
- var i
- if (typeof val === 'number') {
- for (i = start; i < end; ++i) {
- this[i] = val
- }
- } else {
- var bytes = Buffer.isBuffer(val)
- ? val
- : utf8ToBytes(new Buffer(val, encoding).toString())
- var len = bytes.length
- for (i = 0; i < end - start; ++i) {
- this[i + start] = bytes[i % len]
- }
- }
- return this
- }
- // HELPER FUNCTIONS
- // ================
- var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
- function base64clean (str) {
- // Node strips out invalid characters like \n and \t from the string, base64-js does not
- str = stringtrim(str).replace(INVALID_BASE64_RE, '')
- // Node converts strings with length < 2 to ''
- if (str.length < 2) return ''
- // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
- while (str.length % 4 !== 0) {
- str = str + '='
- }
- return str
- }
- function stringtrim (str) {
- if (str.trim) return str.trim()
- return str.replace(/^\s+|\s+$/g, '')
- }
- function toHex (n) {
- if (n < 16) return '0' + n.toString(16)
- return n.toString(16)
- }
- function utf8ToBytes (string, units) {
- units = units || Infinity
- var codePoint
- var length = string.length
- var leadSurrogate = null
- var bytes = []
- for (var i = 0; i < length; ++i) {
- codePoint = string.charCodeAt(i)
- // is surrogate component
- if (codePoint > 0xD7FF && codePoint < 0xE000) {
- // last char was a lead
- if (!leadSurrogate) {
- // no lead yet
- if (codePoint > 0xDBFF) {
- // unexpected trail
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- } else if (i + 1 === length) {
- // unpaired lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- }
- // valid lead
- leadSurrogate = codePoint
- continue
- }
- // 2 leads in a row
- if (codePoint < 0xDC00) {
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- leadSurrogate = codePoint
- continue
- }
- // valid surrogate pair
- codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
- } else if (leadSurrogate) {
- // valid bmp char, but last char was a lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- }
- leadSurrogate = null
- // encode utf8
- if (codePoint < 0x80) {
- if ((units -= 1) < 0) break
- bytes.push(codePoint)
- } else if (codePoint < 0x800) {
- if ((units -= 2) < 0) break
- bytes.push(
- codePoint >> 0x6 | 0xC0,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x10000) {
- if ((units -= 3) < 0) break
- bytes.push(
- codePoint >> 0xC | 0xE0,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x110000) {
- if ((units -= 4) < 0) break
- bytes.push(
- codePoint >> 0x12 | 0xF0,
- codePoint >> 0xC & 0x3F | 0x80,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else {
- throw new Error('Invalid code point')
- }
- }
- return bytes
- }
- function asciiToBytes (str) {
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- // Node's code seems to be doing this and not & 0x7F..
- byteArray.push(str.charCodeAt(i) & 0xFF)
- }
- return byteArray
- }
- function utf16leToBytes (str, units) {
- var c, hi, lo
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- if ((units -= 2) < 0) break
- c = str.charCodeAt(i)
- hi = c >> 8
- lo = c % 256
- byteArray.push(lo)
- byteArray.push(hi)
- }
- return byteArray
- }
- function base64ToBytes (str) {
- return base64.toByteArray(base64clean(str))
- }
- function blitBuffer (src, dst, offset, length) {
- for (var i = 0; i < length; ++i) {
- if ((i + offset >= dst.length) || (i >= src.length)) break
- dst[i + offset] = src[i]
- }
- return i
- }
- function isnan (val) {
- return val !== val // eslint-disable-line no-self-compare
- }
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 23 */
- /***/ (function(module, exports) {
- // shim for using process in browser
- var process = module.exports = {};
- // cached from whatever global is present so that test runners that stub it
- // don't break things. But we need to wrap it in a try catch in case it is
- // wrapped in strict mode code which doesn't define any globals. It's inside a
- // function because try/catches deoptimize in certain engines.
- var cachedSetTimeout;
- var cachedClearTimeout;
- function defaultSetTimout() {
- throw new Error('setTimeout has not been defined');
- }
- function defaultClearTimeout () {
- throw new Error('clearTimeout has not been defined');
- }
- (function () {
- try {
- if (typeof setTimeout === 'function') {
- cachedSetTimeout = setTimeout;
- } else {
- cachedSetTimeout = defaultSetTimout;
- }
- } catch (e) {
- cachedSetTimeout = defaultSetTimout;
- }
- try {
- if (typeof clearTimeout === 'function') {
- cachedClearTimeout = clearTimeout;
- } else {
- cachedClearTimeout = defaultClearTimeout;
- }
- } catch (e) {
- cachedClearTimeout = defaultClearTimeout;
- }
- } ())
- function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- //normal enviroments in sane situations
- return setTimeout(fun, 0);
- }
- // if setTimeout wasn't available but was latter defined
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
- cachedSetTimeout = setTimeout;
- return setTimeout(fun, 0);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedSetTimeout(fun, 0);
- } catch(e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedSetTimeout.call(null, fun, 0);
- } catch(e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
- return cachedSetTimeout.call(this, fun, 0);
- }
- }
- }
- function runClearTimeout(marker) {
- if (cachedClearTimeout === clearTimeout) {
- //normal enviroments in sane situations
- return clearTimeout(marker);
- }
- // if clearTimeout wasn't available but was latter defined
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
- cachedClearTimeout = clearTimeout;
- return clearTimeout(marker);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedClearTimeout(marker);
- } catch (e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedClearTimeout.call(null, marker);
- } catch (e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
- return cachedClearTimeout.call(this, marker);
- }
- }
- }
- var queue = [];
- var draining = false;
- var currentQueue;
- var queueIndex = -1;
- function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
- }
- function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
- var len = queue.length;
- while(len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
- }
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
- }
- process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
- }
- };
- // v8 likes predictible objects
- function Item(fun, array) {
- this.fun = fun;
- this.array = array;
- }
- Item.prototype.run = function () {
- this.fun.apply(null, this.array);
- };
- process.title = 'browser';
- process.browser = true;
- process.env = {};
- process.argv = [];
- process.version = ''; // empty string to avoid regexp issues
- process.versions = {};
- function noop() {}
- process.on = noop;
- process.addListener = noop;
- process.once = noop;
- process.off = noop;
- process.removeListener = noop;
- process.removeAllListeners = noop;
- process.emit = noop;
- process.prependListener = noop;
- process.prependOnceListener = noop;
- process.listeners = function (name) { return [] }
- process.binding = function (name) {
- throw new Error('process.binding is not supported');
- };
- process.cwd = function () { return '/' };
- process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
- };
- process.umask = function() { return 0; };
- /***/ }),
- /* 24 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(process) {
- if (typeof process === 'undefined' ||
- !process.version ||
- process.version.indexOf('v0.') === 0 ||
- process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
- module.exports = { nextTick: nextTick };
- } else {
- module.exports = process
- }
- function nextTick(fn, arg1, arg2, arg3) {
- if (typeof fn !== 'function') {
- throw new TypeError('"callback" argument must be a function');
- }
- var len = arguments.length;
- var args, i;
- switch (len) {
- case 0:
- case 1:
- return process.nextTick(fn);
- case 2:
- return process.nextTick(function afterTickOne() {
- fn.call(null, arg1);
- });
- case 3:
- return process.nextTick(function afterTickTwo() {
- fn.call(null, arg1, arg2);
- });
- case 4:
- return process.nextTick(function afterTickThree() {
- fn.call(null, arg1, arg2, arg3);
- });
- default:
- args = new Array(len - 1);
- i = 0;
- while (i < args.length) {
- args[i++] = arguments[i];
- }
- return process.nextTick(function afterTick() {
- fn.apply(null, args);
- });
- }
- }
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(23)))
- /***/ }),
- /* 25 */
- /***/ (function(module, exports, __webpack_require__) {
- /* eslint-disable node/no-deprecated-api */
- var buffer = __webpack_require__(22)
- var Buffer = buffer.Buffer
- // alternative to using Object.keys for old browsers
- function copyProps (src, dst) {
- for (var key in src) {
- dst[key] = src[key]
- }
- }
- if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
- module.exports = buffer
- } else {
- // Copy properties from require('buffer')
- copyProps(buffer, exports)
- exports.Buffer = SafeBuffer
- }
- function SafeBuffer (arg, encodingOrOffset, length) {
- return Buffer(arg, encodingOrOffset, length)
- }
- // Copy static methods from Buffer
- copyProps(Buffer, SafeBuffer)
- SafeBuffer.from = function (arg, encodingOrOffset, length) {
- if (typeof arg === 'number') {
- throw new TypeError('Argument must not be a number')
- }
- return Buffer(arg, encodingOrOffset, length)
- }
- SafeBuffer.alloc = function (size, fill, encoding) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
- }
- var buf = Buffer(size)
- if (fill !== undefined) {
- if (typeof encoding === 'string') {
- buf.fill(fill, encoding)
- } else {
- buf.fill(fill)
- }
- } else {
- buf.fill(0)
- }
- return buf
- }
- SafeBuffer.allocUnsafe = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
- }
- return Buffer(size)
- }
- SafeBuffer.allocUnsafeSlow = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
- }
- return buffer.SlowBuffer(size)
- }
- /***/ }),
- /* 26 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as references for various `Number` constants. */
- var INFINITY = 1 / 0;
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
- /** Used to compose unicode character classes. */
- var rsAstralRange = '\\ud800-\\udfff',
- rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
- rsComboSymbolsRange = '\\u20d0-\\u20f0',
- rsVarRange = '\\ufe0e\\ufe0f';
- /** Used to compose unicode capture groups. */
- var rsAstral = '[' + rsAstralRange + ']',
- rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
- rsFitz = '\\ud83c[\\udffb-\\udfff]',
- rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
- rsNonAstral = '[^' + rsAstralRange + ']',
- rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
- rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
- rsZWJ = '\\u200d';
- /** Used to compose unicode regexes. */
- var reOptMod = rsModifier + '?',
- rsOptVar = '[' + rsVarRange + ']?',
- rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
- rsSeq = rsOptVar + reOptMod + rsOptJoin,
- rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
- /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
- var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
- /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
- var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /**
- * Converts an ASCII `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function asciiToArray(string) {
- return string.split('');
- }
- /**
- * Checks if `string` contains Unicode symbols.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {boolean} Returns `true` if a symbol is found, else `false`.
- */
- function hasUnicode(string) {
- return reHasUnicode.test(string);
- }
- /**
- * Converts `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function stringToArray(string) {
- return hasUnicode(string)
- ? unicodeToArray(string)
- : asciiToArray(string);
- }
- /**
- * Converts a Unicode `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function unicodeToArray(string) {
- return string.match(reUnicode) || [];
- }
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /** Built-in value references. */
- var Symbol = root.Symbol;
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
- /**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
- function baseSlice(array, start, end) {
- var index = -1,
- length = array.length;
- if (start < 0) {
- start = -start > length ? 0 : (length + start);
- }
- end = end > length ? length : end;
- if (end < 0) {
- end += length;
- }
- length = start > end ? 0 : ((end - start) >>> 0);
- start >>>= 0;
- var result = Array(length);
- while (++index < length) {
- result[index] = array[index + start];
- }
- return result;
- }
- /**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
- function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isSymbol(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
- /**
- * Casts `array` to a slice if it's needed.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {number} start The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the cast slice.
- */
- function castSlice(array, start, end) {
- var length = array.length;
- end = end === undefined ? length : end;
- return (!start && end >= length) ? array : baseSlice(array, start, end);
- }
- /**
- * Creates a function like `_.lowerFirst`.
- *
- * @private
- * @param {string} methodName The name of the `String` case method to use.
- * @returns {Function} Returns the new case function.
- */
- function createCaseFirst(methodName) {
- return function(string) {
- string = toString(string);
- var strSymbols = hasUnicode(string)
- ? stringToArray(string)
- : undefined;
- var chr = strSymbols
- ? strSymbols[0]
- : string.charAt(0);
- var trailing = strSymbols
- ? castSlice(strSymbols, 1).join('')
- : string.slice(1);
- return chr[methodName]() + trailing;
- };
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
- }
- /**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- return value == null ? '' : baseToString(value);
- }
- /**
- * Converts the first character of `string` to upper case and the remaining
- * to lower case.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category String
- * @param {string} [string=''] The string to capitalize.
- * @returns {string} Returns the capitalized string.
- * @example
- *
- * _.capitalize('FRED');
- * // => 'Fred'
- */
- function capitalize(string) {
- return upperFirst(toString(string).toLowerCase());
- }
- /**
- * Converts the first character of `string` to upper case.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the converted string.
- * @example
- *
- * _.upperFirst('fred');
- * // => 'Fred'
- *
- * _.upperFirst('FRED');
- * // => 'FRED'
- */
- var upperFirst = createCaseFirst('toUpperCase');
- module.exports = capitalize;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 27 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _events=__webpack_require__(20);var _SourceListModel=_interopRequireDefault(__webpack_require__(39));var _globalEvent=_interopRequireDefault(__webpack_require__(40));var MapEvent=/*#__PURE__*/function(_EventEmitter){(0,_inherits2.default)(MapEvent,_EventEmitter);var _super=(0,_createSuper2.default)(MapEvent);function MapEvent(){var _this;(0,_classCallCheck2.default)(this,MapEvent);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.mapCache={};_this.webMapCache={};return _this;}(0,_createClass2.default)(MapEvent,[{key:"getMap",value:function getMap(mapTarget){return this.mapCache[mapTarget];}},{key:"getWebMap",value:function getWebMap(webmapTarget){return this.webMapCache[webmapTarget];}},{key:"getAllMaps",value:function getAllMaps(){return this.mapCache;}},{key:"getAllWebMap",value:function getAllWebMap(){return this.webMapCache;}},{key:"setMap",value:function setMap(mapTarget,map){this.mapCache[mapTarget]=map;}},{key:"setWebMap",value:function setWebMap(webmapTarget,webmap){this.webMapCache[webmapTarget]=webmap;}},{key:"deleteMap",value:function deleteMap(mapTarget){_globalEvent.default.emit('delete-map',mapTarget);// drawEvent.$options.deletDrawOfMap(mapTarget);
- delete this.mapCache[mapTarget];}},{key:"deleteWebMap",value:function deleteWebMap(webmapTarget){delete this.webMapCache[webmapTarget];}},{key:"getMapSource",value:function getMapSource(mapTarget){var sources=[];var map=this.getMap(mapTarget);if(map){var sourceListModel=new _SourceListModel.default({map:map});var sourceList=sourceListModel.getSourceList();for(var key in sourceList){if(key){var layers=sourceList[key].layers||[];layers.forEach(function(item){if(item.source&&item.type!=='raster'){sources.push(item.source);}});}}}return sources;}}]);return MapEvent;}(_events.EventEmitter);var _default=new MapEvent();exports.default=_default;
- /***/ }),
- /* 28 */
- /***/ (function(module, exports, __webpack_require__) {
- exports = module.exports = __webpack_require__(45);
- exports.Stream = exports;
- exports.Readable = exports;
- exports.Writable = __webpack_require__(29);
- exports.Duplex = __webpack_require__(14);
- exports.Transform = __webpack_require__(48);
- exports.PassThrough = __webpack_require__(90);
- /***/ }),
- /* 29 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- // A bit simpler than readable streams.
- // Implement an async ._write(chunk, encoding, cb), and it'll handle all
- // the drain event emission and buffering.
- /*<replacement>*/
- var pna = __webpack_require__(24);
- /*</replacement>*/
- module.exports = Writable;
- /* <replacement> */
- function WriteReq(chunk, encoding, cb) {
- this.chunk = chunk;
- this.encoding = encoding;
- this.callback = cb;
- this.next = null;
- }
- // It seems a linked list but it is not
- // there will be only 2 of these for each stream
- function CorkedRequest(state) {
- var _this = this;
- this.next = null;
- this.entry = null;
- this.finish = function () {
- onCorkedFinish(_this, state);
- };
- }
- /* </replacement> */
- /*<replacement>*/
- var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
- /*</replacement>*/
- /*<replacement>*/
- var Duplex;
- /*</replacement>*/
- Writable.WritableState = WritableState;
- /*<replacement>*/
- var util = __webpack_require__(21);
- util.inherits = __webpack_require__(16);
- /*</replacement>*/
- /*<replacement>*/
- var internalUtil = {
- deprecate: __webpack_require__(89)
- };
- /*</replacement>*/
- /*<replacement>*/
- var Stream = __webpack_require__(46);
- /*</replacement>*/
- /*<replacement>*/
- var Buffer = __webpack_require__(25).Buffer;
- var OurUint8Array = global.Uint8Array || function () {};
- function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk);
- }
- function _isUint8Array(obj) {
- return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
- }
- /*</replacement>*/
- var destroyImpl = __webpack_require__(47);
- util.inherits(Writable, Stream);
- function nop() {}
- function WritableState(options, stream) {
- Duplex = Duplex || __webpack_require__(14);
- options = options || {};
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- var isDuplex = stream instanceof Duplex;
- // object stream flag to indicate whether or not this stream
- // contains buffers or objects.
- this.objectMode = !!options.objectMode;
- if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
- // the point at which write() starts returning false
- // Note: 0 is a valid value, means that we always return false if
- // the entire buffer is not flushed immediately on write()
- var hwm = options.highWaterMark;
- var writableHwm = options.writableHighWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
- if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
- // cast to ints.
- this.highWaterMark = Math.floor(this.highWaterMark);
- // if _final has been called
- this.finalCalled = false;
- // drain event flag.
- this.needDrain = false;
- // at the start of calling end()
- this.ending = false;
- // when end() has been called, and returned
- this.ended = false;
- // when 'finish' is emitted
- this.finished = false;
- // has it been destroyed
- this.destroyed = false;
- // should we decode strings into buffers before passing to _write?
- // this is here so that some node-core streams can optimize string
- // handling at a lower level.
- var noDecode = options.decodeStrings === false;
- this.decodeStrings = !noDecode;
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
- // not an actual buffer we keep track of, but a measurement
- // of how much we're waiting to get pushed to some underlying
- // socket or file.
- this.length = 0;
- // a flag to see when we're in the middle of a write.
- this.writing = false;
- // when true all writes will be buffered until .uncork() call
- this.corked = 0;
- // a flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true;
- // a flag to know if we're processing previously buffered items, which
- // may call the _write() callback in the same tick, so that we don't
- // end up in an overlapped onwrite situation.
- this.bufferProcessing = false;
- // the callback that's passed to _write(chunk,cb)
- this.onwrite = function (er) {
- onwrite(stream, er);
- };
- // the callback that the user supplies to write(chunk,encoding,cb)
- this.writecb = null;
- // the amount that is being written when _write is called.
- this.writelen = 0;
- this.bufferedRequest = null;
- this.lastBufferedRequest = null;
- // number of pending user-supplied write callbacks
- // this must be 0 before 'finish' can be emitted
- this.pendingcb = 0;
- // emit prefinish if the only thing we're waiting for is _write cbs
- // This is relevant for synchronous Transform streams
- this.prefinished = false;
- // True if the error was already emitted and should not be thrown again
- this.errorEmitted = false;
- // count buffered requests
- this.bufferedRequestCount = 0;
- // allocate the first CorkedRequest, there is always
- // one allocated and free to use, and we maintain at most two
- this.corkedRequestsFree = new CorkedRequest(this);
- }
- WritableState.prototype.getBuffer = function getBuffer() {
- var current = this.bufferedRequest;
- var out = [];
- while (current) {
- out.push(current);
- current = current.next;
- }
- return out;
- };
- (function () {
- try {
- Object.defineProperty(WritableState.prototype, 'buffer', {
- get: internalUtil.deprecate(function () {
- return this.getBuffer();
- }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
- });
- } catch (_) {}
- })();
- // Test _writableState for inheritance to account for Duplex streams,
- // whose prototype chain only points to Readable.
- var realHasInstance;
- if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
- realHasInstance = Function.prototype[Symbol.hasInstance];
- Object.defineProperty(Writable, Symbol.hasInstance, {
- value: function (object) {
- if (realHasInstance.call(this, object)) return true;
- if (this !== Writable) return false;
- return object && object._writableState instanceof WritableState;
- }
- });
- } else {
- realHasInstance = function (object) {
- return object instanceof this;
- };
- }
- function Writable(options) {
- Duplex = Duplex || __webpack_require__(14);
- // Writable ctor is applied to Duplexes, too.
- // `realHasInstance` is necessary because using plain `instanceof`
- // would return false, as no `_writableState` property is attached.
- // Trying to use the custom `instanceof` for Writable here will also break the
- // Node.js LazyTransform implementation, which has a non-trivial getter for
- // `_writableState` that would lead to infinite recursion.
- if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
- return new Writable(options);
- }
- this._writableState = new WritableState(options, this);
- // legacy.
- this.writable = true;
- if (options) {
- if (typeof options.write === 'function') this._write = options.write;
- if (typeof options.writev === 'function') this._writev = options.writev;
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
- if (typeof options.final === 'function') this._final = options.final;
- }
- Stream.call(this);
- }
- // Otherwise people can pipe Writable streams, which is just wrong.
- Writable.prototype.pipe = function () {
- this.emit('error', new Error('Cannot pipe, not readable'));
- };
- function writeAfterEnd(stream, cb) {
- var er = new Error('write after end');
- // TODO: defer error events consistently everywhere, not just the cb
- stream.emit('error', er);
- pna.nextTick(cb, er);
- }
- // Checks that a user-supplied chunk is valid, especially for the particular
- // mode the stream is in. Currently this means that `null` is never accepted
- // and undefined/non-string values are only allowed in object mode.
- function validChunk(stream, state, chunk, cb) {
- var valid = true;
- var er = false;
- if (chunk === null) {
- er = new TypeError('May not write null values to stream');
- } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
- }
- if (er) {
- stream.emit('error', er);
- pna.nextTick(cb, er);
- valid = false;
- }
- return valid;
- }
- Writable.prototype.write = function (chunk, encoding, cb) {
- var state = this._writableState;
- var ret = false;
- var isBuf = !state.objectMode && _isUint8Array(chunk);
- if (isBuf && !Buffer.isBuffer(chunk)) {
- chunk = _uint8ArrayToBuffer(chunk);
- }
- if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
- if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
- if (typeof cb !== 'function') cb = nop;
- if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
- state.pendingcb++;
- ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
- }
- return ret;
- };
- Writable.prototype.cork = function () {
- var state = this._writableState;
- state.corked++;
- };
- Writable.prototype.uncork = function () {
- var state = this._writableState;
- if (state.corked) {
- state.corked--;
- if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
- }
- };
- Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === 'string') encoding = encoding.toLowerCase();
- if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
- this._writableState.defaultEncoding = encoding;
- return this;
- };
- function decodeChunk(state, chunk, encoding) {
- if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
- chunk = Buffer.from(chunk, encoding);
- }
- return chunk;
- }
- Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._writableState.highWaterMark;
- }
- });
- // if we're already writing something, then just put this
- // in the queue, and wait our turn. Otherwise, call _write
- // If we return false, then we need a drain event, so set that flag.
- function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
- if (!isBuf) {
- var newChunk = decodeChunk(state, chunk, encoding);
- if (chunk !== newChunk) {
- isBuf = true;
- encoding = 'buffer';
- chunk = newChunk;
- }
- }
- var len = state.objectMode ? 1 : chunk.length;
- state.length += len;
- var ret = state.length < state.highWaterMark;
- // we must ensure that previous needDrain will not be reset to false.
- if (!ret) state.needDrain = true;
- if (state.writing || state.corked) {
- var last = state.lastBufferedRequest;
- state.lastBufferedRequest = {
- chunk: chunk,
- encoding: encoding,
- isBuf: isBuf,
- callback: cb,
- next: null
- };
- if (last) {
- last.next = state.lastBufferedRequest;
- } else {
- state.bufferedRequest = state.lastBufferedRequest;
- }
- state.bufferedRequestCount += 1;
- } else {
- doWrite(stream, state, false, len, chunk, encoding, cb);
- }
- return ret;
- }
- function doWrite(stream, state, writev, len, chunk, encoding, cb) {
- state.writelen = len;
- state.writecb = cb;
- state.writing = true;
- state.sync = true;
- if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
- }
- function onwriteError(stream, state, sync, er, cb) {
- --state.pendingcb;
- if (sync) {
- // defer the callback if we are being called synchronously
- // to avoid piling up things on the stack
- pna.nextTick(cb, er);
- // this can emit finish, and it will always happen
- // after error
- pna.nextTick(finishMaybe, stream, state);
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
- } else {
- // the caller expect this to happen before if
- // it is async
- cb(er);
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
- // this can emit finish, but finish must
- // always follow error
- finishMaybe(stream, state);
- }
- }
- function onwriteStateUpdate(state) {
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
- }
- function onwrite(stream, er) {
- var state = stream._writableState;
- var sync = state.sync;
- var cb = state.writecb;
- onwriteStateUpdate(state);
- if (er) onwriteError(stream, state, sync, er, cb);else {
- // Check if we're actually ready to finish, but don't emit yet
- var finished = needFinish(state);
- if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
- clearBuffer(stream, state);
- }
- if (sync) {
- /*<replacement>*/
- asyncWrite(afterWrite, stream, state, finished, cb);
- /*</replacement>*/
- } else {
- afterWrite(stream, state, finished, cb);
- }
- }
- }
- function afterWrite(stream, state, finished, cb) {
- if (!finished) onwriteDrain(stream, state);
- state.pendingcb--;
- cb();
- finishMaybe(stream, state);
- }
- // Must force callback to be called on nextTick, so that we don't
- // emit 'drain' before the write() consumer gets the 'false' return
- // value, and has a chance to attach a 'drain' listener.
- function onwriteDrain(stream, state) {
- if (state.length === 0 && state.needDrain) {
- state.needDrain = false;
- stream.emit('drain');
- }
- }
- // if there's something in the buffer waiting, then process it
- function clearBuffer(stream, state) {
- state.bufferProcessing = true;
- var entry = state.bufferedRequest;
- if (stream._writev && entry && entry.next) {
- // Fast case, write everything using _writev()
- var l = state.bufferedRequestCount;
- var buffer = new Array(l);
- var holder = state.corkedRequestsFree;
- holder.entry = entry;
- var count = 0;
- var allBuffers = true;
- while (entry) {
- buffer[count] = entry;
- if (!entry.isBuf) allBuffers = false;
- entry = entry.next;
- count += 1;
- }
- buffer.allBuffers = allBuffers;
- doWrite(stream, state, true, state.length, buffer, '', holder.finish);
- // doWrite is almost always async, defer these to save a bit of time
- // as the hot path ends with doWrite
- state.pendingcb++;
- state.lastBufferedRequest = null;
- if (holder.next) {
- state.corkedRequestsFree = holder.next;
- holder.next = null;
- } else {
- state.corkedRequestsFree = new CorkedRequest(state);
- }
- state.bufferedRequestCount = 0;
- } else {
- // Slow case, write chunks one-by-one
- while (entry) {
- var chunk = entry.chunk;
- var encoding = entry.encoding;
- var cb = entry.callback;
- var len = state.objectMode ? 1 : chunk.length;
- doWrite(stream, state, false, len, chunk, encoding, cb);
- entry = entry.next;
- state.bufferedRequestCount--;
- // if we didn't call the onwrite immediately, then
- // it means that we need to wait until it does.
- // also, that means that the chunk and cb are currently
- // being processed, so move the buffer counter past them.
- if (state.writing) {
- break;
- }
- }
- if (entry === null) state.lastBufferedRequest = null;
- }
- state.bufferedRequest = entry;
- state.bufferProcessing = false;
- }
- Writable.prototype._write = function (chunk, encoding, cb) {
- cb(new Error('_write() is not implemented'));
- };
- Writable.prototype._writev = null;
- Writable.prototype.end = function (chunk, encoding, cb) {
- var state = this._writableState;
- if (typeof chunk === 'function') {
- cb = chunk;
- chunk = null;
- encoding = null;
- } else if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
- if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
- // .end() fully uncorks
- if (state.corked) {
- state.corked = 1;
- this.uncork();
- }
- // ignore unnecessary end() calls.
- if (!state.ending && !state.finished) endWritable(this, state, cb);
- };
- function needFinish(state) {
- return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
- }
- function callFinal(stream, state) {
- stream._final(function (err) {
- state.pendingcb--;
- if (err) {
- stream.emit('error', err);
- }
- state.prefinished = true;
- stream.emit('prefinish');
- finishMaybe(stream, state);
- });
- }
- function prefinish(stream, state) {
- if (!state.prefinished && !state.finalCalled) {
- if (typeof stream._final === 'function') {
- state.pendingcb++;
- state.finalCalled = true;
- pna.nextTick(callFinal, stream, state);
- } else {
- state.prefinished = true;
- stream.emit('prefinish');
- }
- }
- }
- function finishMaybe(stream, state) {
- var need = needFinish(state);
- if (need) {
- prefinish(stream, state);
- if (state.pendingcb === 0) {
- state.finished = true;
- stream.emit('finish');
- }
- }
- return need;
- }
- function endWritable(stream, state, cb) {
- state.ending = true;
- finishMaybe(stream, state);
- if (cb) {
- if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
- }
- state.ended = true;
- stream.writable = false;
- }
- function onCorkedFinish(corkReq, state, err) {
- var entry = corkReq.entry;
- corkReq.entry = null;
- while (entry) {
- var cb = entry.callback;
- state.pendingcb--;
- cb(err);
- entry = entry.next;
- }
- if (state.corkedRequestsFree) {
- state.corkedRequestsFree.next = corkReq;
- } else {
- state.corkedRequestsFree = corkReq;
- }
- }
- Object.defineProperty(Writable.prototype, 'destroyed', {
- get: function () {
- if (this._writableState === undefined) {
- return false;
- }
- return this._writableState.destroyed;
- },
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (!this._writableState) {
- return;
- }
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._writableState.destroyed = value;
- }
- });
- Writable.prototype.destroy = destroyImpl.destroy;
- Writable.prototype._undestroy = destroyImpl.undestroy;
- Writable.prototype._destroy = function (err, cb) {
- this.end();
- cb(err);
- };
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(23), __webpack_require__(87).setImmediate, __webpack_require__(10)))
- /***/ }),
- /* 30 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- /*<replacement>*/
- var Buffer = __webpack_require__(25).Buffer;
- /*</replacement>*/
- var isEncoding = Buffer.isEncoding || function (encoding) {
- encoding = '' + encoding;
- switch (encoding && encoding.toLowerCase()) {
- case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
- return true;
- default:
- return false;
- }
- };
- function _normalizeEncoding(enc) {
- if (!enc) return 'utf8';
- var retried;
- while (true) {
- switch (enc) {
- case 'utf8':
- case 'utf-8':
- return 'utf8';
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return 'utf16le';
- case 'latin1':
- case 'binary':
- return 'latin1';
- case 'base64':
- case 'ascii':
- case 'hex':
- return enc;
- default:
- if (retried) return; // undefined
- enc = ('' + enc).toLowerCase();
- retried = true;
- }
- }
- };
- // Do not cache `Buffer.isEncoding` when checking encoding names as some
- // modules monkey-patch it to support additional encodings
- function normalizeEncoding(enc) {
- var nenc = _normalizeEncoding(enc);
- if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
- return nenc || enc;
- }
- // StringDecoder provides an interface for efficiently splitting a series of
- // buffers into a series of JS strings without breaking apart multi-byte
- // characters.
- exports.StringDecoder = StringDecoder;
- function StringDecoder(encoding) {
- this.encoding = normalizeEncoding(encoding);
- var nb;
- switch (this.encoding) {
- case 'utf16le':
- this.text = utf16Text;
- this.end = utf16End;
- nb = 4;
- break;
- case 'utf8':
- this.fillLast = utf8FillLast;
- nb = 4;
- break;
- case 'base64':
- this.text = base64Text;
- this.end = base64End;
- nb = 3;
- break;
- default:
- this.write = simpleWrite;
- this.end = simpleEnd;
- return;
- }
- this.lastNeed = 0;
- this.lastTotal = 0;
- this.lastChar = Buffer.allocUnsafe(nb);
- }
- StringDecoder.prototype.write = function (buf) {
- if (buf.length === 0) return '';
- var r;
- var i;
- if (this.lastNeed) {
- r = this.fillLast(buf);
- if (r === undefined) return '';
- i = this.lastNeed;
- this.lastNeed = 0;
- } else {
- i = 0;
- }
- if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
- return r || '';
- };
- StringDecoder.prototype.end = utf8End;
- // Returns only complete characters in a Buffer
- StringDecoder.prototype.text = utf8Text;
- // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
- StringDecoder.prototype.fillLast = function (buf) {
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
- this.lastNeed -= buf.length;
- };
- // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
- // continuation byte. If an invalid byte is detected, -2 is returned.
- function utf8CheckByte(byte) {
- if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
- return byte >> 6 === 0x02 ? -1 : -2;
- }
- // Checks at most 3 bytes at the end of a Buffer in order to detect an
- // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
- // needed to complete the UTF-8 character (if applicable) are returned.
- function utf8CheckIncomplete(self, buf, i) {
- var j = buf.length - 1;
- if (j < i) return 0;
- var nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 1;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 2;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) {
- if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
- }
- return nb;
- }
- return 0;
- }
- // Validates as many continuation bytes for a multi-byte UTF-8 character as
- // needed or are available. If we see a non-continuation byte where we expect
- // one, we "replace" the validated continuation bytes we've seen so far with
- // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
- // behavior. The continuation byte check is included three times in the case
- // where all of the continuation bytes for a character exist in the same buffer.
- // It is also done this way as a slight performance increase instead of using a
- // loop.
- function utf8CheckExtraBytes(self, buf, p) {
- if ((buf[0] & 0xC0) !== 0x80) {
- self.lastNeed = 0;
- return '\ufffd';
- }
- if (self.lastNeed > 1 && buf.length > 1) {
- if ((buf[1] & 0xC0) !== 0x80) {
- self.lastNeed = 1;
- return '\ufffd';
- }
- if (self.lastNeed > 2 && buf.length > 2) {
- if ((buf[2] & 0xC0) !== 0x80) {
- self.lastNeed = 2;
- return '\ufffd';
- }
- }
- }
- }
- // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
- function utf8FillLast(buf) {
- var p = this.lastTotal - this.lastNeed;
- var r = utf8CheckExtraBytes(this, buf, p);
- if (r !== undefined) return r;
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, p, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, p, 0, buf.length);
- this.lastNeed -= buf.length;
- }
- // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
- // partial character, the character's bytes are buffered until the required
- // number of bytes are available.
- function utf8Text(buf, i) {
- var total = utf8CheckIncomplete(this, buf, i);
- if (!this.lastNeed) return buf.toString('utf8', i);
- this.lastTotal = total;
- var end = buf.length - (total - this.lastNeed);
- buf.copy(this.lastChar, 0, end);
- return buf.toString('utf8', i, end);
- }
- // For UTF-8, a replacement character is added when ending on a partial
- // character.
- function utf8End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) return r + '\ufffd';
- return r;
- }
- // UTF-16LE typically needs two bytes per character, but even if we have an even
- // number of bytes available, we need to check if we end on a leading/high
- // surrogate. In that case, we need to wait for the next two bytes in order to
- // decode the last character properly.
- function utf16Text(buf, i) {
- if ((buf.length - i) % 2 === 0) {
- var r = buf.toString('utf16le', i);
- if (r) {
- var c = r.charCodeAt(r.length - 1);
- if (c >= 0xD800 && c <= 0xDBFF) {
- this.lastNeed = 2;
- this.lastTotal = 4;
- this.lastChar[0] = buf[buf.length - 2];
- this.lastChar[1] = buf[buf.length - 1];
- return r.slice(0, -1);
- }
- }
- return r;
- }
- this.lastNeed = 1;
- this.lastTotal = 2;
- this.lastChar[0] = buf[buf.length - 1];
- return buf.toString('utf16le', i, buf.length - 1);
- }
- // For UTF-16LE we do not explicitly append special replacement characters if we
- // end on a partial character, we simply let v8 handle that.
- function utf16End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) {
- var end = this.lastTotal - this.lastNeed;
- return r + this.lastChar.toString('utf16le', 0, end);
- }
- return r;
- }
- function base64Text(buf, i) {
- var n = (buf.length - i) % 3;
- if (n === 0) return buf.toString('base64', i);
- this.lastNeed = 3 - n;
- this.lastTotal = 3;
- if (n === 1) {
- this.lastChar[0] = buf[buf.length - 1];
- } else {
- this.lastChar[0] = buf[buf.length - 2];
- this.lastChar[1] = buf[buf.length - 1];
- }
- return buf.toString('base64', i, buf.length - n);
- }
- function base64End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
- return r;
- }
- // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
- function simpleWrite(buf) {
- return buf.toString(this.encoding);
- }
- function simpleEnd(buf) {
- return buf && buf.length ? this.write(buf) : '';
- }
- /***/ }),
- /* 31 */
- /***/ (function(module, exports, __webpack_require__) {
- var isArray = __webpack_require__(32).isArray;
- module.exports = {
- copyOptions: function (options) {
- var key, copy = {};
- for (key in options) {
- if (options.hasOwnProperty(key)) {
- copy[key] = options[key];
- }
- }
- return copy;
- },
- ensureFlagExists: function (item, options) {
- if (!(item in options) || typeof options[item] !== 'boolean') {
- options[item] = false;
- }
- },
- ensureSpacesExists: function (options) {
- if (!('spaces' in options) || (typeof options.spaces !== 'number' && typeof options.spaces !== 'string')) {
- options.spaces = 0;
- }
- },
- ensureAlwaysArrayExists: function (options) {
- if (!('alwaysArray' in options) || (typeof options.alwaysArray !== 'boolean' && !isArray(options.alwaysArray))) {
- options.alwaysArray = false;
- }
- },
- ensureKeyExists: function (key, options) {
- if (!(key + 'Key' in options) || typeof options[key + 'Key'] !== 'string') {
- options[key + 'Key'] = options.compact ? '_' + key : key;
- }
- },
- checkFnExists: function (key, options) {
- return key + 'Fn' in options;
- }
- };
- /***/ }),
- /* 32 */
- /***/ (function(module, exports) {
- module.exports = {
- isArray: function(value) {
- if (Array.isArray) {
- return Array.isArray(value);
- }
- // fallback for older browsers like IE 8
- return Object.prototype.toString.call( value ) === '[object Array]';
- }
- };
- /***/ }),
- /* 33 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports,"__esModule",{value:true});exports.addListener=addListener;exports.removeListener=removeListener;var raf=null;function requestAnimationFrame(callback){if(!raf){raf=(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(callback){return setTimeout(callback,16);}).bind(window);}return raf(callback);}var caf=null;function cancelAnimationFrame(id){if(!caf){caf=(window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(id){clearTimeout(id);}).bind(window);}caf(id);}function createStyles(styleText){var style=document.createElement('style');style.type='text/css';if(style.styleSheet){style.styleSheet.cssText=styleText;}else{style.appendChild(document.createTextNode(styleText));}(document.querySelector('head')||document.body).appendChild(style);return style;}function createElement(tagName){var props=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var elem=document.createElement(tagName);Object.keys(props).forEach(function(key){elem[key]=props[key];});return elem;}function getComputedStyle(elem,prop,pseudo){// for older versions of Firefox, `getComputedStyle` required
- // the second argument and may return `null` for some elements
- // when `display: none`
- var computedStyle=window.getComputedStyle(elem,pseudo||null)||{display:'none'};return computedStyle[prop];}function getRenderInfo(elem){if(!document.documentElement.contains(elem)){return{detached:true,rendered:false};}var current=elem;while(current!==document){if(getComputedStyle(current,'display')==='none'){return{detached:false,rendered:false};}current=current.parentNode;}return{detached:false,rendered:true};}var css=".resize-triggers{visibility:hidden;opacity:0;pointer-events:none}.resize-contract-trigger,.resize-contract-trigger:before,.resize-expand-trigger,.resize-triggers{content:\"\";position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden}.resize-contract-trigger,.resize-expand-trigger{background:#eee;overflow:auto}.resize-contract-trigger:before{width:200%;height:200%}";var total=0;var style=null;function addListener(elem,callback){if(!elem.__resize_mutation_handler__){elem.__resize_mutation_handler__=handleMutation.bind(elem);}var listeners=elem.__resize_listeners__;if(!listeners){elem.__resize_listeners__=[];if(window.ResizeObserver){var offsetWidth=elem.offsetWidth,offsetHeight=elem.offsetHeight;var ro=new ResizeObserver(function(){if(!elem.__resize_observer_triggered__){elem.__resize_observer_triggered__=true;if(elem.offsetWidth===offsetWidth&&elem.offsetHeight===offsetHeight){return;}}runCallbacks(elem);});// initially display none won't trigger ResizeObserver callback
- var _getRenderInfo=getRenderInfo(elem),detached=_getRenderInfo.detached,rendered=_getRenderInfo.rendered;elem.__resize_observer_triggered__=detached===false&&rendered===false;elem.__resize_observer__=ro;ro.observe(elem);}else if(elem.attachEvent&&elem.addEventListener){// targeting IE9/10
- elem.__resize_legacy_resize_handler__=function handleLegacyResize(){runCallbacks(elem);};elem.attachEvent('onresize',elem.__resize_legacy_resize_handler__);document.addEventListener('DOMSubtreeModified',elem.__resize_mutation_handler__);}else{if(!total){style=createStyles(css);}initTriggers(elem);elem.__resize_rendered__=getRenderInfo(elem).rendered;if(window.MutationObserver){var mo=new MutationObserver(elem.__resize_mutation_handler__);mo.observe(document,{attributes:true,childList:true,characterData:true,subtree:true});elem.__resize_mutation_observer__=mo;}}}elem.__resize_listeners__.push(callback);total++;}function removeListener(elem,callback){var listeners=elem.__resize_listeners__;if(!listeners){return;}if(callback){listeners.splice(listeners.indexOf(callback),1);}// no listeners exist, or removing all listeners
- if(!listeners.length||!callback){// targeting IE9/10
- if(elem.detachEvent&&elem.removeEventListener){elem.detachEvent('onresize',elem.__resize_legacy_resize_handler__);document.removeEventListener('DOMSubtreeModified',elem.__resize_mutation_handler__);return;}if(elem.__resize_observer__){elem.__resize_observer__.unobserve(elem);elem.__resize_observer__.disconnect();elem.__resize_observer__=null;}else{if(elem.__resize_mutation_observer__){elem.__resize_mutation_observer__.disconnect();elem.__resize_mutation_observer__=null;}elem.removeEventListener('scroll',handleScroll);elem.removeChild(elem.__resize_triggers__.triggers);elem.__resize_triggers__=null;}elem.__resize_listeners__=null;}if(! --total&&style){style.parentNode.removeChild(style);}}function getUpdatedSize(elem){var _elem$__resize_last__=elem.__resize_last__,width=_elem$__resize_last__.width,height=_elem$__resize_last__.height;var offsetWidth=elem.offsetWidth,offsetHeight=elem.offsetHeight;if(offsetWidth!==width||offsetHeight!==height){return{width:offsetWidth,height:offsetHeight};}return null;}function handleMutation(){// `this` denotes the scrolling element
- var _getRenderInfo2=getRenderInfo(this),rendered=_getRenderInfo2.rendered,detached=_getRenderInfo2.detached;if(rendered!==this.__resize_rendered__){if(!detached&&this.__resize_triggers__){resetTriggers(this);this.addEventListener('scroll',handleScroll,true);}this.__resize_rendered__=rendered;runCallbacks(this);}}function handleScroll(){var _this=this;// `this` denotes the scrolling element
- resetTriggers(this);if(this.__resize_raf__){cancelAnimationFrame(this.__resize_raf__);}this.__resize_raf__=requestAnimationFrame(function(){var updated=getUpdatedSize(_this);if(updated){_this.__resize_last__=updated;runCallbacks(_this);}});}function runCallbacks(elem){if(!elem||!elem.__resize_listeners__){return;}elem.__resize_listeners__.forEach(function(callback){callback.call(elem,elem);});}function initTriggers(elem){var position=getComputedStyle(elem,'position');if(!position||position==='static'){elem.style.position='relative';}elem.__resize_old_position__=position;elem.__resize_last__={};var triggers=createElement('div',{className:'resize-triggers'});var expand=createElement('div',{className:'resize-expand-trigger'});var expandChild=createElement('div');var contract=createElement('div',{className:'resize-contract-trigger'});expand.appendChild(expandChild);triggers.appendChild(expand);triggers.appendChild(contract);elem.appendChild(triggers);elem.__resize_triggers__={triggers:triggers,expand:expand,expandChild:expandChild,contract:contract};resetTriggers(elem);elem.addEventListener('scroll',handleScroll,true);elem.__resize_last__={width:elem.offsetWidth,height:elem.offsetHeight};}function resetTriggers(elem){var _elem$__resize_trigge=elem.__resize_triggers__,expand=_elem$__resize_trigge.expand,expandChild=_elem$__resize_trigge.expandChild,contract=_elem$__resize_trigge.contract;// batch read
- var csw=contract.scrollWidth,csh=contract.scrollHeight;var eow=expand.offsetWidth,eoh=expand.offsetHeight,esw=expand.scrollWidth,esh=expand.scrollHeight;// batch write
- contract.scrollLeft=csw;contract.scrollTop=csh;expandChild.style.width=eow+1+'px';expandChild.style.height=eoh+1+'px';expand.scrollLeft=esw;expand.scrollTop=esh;}
- /***/ }),
- /* 34 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as the `TypeError` message for "Functions" methods. */
- var FUNC_ERROR_TEXT = 'Expected a function';
- /** Used as references for various `Number` constants. */
- var NAN = 0 / 0;
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
- /** Used to match leading and trailing whitespace. */
- var reTrim = /^\s+|\s+$/g;
- /** Used to detect bad signed hexadecimal string values. */
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- /** Used to detect binary string values. */
- var reIsBinary = /^0b[01]+$/i;
- /** Used to detect octal string values. */
- var reIsOctal = /^0o[0-7]+$/i;
- /** Built-in method references without a dependency on `root`. */
- var freeParseInt = parseInt;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax = Math.max,
- nativeMin = Math.min;
- /**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
- var now = function() {
- return root.Date.now();
- };
- /**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
- function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- result = wait - timeSinceLastCall;
- return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
- }
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
- function timerExpired() {
- var time = now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
- function trailingEdge(time) {
- timerId = undefined;
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
- function flush() {
- return timerId === undefined ? result : trailingEdge(now());
- }
- function debounced() {
- var time = now(),
- isInvoking = shouldInvoke(time);
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
- }
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
- }
- /**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
- function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
- }
- module.exports = debounce;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 35 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as references for various `Number` constants. */
- var INFINITY = 1 / 0;
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
- /** Used to compose unicode character classes. */
- var rsAstralRange = '\\ud800-\\udfff',
- rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
- rsComboSymbolsRange = '\\u20d0-\\u20f0',
- rsVarRange = '\\ufe0e\\ufe0f';
- /** Used to compose unicode capture groups. */
- var rsAstral = '[' + rsAstralRange + ']',
- rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
- rsFitz = '\\ud83c[\\udffb-\\udfff]',
- rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
- rsNonAstral = '[^' + rsAstralRange + ']',
- rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
- rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
- rsZWJ = '\\u200d';
- /** Used to compose unicode regexes. */
- var reOptMod = rsModifier + '?',
- rsOptVar = '[' + rsVarRange + ']?',
- rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
- rsSeq = rsOptVar + reOptMod + rsOptJoin,
- rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
- /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
- var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
- /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
- var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /**
- * Converts an ASCII `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function asciiToArray(string) {
- return string.split('');
- }
- /**
- * Checks if `string` contains Unicode symbols.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {boolean} Returns `true` if a symbol is found, else `false`.
- */
- function hasUnicode(string) {
- return reHasUnicode.test(string);
- }
- /**
- * Converts `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function stringToArray(string) {
- return hasUnicode(string)
- ? unicodeToArray(string)
- : asciiToArray(string);
- }
- /**
- * Converts a Unicode `string` to an array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the converted array.
- */
- function unicodeToArray(string) {
- return string.match(reUnicode) || [];
- }
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /** Built-in value references. */
- var Symbol = root.Symbol;
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
- /**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
- function baseSlice(array, start, end) {
- var index = -1,
- length = array.length;
- if (start < 0) {
- start = -start > length ? 0 : (length + start);
- }
- end = end > length ? length : end;
- if (end < 0) {
- end += length;
- }
- length = start > end ? 0 : ((end - start) >>> 0);
- start >>>= 0;
- var result = Array(length);
- while (++index < length) {
- result[index] = array[index + start];
- }
- return result;
- }
- /**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
- function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isSymbol(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
- /**
- * Casts `array` to a slice if it's needed.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {number} start The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the cast slice.
- */
- function castSlice(array, start, end) {
- var length = array.length;
- end = end === undefined ? length : end;
- return (!start && end >= length) ? array : baseSlice(array, start, end);
- }
- /**
- * Creates a function like `_.lowerFirst`.
- *
- * @private
- * @param {string} methodName The name of the `String` case method to use.
- * @returns {Function} Returns the new case function.
- */
- function createCaseFirst(methodName) {
- return function(string) {
- string = toString(string);
- var strSymbols = hasUnicode(string)
- ? stringToArray(string)
- : undefined;
- var chr = strSymbols
- ? strSymbols[0]
- : string.charAt(0);
- var trailing = strSymbols
- ? castSlice(strSymbols, 1).join('')
- : string.slice(1);
- return chr[methodName]() + trailing;
- };
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
- }
- /**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- return value == null ? '' : baseToString(value);
- }
- /**
- * Converts the first character of `string` to upper case.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the converted string.
- * @example
- *
- * _.upperFirst('fred');
- * // => 'Fred'
- *
- * _.upperFirst('FRED');
- * // => 'FRED'
- */
- var upperFirst = createCaseFirst('toUpperCase');
- module.exports = upperFirst;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 36 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__36__;
- /***/ }),
- /* 37 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as the `TypeError` message for "Functions" methods. */
- var FUNC_ERROR_TEXT = 'Expected a function';
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED = '__lodash_hash_undefined__';
- /** Used as references for various `Number` constants. */
- var INFINITY = 1 / 0;
- /** `Object#toString` result references. */
- var funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]',
- symbolTag = '[object Symbol]';
- /** Used to match property names within property paths. */
- var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
- reIsPlainProp = /^\w*$/,
- reLeadingDot = /^\./,
- rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
- /**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
- var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
- /** Used to match backslashes in property paths. */
- var reEscapeChar = /\\(\\)?/g;
- /** Used to detect host constructors (Safari). */
- var reIsHostCtor = /^\[object .+?Constructor\]$/;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
- function getValue(object, key) {
- return object == null ? undefined : object[key];
- }
- /**
- * Checks if `value` is a host object in IE < 9.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
- */
- function isHostObject(value) {
- // Many host objects are `Object` objects that can coerce to strings
- // despite having improperly defined `toString` methods.
- var result = false;
- if (value != null && typeof value.toString != 'function') {
- try {
- result = !!(value + '');
- } catch (e) {}
- }
- return result;
- }
- /** Used for built-in method references. */
- var arrayProto = Array.prototype,
- funcProto = Function.prototype,
- objectProto = Object.prototype;
- /** Used to detect overreaching core-js shims. */
- var coreJsData = root['__core-js_shared__'];
- /** Used to detect methods masquerading as native. */
- var maskSrcKey = (function() {
- var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
- return uid ? ('Symbol(src)_1.' + uid) : '';
- }());
- /** Used to resolve the decompiled source of functions. */
- var funcToString = funcProto.toString;
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /** Used to detect if a method is native. */
- var reIsNative = RegExp('^' +
- funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
- );
- /** Built-in value references. */
- var Symbol = root.Symbol,
- splice = arrayProto.splice;
- /* Built-in method references that are verified to be native. */
- var Map = getNative(root, 'Map'),
- nativeCreate = getNative(Object, 'create');
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
- /**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Hash(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
- function hashClear() {
- this.__data__ = nativeCreate ? nativeCreate(null) : {};
- }
- /**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function hashDelete(key) {
- return this.has(key) && delete this.__data__[key];
- }
- /**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function hashGet(key) {
- var data = this.__data__;
- if (nativeCreate) {
- var result = data[key];
- return result === HASH_UNDEFINED ? undefined : result;
- }
- return hasOwnProperty.call(data, key) ? data[key] : undefined;
- }
- /**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function hashHas(key) {
- var data = this.__data__;
- return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
- }
- /**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
- function hashSet(key, value) {
- var data = this.__data__;
- data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
- return this;
- }
- // Add methods to `Hash`.
- Hash.prototype.clear = hashClear;
- Hash.prototype['delete'] = hashDelete;
- Hash.prototype.get = hashGet;
- Hash.prototype.has = hashHas;
- Hash.prototype.set = hashSet;
- /**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function ListCache(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
- function listCacheClear() {
- this.__data__ = [];
- }
- /**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function listCacheDelete(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- return false;
- }
- var lastIndex = data.length - 1;
- if (index == lastIndex) {
- data.pop();
- } else {
- splice.call(data, index, 1);
- }
- return true;
- }
- /**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function listCacheGet(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- return index < 0 ? undefined : data[index][1];
- }
- /**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function listCacheHas(key) {
- return assocIndexOf(this.__data__, key) > -1;
- }
- /**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
- function listCacheSet(key, value) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- data.push([key, value]);
- } else {
- data[index][1] = value;
- }
- return this;
- }
- // Add methods to `ListCache`.
- ListCache.prototype.clear = listCacheClear;
- ListCache.prototype['delete'] = listCacheDelete;
- ListCache.prototype.get = listCacheGet;
- ListCache.prototype.has = listCacheHas;
- ListCache.prototype.set = listCacheSet;
- /**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function MapCache(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
- function mapCacheClear() {
- this.__data__ = {
- 'hash': new Hash,
- 'map': new (Map || ListCache),
- 'string': new Hash
- };
- }
- /**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function mapCacheDelete(key) {
- return getMapData(this, key)['delete'](key);
- }
- /**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function mapCacheGet(key) {
- return getMapData(this, key).get(key);
- }
- /**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function mapCacheHas(key) {
- return getMapData(this, key).has(key);
- }
- /**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
- function mapCacheSet(key, value) {
- getMapData(this, key).set(key, value);
- return this;
- }
- // Add methods to `MapCache`.
- MapCache.prototype.clear = mapCacheClear;
- MapCache.prototype['delete'] = mapCacheDelete;
- MapCache.prototype.get = mapCacheGet;
- MapCache.prototype.has = mapCacheHas;
- MapCache.prototype.set = mapCacheSet;
- /**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function assocIndexOf(array, key) {
- var length = array.length;
- while (length--) {
- if (eq(array[length][0], key)) {
- return length;
- }
- }
- return -1;
- }
- /**
- * The base implementation of `_.get` without support for default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @returns {*} Returns the resolved value.
- */
- function baseGet(object, path) {
- path = isKey(path, object) ? [path] : castPath(path);
- var index = 0,
- length = path.length;
- while (object != null && index < length) {
- object = object[toKey(path[index++])];
- }
- return (index && index == length) ? object : undefined;
- }
- /**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- * else `false`.
- */
- function baseIsNative(value) {
- if (!isObject(value) || isMasked(value)) {
- return false;
- }
- var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
- return pattern.test(toSource(value));
- }
- /**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
- function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isSymbol(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
- /**
- * Casts `value` to a path array if it's not one.
- *
- * @private
- * @param {*} value The value to inspect.
- * @returns {Array} Returns the cast property path array.
- */
- function castPath(value) {
- return isArray(value) ? value : stringToPath(value);
- }
- /**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
- function getMapData(map, key) {
- var data = map.__data__;
- return isKeyable(key)
- ? data[typeof key == 'string' ? 'string' : 'hash']
- : data.map;
- }
- /**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
- function getNative(object, key) {
- var value = getValue(object, key);
- return baseIsNative(value) ? value : undefined;
- }
- /**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
- function isKey(value, object) {
- if (isArray(value)) {
- return false;
- }
- var type = typeof value;
- if (type == 'number' || type == 'symbol' || type == 'boolean' ||
- value == null || isSymbol(value)) {
- return true;
- }
- return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
- (object != null && value in Object(object));
- }
- /**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
- function isKeyable(value) {
- var type = typeof value;
- return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
- ? (value !== '__proto__')
- : (value === null);
- }
- /**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
- function isMasked(func) {
- return !!maskSrcKey && (maskSrcKey in func);
- }
- /**
- * Converts `string` to a property path array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the property path array.
- */
- var stringToPath = memoize(function(string) {
- string = toString(string);
- var result = [];
- if (reLeadingDot.test(string)) {
- result.push('');
- }
- string.replace(rePropName, function(match, number, quote, string) {
- result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
- });
- return result;
- });
- /**
- * Converts `value` to a string key if it's not a string or symbol.
- *
- * @private
- * @param {*} value The value to inspect.
- * @returns {string|symbol} Returns the key.
- */
- function toKey(value) {
- if (typeof value == 'string' || isSymbol(value)) {
- return value;
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
- /**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to process.
- * @returns {string} Returns the source code.
- */
- function toSource(func) {
- if (func != null) {
- try {
- return funcToString.call(func);
- } catch (e) {}
- try {
- return (func + '');
- } catch (e) {}
- }
- return '';
- }
- /**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided, it determines the cache key for storing the result based on the
- * arguments provided to the memoized function. By default, the first argument
- * provided to the memoized function is used as the map cache key. The `func`
- * is invoked with the `this` binding of the memoized function.
- *
- * **Note:** The cache is exposed as the `cache` property on the memoized
- * function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the
- * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
- * method interface of `delete`, `get`, `has`, and `set`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] The function to resolve the cache key.
- * @returns {Function} Returns the new memoized function.
- * @example
- *
- * var object = { 'a': 1, 'b': 2 };
- * var other = { 'c': 3, 'd': 4 };
- *
- * var values = _.memoize(_.values);
- * values(object);
- * // => [1, 2]
- *
- * values(other);
- * // => [3, 4]
- *
- * object.a = 2;
- * values(object);
- * // => [1, 2]
- *
- * // Modify the result cache.
- * values.cache.set(object, ['a', 'b']);
- * values(object);
- * // => ['a', 'b']
- *
- * // Replace `_.memoize.Cache`.
- * _.memoize.Cache = WeakMap;
- */
- function memoize(func, resolver) {
- if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- var memoized = function() {
- var args = arguments,
- key = resolver ? resolver.apply(this, args) : args[0],
- cache = memoized.cache;
- if (cache.has(key)) {
- return cache.get(key);
- }
- var result = func.apply(this, args);
- memoized.cache = cache.set(key, result);
- return result;
- };
- memoized.cache = new (memoize.Cache || MapCache);
- return memoized;
- }
- // Assign cache to `_.memoize`.
- memoize.Cache = MapCache;
- /**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
- function eq(value, other) {
- return value === other || (value !== value && other !== other);
- }
- /**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
- var isArray = Array.isArray;
- /**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
- function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 8-9 which returns 'object' for typed array and other constructors.
- var tag = isObject(value) ? objectToString.call(value) : '';
- return tag == funcTag || tag == genTag;
- }
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
- }
- /**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- return value == null ? '' : baseToString(value);
- }
- /**
- * Gets the value at `path` of `object`. If the resolved value is
- * `undefined`, the `defaultValue` is returned in its place.
- *
- * @static
- * @memberOf _
- * @since 3.7.0
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @param {*} [defaultValue] The value returned for `undefined` resolved values.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.get(object, 'a[0].b.c');
- * // => 3
- *
- * _.get(object, ['a', '0', 'b', 'c']);
- * // => 3
- *
- * _.get(object, 'a.b.c', 'default');
- * // => 'default'
- */
- function get(object, path, defaultValue) {
- var result = object == null ? undefined : baseGet(object, path);
- return result === undefined ? defaultValue : result;
- }
- module.exports = get;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 38 */
- /***/ (function(module, exports) {
- module.exports = function(module) {
- if (!module.webpackPolyfill) {
- module.deprecate = function() {};
- module.paths = [];
- // module.parent = undefined by default
- if (!module.children) module.children = [];
- Object.defineProperty(module, "loaded", {
- enumerable: true,
- get: function() {
- return module.l;
- }
- });
- Object.defineProperty(module, "id", {
- enumerable: true,
- get: function() {
- return module.i;
- }
- });
- module.webpackPolyfill = 1;
- }
- return module;
- };
- /***/ }),
- /* 39 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _SourceModel=_interopRequireDefault(__webpack_require__(67));var _LayerModel=_interopRequireDefault(__webpack_require__(68));var SourceListModel=/*#__PURE__*/function(){function SourceListModel(options){(0,_classCallCheck2.default)(this,SourceListModel);this.map=options.map;this.style=this.map.getStyle();this.layers=this.map.getStyle().layers;this.overlayLayers=this.map.overlayLayersManager;this.detailLayers=null;this.sourceList={};this.sourceNames=[];this._initLayers();this._initSource();this.excludeSourceNames=['tdt-search-','tdt-route-','smmeasure','mapbox-gl-draw'];}(0,_createClass2.default)(SourceListModel,[{key:"getSourceList",value:function getSourceList(){var sourceList={};for(var key in this.sourceList){if(key&&this.excludeSource(key)){sourceList[key]=this.sourceList[key];}}return sourceList;}},{key:"getSourceNames",value:function getSourceNames(){var _this=this;var names=[];this.sourceNames.forEach(function(element){if(element&&_this.excludeSource(element)){names.push(element);}});return names;}},{key:"excludeSource",value:function excludeSource(key){for(var i=0;i<this.excludeSourceNames.length;i++){if(key.indexOf(this.excludeSourceNames[i])>=0){return false;}}return true;}},{key:"getLegendStyle",value:function getLegendStyle(sourceName){if(sourceName){return this.sourceList[sourceName]?this.sourceList[sourceName].style:'';}var sourceList=Object.values(this.sourceList)||[];var styles=sourceList.filter(function(item){return!!item.style;});return styles;}},{key:"getLayers",value:function getLayers(){return this.detailLayers;}},{key:"getLayersBySourceLayer",value:function getLayersBySourceLayer(sourceName,sourceLayer){return this.sourceList[sourceName]['sourceLayerList'][sourceLayer];}},{key:"getSourceLayersBySource",value:function getSourceLayersBySource(sourceName){return this.sourceList[sourceName]['sourceLayerList'];}},{key:"addSourceStyle",value:function addSourceStyle(sourceName,sourceStyle){if(this.sourceList[sourceName]){this.sourceList[sourceName]['style']=sourceStyle;}}},{key:"_initLayers",value:function _initLayers(){var _this2=this;this.layers&&(this.detailLayers=this.layers.map(function(layer){return _this2.map.getLayer(layer.id);}));var overLayerList=Object.values(this.overlayLayers);overLayerList.forEach(function(overlayer){if(overlayer.id){_this2.detailLayers.push({id:overlayer.id,visibility:overlayer.visibility?'visible':'none',source:overlayer.id});}});}},{key:"_initSource",value:function _initSource(){var _this3=this;this.detailLayers&&this.detailLayers.forEach(function(layer){if(!_this3.sourceList[layer['source']]){_this3.sourceList[layer['source']]=new _SourceModel.default({source:layer['source']});_this3.sourceNames.push(layer['source']);}_this3.sourceList[layer['source']].addLayer(new _LayerModel.default(layer),layer['sourceLayer']);});}}]);return SourceListModel;}();var _default=SourceListModel;exports.default=_default;
- /***/ }),
- /* 40 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _events=__webpack_require__(20);var _theme=_interopRequireDefault(__webpack_require__(69));var GlobalEvent=/*#__PURE__*/function(_EventEmitter){(0,_inherits2.default)(GlobalEvent,_EventEmitter);var _super=(0,_createSuper2.default)(GlobalEvent);function GlobalEvent(){var _this;var themValue=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_theme.default[1];(0,_classCallCheck2.default)(this,GlobalEvent);_this=_super.call(this);_this._theme=void 0;_this._theme=themValue;return _this;}(0,_createClass2.default)(GlobalEvent,[{key:"theme",get:function get(){return this._theme;},set:function set(themValue){this._theme=themValue;}}]);return GlobalEvent;}(_events.EventEmitter);var _default=new GlobalEvent();exports.default=_default;
- /***/ }),
- /* 41 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(global) {var _interopRequireDefault=__webpack_require__(42);var _slicedToArray2=_interopRequireDefault(__webpack_require__(72));/*jshint esversion: 6 */function colorcolor(color){var newColor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"rgba";var calculateOpacity=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;color=color.toLowerCase();newColor=newColor.toLowerCase();var returnedColor=color;var namedColor=__webpack_require__(76);var r,g,b,a;var roundTo=4;var colorDefinitions={rgb:{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],10),parseInt(bits[2],10),parseInt(bits[3],10),1];}},rgba:{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d+(?:\.\d+)?|\.\d+)\s*\)/,example:["rgba(123, 234, 45, 1)","rgba(255,234,245, 0.5)"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],10),parseInt(bits[2],10),parseInt(bits[3],10),parseFloat(bits[4])];}},hex:{re:/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:["00ff00","336699"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16),1];}},hex3:{re:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:["fb0","f0f"],toRGBA:function toRGBA(bits){return[parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16),1];}},hexa:{re:/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:["00ff00ff","336699a0"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16),parseInt(bits[4],16)/255];}},hex4a:{re:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:["fb0f","f0f8"],toRGBA:function toRGBA(bits){return[parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16),parseInt(bits[4]+bits[4],16)/255];}},hsl:{re:/^hsl\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsl(120, 100%, 25%)","hsl(0, 100%, 50%)"],toRGBA:function toRGBA(bits){bits[4]=1;var rgba=hslToRgb(bits);return[rgba.r,rgba.g,rgba.b,rgba.a];}},hsla:{re:/^hsla\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%,\s*(\d+(?:\.\d+)?|\.\d+)\s*\)/,example:["hsla(120, 100%, 25%, 1)","hsla(0, 100%, 50%, 0.5)"],toRGBA:function toRGBA(bits){var rgba=hslToRgb(bits);return[rgba.r,rgba.g,rgba.b,rgba.a];}},hsv:{re:/^hsv\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsv(120, 100%, 25%)","hsv(0, 100%, 50%)"],toRGBA:function toRGBA(bits){var rgb=hsvToRgb(bits);return[rgb.r,rgb.g,rgb.b,1];}},hsb:{re:/^hsb\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsb(120, 100%, 25%)","hsb(0, 100%, 50%)"],toRGBA:function toRGBA(bits){var rgb=hsvToRgb(bits);return[rgb.r,rgb.g,rgb.b,1];}}};// If this is a named color, convert it to hex
- if(namedColor.hasOwnProperty(color)){color=namedColor[color];color.forEach(function(piece,index){"use strict";color[index]=("0"+piece.toString(16)).slice(-2);});color="#"+color.join('');}// Search the color definitions for a match
- for(var colorDefinition in colorDefinitions){var re=colorDefinitions[colorDefinition].re;var processor=colorDefinitions[colorDefinition].toRGBA;var bits=re.exec(color);if(bits){var channels=processor(bits);r=channels[0];g=channels[1];b=channels[2];a=+(Math.round(channels[3]+("e+"+roundTo))+("e-"+roundTo));}}r=Math.round(r<0||isNaN(r)?0:r>255?255:r);g=Math.round(g<0||isNaN(g)?0:g>255?255:g);b=Math.round(b<0||isNaN(b)?0:b>255?255:b);a=a<0||isNaN(a)?0:a>1?1:a;switch(newColor){case"hex":returnedColor="#"+("0"+r.toString(16)).slice(-2)+("0"+g.toString(16)).slice(-2)+("0"+b.toString(16)).slice(-2);break;case"hexa":if(calculateOpacity){var _calculateOpacityFrom=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom2=(0,_slicedToArray2.default)(_calculateOpacityFrom,4);r=_calculateOpacityFrom2[0];g=_calculateOpacityFrom2[1];b=_calculateOpacityFrom2[2];a=_calculateOpacityFrom2[3];}returnedColor="#"+("0"+r.toString(16)).slice(-2)+("0"+g.toString(16)).slice(-2)+("0"+b.toString(16)).slice(-2)+("0"+Math.round(255*a).toString(16)).slice(-2);break;case"hsl":var hsl=rgbToHsl({"r":r,"g":g,"b":b});returnedColor="hsl(".concat(hsl.h,",").concat(hsl.s,"%,").concat(hsl.l,"%)");break;case"hsla":if(calculateOpacity){var _calculateOpacityFrom3=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom4=(0,_slicedToArray2.default)(_calculateOpacityFrom3,4);r=_calculateOpacityFrom4[0];g=_calculateOpacityFrom4[1];b=_calculateOpacityFrom4[2];a=_calculateOpacityFrom4[3];}var hsla=rgbToHsl({"r":r,"g":g,"b":b,"a":a});returnedColor="hsla(".concat(hsla.h,",").concat(hsla.s,"%,").concat(hsla.l,"%,").concat(hsla.a,")");break;case"hsb":/* Same as `hsv` */var hsb=rgbToHsv({"r":r,"g":g,"b":b});returnedColor="hsb(".concat(hsb.h,",").concat(hsb.s,"%,").concat(hsb.v,"%)");break;case"hsv":var hsv=rgbToHsv({"r":r,"g":g,"b":b});returnedColor="hsv(".concat(hsv.h,",").concat(hsv.s,"%,").concat(hsv.v,"%)");break;case"rgb":returnedColor="rgb(".concat(r,",").concat(g,",").concat(b,")");break;case"rgba":/* falls through */default:if(calculateOpacity){var _calculateOpacityFrom5=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom6=(0,_slicedToArray2.default)(_calculateOpacityFrom5,4);r=_calculateOpacityFrom6[0];g=_calculateOpacityFrom6[1];b=_calculateOpacityFrom6[2];a=_calculateOpacityFrom6[3];}returnedColor="rgba(".concat(r,",").concat(g,",").concat(b,",").concat(a,")");break;}return returnedColor;}function calculateOpacityFromWhite(r,g,b,a){"use strict";var min=0;a=(255-(min=Math.min(r,g,b)))/255;r=( false||(r-min)/a).toFixed(0);g=( false||(g-min)/a).toFixed(0);b=( false||(b-min)/a).toFixed(0);a=parseFloat(a.toFixed(4));return[r,g,b,a];}function hslToRgb(bits){var rgba={},hsl={h:bits[1]/360,s:bits[2]/100,l:bits[3]/100,a:parseFloat(bits[4])};if(hsl.s===0){var v=255*hsl.l;rgba={r:v,g:v,b:v,a:hsl.a};}else{var q=hsl.l<0.5?hsl.l*(1+hsl.s):hsl.l+hsl.s-hsl.l*hsl.s;var p=2*hsl.l-q;rgba.r=hueToRgb(p,q,hsl.h+1/3)*255;rgba.g=hueToRgb(p,q,hsl.h)*255;rgba.b=hueToRgb(p,q,hsl.h-1/3)*255;rgba.a=hsl.a;}return rgba;}function rgbToHsl(rgba){rgba.r=rgba.r/255;rgba.g=rgba.g/255;rgba.b=rgba.b/255;var max=Math.max(rgba.r,rgba.g,rgba.b),min=Math.min(rgba.r,rgba.g,rgba.b),hsl=[],d;hsl.a=rgba.a;hsl.l=(max+min)/2;if(max===min){hsl.h=0;hsl.s=0;}else{d=max-min;hsl.s=hsl.l>=0.5?d/(2-max-min):d/(max+min);switch(max){case rgba.r:hsl.h=(rgba.g-rgba.b)/d+(rgba.g<rgba.b?6:0);break;case rgba.g:hsl.h=(rgba.b-rgba.r)/d+2;break;case rgba.b:hsl.h=(rgba.r-rgba.g)/d+4;break;}hsl.h/=6;}hsl.h=parseInt((hsl.h*360).toFixed(0),10);hsl.s=parseInt((hsl.s*100).toFixed(0),10);hsl.l=parseInt((hsl.l*100).toFixed(0),10);return hsl;}function hsvToRgb(bits){var rgb={},hsv={h:bits[1]/360,s:bits[2]/100,v:bits[3]/100},i=Math.floor(hsv.h*6),f=hsv.h*6-i,p=hsv.v*(1-hsv.s),q=hsv.v*(1-f*hsv.s),t=hsv.v*(1-(1-f)*hsv.s);switch(i%6){case 0:rgb.r=hsv.v;rgb.g=t;rgb.b=p;break;case 1:rgb.r=q;rgb.g=hsv.v;rgb.b=p;break;case 2:rgb.r=p;rgb.g=hsv.v;rgb.b=t;break;case 3:rgb.r=p;rgb.g=q;rgb.b=hsv.v;break;case 4:rgb.r=t;rgb.g=p;rgb.b=hsv.v;break;case 5:rgb.r=hsv.v;rgb.g=p;rgb.b=q;break;}rgb.r=rgb.r*255;rgb.g=rgb.g*255;rgb.b=rgb.b*255;return rgb;}function rgbToHsv(rgba){rgba.r=toPercent(parseInt(rgba.r,10)%256,256);rgba.g=toPercent(parseInt(rgba.g,10)%256,256);rgba.b=toPercent(parseInt(rgba.b,10)%256,256);var max=Math.max(rgba.r,rgba.g,rgba.b),min=Math.min(rgba.r,rgba.g,rgba.b),d=max-min,hsv={"h":0,"s":max===0?0:d/max,"v":max};if(max!==min){switch(max){case rgba.r:hsv.h=(rgba.g-rgba.b)/d+(rgba.g<rgba.b?6:0);break;case rgba.g:hsv.h=(rgba.b-rgba.r)/d+2;break;case rgba.b:hsv.h=(rgba.r-rgba.g)/d+4;break;}hsv.h/=6;}hsv.h=parseInt((hsv.h*360).toFixed(0),10);hsv.s=parseInt((hsv.s*100).toFixed(0),10);hsv.v=parseInt((hsv.v*100).toFixed(0),10);return hsv;}function hueToRgb(p,q,t){if(t<0){t+=1;}if(t>1){t-=1;}if(t<1/6){return p+(q-p)*6*t;}if(t<1/2){return q;}if(t<2/3){return p+(q-p)*((2/3-t)*6);}return p;}function toPercent(amount,limit){return amount/limit;}module.exports=colorcolor;global.colorcolor=module.exports;/* ew */
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 42 */
- /***/ (function(module, exports) {
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- "default": obj
- };
- }
- module.exports = _interopRequireDefault;
- /***/ }),
- /* 43 */
- /***/ (function(module, exports, __webpack_require__) {
- var sax = __webpack_require__(80);
- var expat /*= require('node-expat');*/ = { on: function () { }, parse: function () { } };
- var helper = __webpack_require__(31);
- var isArray = __webpack_require__(32).isArray;
- var options;
- var pureJsParser = true;
- var currentElement;
- function validateOptions(userOptions) {
- options = helper.copyOptions(userOptions);
- helper.ensureFlagExists('ignoreDeclaration', options);
- helper.ensureFlagExists('ignoreInstruction', options);
- helper.ensureFlagExists('ignoreAttributes', options);
- helper.ensureFlagExists('ignoreText', options);
- helper.ensureFlagExists('ignoreComment', options);
- helper.ensureFlagExists('ignoreCdata', options);
- helper.ensureFlagExists('ignoreDoctype', options);
- helper.ensureFlagExists('compact', options);
- helper.ensureFlagExists('alwaysChildren', options);
- helper.ensureFlagExists('addParent', options);
- helper.ensureFlagExists('trim', options);
- helper.ensureFlagExists('nativeType', options);
- helper.ensureFlagExists('nativeTypeAttributes', options);
- helper.ensureFlagExists('sanitize', options);
- helper.ensureFlagExists('instructionHasAttributes', options);
- helper.ensureFlagExists('captureSpacesBetweenElements', options);
- helper.ensureAlwaysArrayExists(options);
- helper.ensureKeyExists('declaration', options);
- helper.ensureKeyExists('instruction', options);
- helper.ensureKeyExists('attributes', options);
- helper.ensureKeyExists('text', options);
- helper.ensureKeyExists('comment', options);
- helper.ensureKeyExists('cdata', options);
- helper.ensureKeyExists('doctype', options);
- helper.ensureKeyExists('type', options);
- helper.ensureKeyExists('name', options);
- helper.ensureKeyExists('elements', options);
- helper.ensureKeyExists('parent', options);
- helper.checkFnExists('doctype', options);
- helper.checkFnExists('instruction', options);
- helper.checkFnExists('cdata', options);
- helper.checkFnExists('comment', options);
- helper.checkFnExists('text', options);
- helper.checkFnExists('instructionName', options);
- helper.checkFnExists('elementName', options);
- helper.checkFnExists('attributeName', options);
- helper.checkFnExists('attributeValue', options);
- helper.checkFnExists('attributes', options);
- return options;
- }
- function nativeType(value) {
- var nValue = Number(value);
- if (!isNaN(nValue)) {
- return nValue;
- }
- var bValue = value.toLowerCase();
- if (bValue === 'true') {
- return true;
- } else if (bValue === 'false') {
- return false;
- }
- return value;
- }
- function addField(type, value) {
- var key;
- if (options.compact) {
- if (
- !currentElement[options[type + 'Key']] &&
- (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(options[type + 'Key']) !== -1 : options.alwaysArray)
- ) {
- currentElement[options[type + 'Key']] = [];
- }
- if (currentElement[options[type + 'Key']] && !isArray(currentElement[options[type + 'Key']])) {
- currentElement[options[type + 'Key']] = [currentElement[options[type + 'Key']]];
- }
- if (type + 'Fn' in options && typeof value === 'string') {
- value = options[type + 'Fn'](value, currentElement);
- }
- if (type === 'instruction' && ('instructionFn' in options || 'instructionNameFn' in options)) {
- for (key in value) {
- if (value.hasOwnProperty(key)) {
- if ('instructionFn' in options) {
- value[key] = options.instructionFn(value[key], key, currentElement);
- } else {
- var temp = value[key];
- delete value[key];
- value[options.instructionNameFn(key, temp, currentElement)] = temp;
- }
- }
- }
- }
- if (isArray(currentElement[options[type + 'Key']])) {
- currentElement[options[type + 'Key']].push(value);
- } else {
- currentElement[options[type + 'Key']] = value;
- }
- } else {
- if (!currentElement[options.elementsKey]) {
- currentElement[options.elementsKey] = [];
- }
- var element = {};
- element[options.typeKey] = type;
- if (type === 'instruction') {
- for (key in value) {
- if (value.hasOwnProperty(key)) {
- break;
- }
- }
- element[options.nameKey] = 'instructionNameFn' in options ? options.instructionNameFn(key, value, currentElement) : key;
- if (options.instructionHasAttributes) {
- element[options.attributesKey] = value[key][options.attributesKey];
- if ('instructionFn' in options) {
- element[options.attributesKey] = options.instructionFn(element[options.attributesKey], key, currentElement);
- }
- } else {
- if ('instructionFn' in options) {
- value[key] = options.instructionFn(value[key], key, currentElement);
- }
- element[options.instructionKey] = value[key];
- }
- } else {
- if (type + 'Fn' in options) {
- value = options[type + 'Fn'](value, currentElement);
- }
- element[options[type + 'Key']] = value;
- }
- if (options.addParent) {
- element[options.parentKey] = currentElement;
- }
- currentElement[options.elementsKey].push(element);
- }
- }
- function manipulateAttributes(attributes) {
- if ('attributesFn' in options && attributes) {
- attributes = options.attributesFn(attributes, currentElement);
- }
- if ((options.trim || 'attributeValueFn' in options || 'attributeNameFn' in options || options.nativeTypeAttributes) && attributes) {
- var key;
- for (key in attributes) {
- if (attributes.hasOwnProperty(key)) {
- if (options.trim) attributes[key] = attributes[key].trim();
- if (options.nativeTypeAttributes) {
- attributes[key] = nativeType(attributes[key]);
- }
- if ('attributeValueFn' in options) attributes[key] = options.attributeValueFn(attributes[key], key, currentElement);
- if ('attributeNameFn' in options) {
- var temp = attributes[key];
- delete attributes[key];
- attributes[options.attributeNameFn(key, attributes[key], currentElement)] = temp;
- }
- }
- }
- }
- return attributes;
- }
- function onInstruction(instruction) {
- var attributes = {};
- if (instruction.body && (instruction.name.toLowerCase() === 'xml' || options.instructionHasAttributes)) {
- var attrsRegExp = /([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g;
- var match;
- while ((match = attrsRegExp.exec(instruction.body)) !== null) {
- attributes[match[1]] = match[2] || match[3] || match[4];
- }
- attributes = manipulateAttributes(attributes);
- }
- if (instruction.name.toLowerCase() === 'xml') {
- if (options.ignoreDeclaration) {
- return;
- }
- currentElement[options.declarationKey] = {};
- if (Object.keys(attributes).length) {
- currentElement[options.declarationKey][options.attributesKey] = attributes;
- }
- if (options.addParent) {
- currentElement[options.declarationKey][options.parentKey] = currentElement;
- }
- } else {
- if (options.ignoreInstruction) {
- return;
- }
- if (options.trim) {
- instruction.body = instruction.body.trim();
- }
- var value = {};
- if (options.instructionHasAttributes && Object.keys(attributes).length) {
- value[instruction.name] = {};
- value[instruction.name][options.attributesKey] = attributes;
- } else {
- value[instruction.name] = instruction.body;
- }
- addField('instruction', value);
- }
- }
- function onStartElement(name, attributes) {
- var element;
- if (typeof name === 'object') {
- attributes = name.attributes;
- name = name.name;
- }
- attributes = manipulateAttributes(attributes);
- if ('elementNameFn' in options) {
- name = options.elementNameFn(name, currentElement);
- }
- if (options.compact) {
- element = {};
- if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {
- element[options.attributesKey] = {};
- var key;
- for (key in attributes) {
- if (attributes.hasOwnProperty(key)) {
- element[options.attributesKey][key] = attributes[key];
- }
- }
- }
- if (
- !(name in currentElement) &&
- (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(name) !== -1 : options.alwaysArray)
- ) {
- currentElement[name] = [];
- }
- if (currentElement[name] && !isArray(currentElement[name])) {
- currentElement[name] = [currentElement[name]];
- }
- if (isArray(currentElement[name])) {
- currentElement[name].push(element);
- } else {
- currentElement[name] = element;
- }
- } else {
- if (!currentElement[options.elementsKey]) {
- currentElement[options.elementsKey] = [];
- }
- element = {};
- element[options.typeKey] = 'element';
- element[options.nameKey] = name;
- if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {
- element[options.attributesKey] = attributes;
- }
- if (options.alwaysChildren) {
- element[options.elementsKey] = [];
- }
- currentElement[options.elementsKey].push(element);
- }
- element[options.parentKey] = currentElement; // will be deleted in onEndElement() if !options.addParent
- currentElement = element;
- }
- function onText(text) {
- if (options.ignoreText) {
- return;
- }
- if (!text.trim() && !options.captureSpacesBetweenElements) {
- return;
- }
- if (options.trim) {
- text = text.trim();
- }
- if (options.nativeType) {
- text = nativeType(text);
- }
- if (options.sanitize) {
- text = text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
- }
- addField('text', text);
- }
- function onComment(comment) {
- if (options.ignoreComment) {
- return;
- }
- if (options.trim) {
- comment = comment.trim();
- }
- addField('comment', comment);
- }
- function onEndElement(name) {
- var parentElement = currentElement[options.parentKey];
- if (!options.addParent) {
- delete currentElement[options.parentKey];
- }
- currentElement = parentElement;
- }
- function onCdata(cdata) {
- if (options.ignoreCdata) {
- return;
- }
- if (options.trim) {
- cdata = cdata.trim();
- }
- addField('cdata', cdata);
- }
- function onDoctype(doctype) {
- if (options.ignoreDoctype) {
- return;
- }
- doctype = doctype.replace(/^ /, '');
- if (options.trim) {
- doctype = doctype.trim();
- }
- addField('doctype', doctype);
- }
- function onError(error) {
- error.note = error; //console.error(error);
- }
- module.exports = function (xml, userOptions) {
- var parser = pureJsParser ? sax.parser(true, {}) : parser = new expat.Parser('UTF-8');
- var result = {};
- currentElement = result;
- options = validateOptions(userOptions);
- if (pureJsParser) {
- parser.opt = {strictEntities: true};
- parser.onopentag = onStartElement;
- parser.ontext = onText;
- parser.oncomment = onComment;
- parser.onclosetag = onEndElement;
- parser.onerror = onError;
- parser.oncdata = onCdata;
- parser.ondoctype = onDoctype;
- parser.onprocessinginstruction = onInstruction;
- } else {
- parser.on('startElement', onStartElement);
- parser.on('text', onText);
- parser.on('comment', onComment);
- parser.on('endElement', onEndElement);
- parser.on('error', onError);
- //parser.on('startCdata', onStartCdata);
- //parser.on('endCdata', onEndCdata);
- //parser.on('entityDecl', onEntityDecl);
- }
- if (pureJsParser) {
- parser.write(xml).close();
- } else {
- if (!parser.parse(xml)) {
- throw new Error('XML parsing error: ' + parser.getError());
- }
- }
- if (result[options.elementsKey]) {
- var temp = result[options.elementsKey];
- delete result[options.elementsKey];
- result[options.elementsKey] = temp;
- delete result.text;
- }
- return result;
- };
- /***/ }),
- /* 44 */
- /***/ (function(module, exports) {
- var toString = {}.toString;
- module.exports = Array.isArray || function (arr) {
- return toString.call(arr) == '[object Array]';
- };
- /***/ }),
- /* 45 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- /*<replacement>*/
- var pna = __webpack_require__(24);
- /*</replacement>*/
- module.exports = Readable;
- /*<replacement>*/
- var isArray = __webpack_require__(44);
- /*</replacement>*/
- /*<replacement>*/
- var Duplex;
- /*</replacement>*/
- Readable.ReadableState = ReadableState;
- /*<replacement>*/
- var EE = __webpack_require__(20).EventEmitter;
- var EElistenerCount = function (emitter, type) {
- return emitter.listeners(type).length;
- };
- /*</replacement>*/
- /*<replacement>*/
- var Stream = __webpack_require__(46);
- /*</replacement>*/
- /*<replacement>*/
- var Buffer = __webpack_require__(25).Buffer;
- var OurUint8Array = global.Uint8Array || function () {};
- function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk);
- }
- function _isUint8Array(obj) {
- return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
- }
- /*</replacement>*/
- /*<replacement>*/
- var util = __webpack_require__(21);
- util.inherits = __webpack_require__(16);
- /*</replacement>*/
- /*<replacement>*/
- var debugUtil = __webpack_require__(84);
- var debug = void 0;
- if (debugUtil && debugUtil.debuglog) {
- debug = debugUtil.debuglog('stream');
- } else {
- debug = function () {};
- }
- /*</replacement>*/
- var BufferList = __webpack_require__(85);
- var destroyImpl = __webpack_require__(47);
- var StringDecoder;
- util.inherits(Readable, Stream);
- var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
- function prependListener(emitter, event, fn) {
- // Sadly this is not cacheable as some libraries bundle their own
- // event emitter implementation with them.
- if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- // the prependListener() method. The goal is to eventually remove this hack.
- if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
- }
- function ReadableState(options, stream) {
- Duplex = Duplex || __webpack_require__(14);
- options = options || {};
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- var isDuplex = stream instanceof Duplex;
- // object stream flag. Used to make read(n) ignore n and to
- // make all the buffer merging and length checks go away
- this.objectMode = !!options.objectMode;
- if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
- // the point at which it stops calling _read() to fill the buffer
- // Note: 0 is a valid value, means "don't call _read preemptively ever"
- var hwm = options.highWaterMark;
- var readableHwm = options.readableHighWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
- if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
- // cast to ints.
- this.highWaterMark = Math.floor(this.highWaterMark);
- // A linked list is used to store data chunks instead of an array because the
- // linked list can remove elements from the beginning faster than
- // array.shift()
- this.buffer = new BufferList();
- this.length = 0;
- this.pipes = null;
- this.pipesCount = 0;
- this.flowing = null;
- this.ended = false;
- this.endEmitted = false;
- this.reading = false;
- // a flag to be able to tell if the event 'readable'/'data' is emitted
- // immediately, or on a later tick. We set this to true at first, because
- // any actions that shouldn't happen until "later" should generally also
- // not happen before the first read call.
- this.sync = true;
- // whenever we return null, then we set a flag to say
- // that we're awaiting a 'readable' event emission.
- this.needReadable = false;
- this.emittedReadable = false;
- this.readableListening = false;
- this.resumeScheduled = false;
- // has it been destroyed
- this.destroyed = false;
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
- // the number of writers that are awaiting a drain event in .pipe()s
- this.awaitDrain = 0;
- // if true, a maybeReadMore has been scheduled
- this.readingMore = false;
- this.decoder = null;
- this.encoding = null;
- if (options.encoding) {
- if (!StringDecoder) StringDecoder = __webpack_require__(30).StringDecoder;
- this.decoder = new StringDecoder(options.encoding);
- this.encoding = options.encoding;
- }
- }
- function Readable(options) {
- Duplex = Duplex || __webpack_require__(14);
- if (!(this instanceof Readable)) return new Readable(options);
- this._readableState = new ReadableState(options, this);
- // legacy
- this.readable = true;
- if (options) {
- if (typeof options.read === 'function') this._read = options.read;
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
- }
- Stream.call(this);
- }
- Object.defineProperty(Readable.prototype, 'destroyed', {
- get: function () {
- if (this._readableState === undefined) {
- return false;
- }
- return this._readableState.destroyed;
- },
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (!this._readableState) {
- return;
- }
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._readableState.destroyed = value;
- }
- });
- Readable.prototype.destroy = destroyImpl.destroy;
- Readable.prototype._undestroy = destroyImpl.undestroy;
- Readable.prototype._destroy = function (err, cb) {
- this.push(null);
- cb(err);
- };
- // Manually shove something into the read() buffer.
- // This returns true if the highWaterMark has not been hit yet,
- // similar to how Writable.write() returns true if you should
- // write() some more.
- Readable.prototype.push = function (chunk, encoding) {
- var state = this._readableState;
- var skipChunkCheck;
- if (!state.objectMode) {
- if (typeof chunk === 'string') {
- encoding = encoding || state.defaultEncoding;
- if (encoding !== state.encoding) {
- chunk = Buffer.from(chunk, encoding);
- encoding = '';
- }
- skipChunkCheck = true;
- }
- } else {
- skipChunkCheck = true;
- }
- return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
- };
- // Unshift should *always* be something directly out of read()
- Readable.prototype.unshift = function (chunk) {
- return readableAddChunk(this, chunk, null, true, false);
- };
- function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
- var state = stream._readableState;
- if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
- } else {
- var er;
- if (!skipChunkCheck) er = chunkInvalid(state, chunk);
- if (er) {
- stream.emit('error', er);
- } else if (state.objectMode || chunk && chunk.length > 0) {
- if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
- chunk = _uint8ArrayToBuffer(chunk);
- }
- if (addToFront) {
- if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
- } else if (state.ended) {
- stream.emit('error', new Error('stream.push() after EOF'));
- } else {
- state.reading = false;
- if (state.decoder && !encoding) {
- chunk = state.decoder.write(chunk);
- if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
- } else {
- addChunk(stream, state, chunk, false);
- }
- }
- } else if (!addToFront) {
- state.reading = false;
- }
- }
- return needMoreData(state);
- }
- function addChunk(stream, state, chunk, addToFront) {
- if (state.flowing && state.length === 0 && !state.sync) {
- stream.emit('data', chunk);
- stream.read(0);
- } else {
- // update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length;
- if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
- if (state.needReadable) emitReadable(stream);
- }
- maybeReadMore(stream, state);
- }
- function chunkInvalid(state, chunk) {
- var er;
- if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
- }
- return er;
- }
- // if it's past the high water mark, we can push in some more.
- // Also, if we have no data yet, we can stand some
- // more bytes. This is to work around cases where hwm=0,
- // such as the repl. Also, if the push() triggered a
- // readable event, and the user called read(largeNumber) such that
- // needReadable was set, then we ought to push more, so that another
- // 'readable' event will be triggered.
- function needMoreData(state) {
- return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
- }
- Readable.prototype.isPaused = function () {
- return this._readableState.flowing === false;
- };
- // backwards compatibility.
- Readable.prototype.setEncoding = function (enc) {
- if (!StringDecoder) StringDecoder = __webpack_require__(30).StringDecoder;
- this._readableState.decoder = new StringDecoder(enc);
- this._readableState.encoding = enc;
- return this;
- };
- // Don't raise the hwm > 8MB
- var MAX_HWM = 0x800000;
- function computeNewHighWaterMark(n) {
- if (n >= MAX_HWM) {
- n = MAX_HWM;
- } else {
- // Get the next highest power of 2 to prevent increasing hwm excessively in
- // tiny amounts
- n--;
- n |= n >>> 1;
- n |= n >>> 2;
- n |= n >>> 4;
- n |= n >>> 8;
- n |= n >>> 16;
- n++;
- }
- return n;
- }
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function howMuchToRead(n, state) {
- if (n <= 0 || state.length === 0 && state.ended) return 0;
- if (state.objectMode) return 1;
- if (n !== n) {
- // Only flow one buffer at a time
- if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
- }
- // If we're asking for more than the current hwm, then raise the hwm.
- if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
- if (n <= state.length) return n;
- // Don't have enough
- if (!state.ended) {
- state.needReadable = true;
- return 0;
- }
- return state.length;
- }
- // you can override either this method, or the async _read(n) below.
- Readable.prototype.read = function (n) {
- debug('read', n);
- n = parseInt(n, 10);
- var state = this._readableState;
- var nOrig = n;
- if (n !== 0) state.emittedReadable = false;
- // if we're doing read(0) to trigger a readable event, but we
- // already have a bunch of data in the buffer, then just trigger
- // the 'readable' event and move on.
- if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
- debug('read: emitReadable', state.length, state.ended);
- if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
- return null;
- }
- n = howMuchToRead(n, state);
- // if we've ended, and we're now clear, then finish it up.
- if (n === 0 && state.ended) {
- if (state.length === 0) endReadable(this);
- return null;
- }
- // All the actual chunk generation logic needs to be
- // *below* the call to _read. The reason is that in certain
- // synthetic stream cases, such as passthrough streams, _read
- // may be a completely synchronous operation which may change
- // the state of the read buffer, providing enough data when
- // before there was *not* enough.
- //
- // So, the steps are:
- // 1. Figure out what the state of things will be after we do
- // a read from the buffer.
- //
- // 2. If that resulting state will trigger a _read, then call _read.
- // Note that this may be asynchronous, or synchronous. Yes, it is
- // deeply ugly to write APIs this way, but that still doesn't mean
- // that the Readable class should behave improperly, as streams are
- // designed to be sync/async agnostic.
- // Take note if the _read call is sync or async (ie, if the read call
- // has returned yet), so that we know whether or not it's safe to emit
- // 'readable' etc.
- //
- // 3. Actually pull the requested chunks out of the buffer and return.
- // if we need a readable event, then we need to do some reading.
- var doRead = state.needReadable;
- debug('need readable', doRead);
- // if we currently have less than the highWaterMark, then also read some
- if (state.length === 0 || state.length - n < state.highWaterMark) {
- doRead = true;
- debug('length less than watermark', doRead);
- }
- // however, if we've ended, then there's no point, and if we're already
- // reading, then it's unnecessary.
- if (state.ended || state.reading) {
- doRead = false;
- debug('reading or ended', doRead);
- } else if (doRead) {
- debug('do read');
- state.reading = true;
- state.sync = true;
- // if the length is currently zero, then we *need* a readable event.
- if (state.length === 0) state.needReadable = true;
- // call internal read method
- this._read(state.highWaterMark);
- state.sync = false;
- // If _read pushed data synchronously, then `reading` will be false,
- // and we need to re-evaluate how much data we can return to the user.
- if (!state.reading) n = howMuchToRead(nOrig, state);
- }
- var ret;
- if (n > 0) ret = fromList(n, state);else ret = null;
- if (ret === null) {
- state.needReadable = true;
- n = 0;
- } else {
- state.length -= n;
- }
- if (state.length === 0) {
- // If we have nothing in the buffer, then we want to know
- // as soon as we *do* get something into the buffer.
- if (!state.ended) state.needReadable = true;
- // If we tried to read() past the EOF, then emit end on the next tick.
- if (nOrig !== n && state.ended) endReadable(this);
- }
- if (ret !== null) this.emit('data', ret);
- return ret;
- };
- function onEofChunk(stream, state) {
- if (state.ended) return;
- if (state.decoder) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) {
- state.buffer.push(chunk);
- state.length += state.objectMode ? 1 : chunk.length;
- }
- }
- state.ended = true;
- // emit 'readable' now to make sure it gets picked up.
- emitReadable(stream);
- }
- // Don't emit readable right away in sync mode, because this can trigger
- // another read() call => stack overflow. This way, it might trigger
- // a nextTick recursion warning, but that's not so bad.
- function emitReadable(stream) {
- var state = stream._readableState;
- state.needReadable = false;
- if (!state.emittedReadable) {
- debug('emitReadable', state.flowing);
- state.emittedReadable = true;
- if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
- }
- }
- function emitReadable_(stream) {
- debug('emit readable');
- stream.emit('readable');
- flow(stream);
- }
- // at this point, the user has presumably seen the 'readable' event,
- // and called read() to consume some data. that may have triggered
- // in turn another _read(n) call, in which case reading = true if
- // it's in progress.
- // However, if we're not ended, or reading, and the length < hwm,
- // then go ahead and try to read some more preemptively.
- function maybeReadMore(stream, state) {
- if (!state.readingMore) {
- state.readingMore = true;
- pna.nextTick(maybeReadMore_, stream, state);
- }
- }
- function maybeReadMore_(stream, state) {
- var len = state.length;
- while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
- debug('maybeReadMore read 0');
- stream.read(0);
- if (len === state.length)
- // didn't get any data, stop spinning.
- break;else len = state.length;
- }
- state.readingMore = false;
- }
- // abstract method. to be overridden in specific implementation classes.
- // call cb(er, data) where data is <= n in length.
- // for virtual (non-string, non-buffer) streams, "length" is somewhat
- // arbitrary, and perhaps not very meaningful.
- Readable.prototype._read = function (n) {
- this.emit('error', new Error('_read() is not implemented'));
- };
- Readable.prototype.pipe = function (dest, pipeOpts) {
- var src = this;
- var state = this._readableState;
- switch (state.pipesCount) {
- case 0:
- state.pipes = dest;
- break;
- case 1:
- state.pipes = [state.pipes, dest];
- break;
- default:
- state.pipes.push(dest);
- break;
- }
- state.pipesCount += 1;
- debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
- var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
- var endFn = doEnd ? onend : unpipe;
- if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
- dest.on('unpipe', onunpipe);
- function onunpipe(readable, unpipeInfo) {
- debug('onunpipe');
- if (readable === src) {
- if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
- unpipeInfo.hasUnpiped = true;
- cleanup();
- }
- }
- }
- function onend() {
- debug('onend');
- dest.end();
- }
- // when the dest drains, it reduces the awaitDrain counter
- // on the source. This would be more elegant with a .once()
- // handler in flow(), but adding and removing repeatedly is
- // too slow.
- var ondrain = pipeOnDrain(src);
- dest.on('drain', ondrain);
- var cleanedUp = false;
- function cleanup() {
- debug('cleanup');
- // cleanup event handlers once the pipe is broken
- dest.removeListener('close', onclose);
- dest.removeListener('finish', onfinish);
- dest.removeListener('drain', ondrain);
- dest.removeListener('error', onerror);
- dest.removeListener('unpipe', onunpipe);
- src.removeListener('end', onend);
- src.removeListener('end', unpipe);
- src.removeListener('data', ondata);
- cleanedUp = true;
- // if the reader is waiting for a drain event from this
- // specific writer, then it would cause it to never start
- // flowing again.
- // So, if this is awaiting a drain, then we just call it now.
- // If we don't know, then assume that we are waiting for one.
- if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
- }
- // If the user pushes more data while we're writing to dest then we'll end up
- // in ondata again. However, we only want to increase awaitDrain once because
- // dest will only emit one 'drain' event for the multiple writes.
- // => Introduce a guard on increasing awaitDrain.
- var increasedAwaitDrain = false;
- src.on('data', ondata);
- function ondata(chunk) {
- debug('ondata');
- increasedAwaitDrain = false;
- var ret = dest.write(chunk);
- if (false === ret && !increasedAwaitDrain) {
- // If the user unpiped during `dest.write()`, it is possible
- // to get stuck in a permanently paused state if that write
- // also returned false.
- // => Check whether `dest` is still a piping destination.
- if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
- debug('false write response, pause', src._readableState.awaitDrain);
- src._readableState.awaitDrain++;
- increasedAwaitDrain = true;
- }
- src.pause();
- }
- }
- // if the dest has an error, then stop piping into it.
- // however, don't suppress the throwing behavior for this.
- function onerror(er) {
- debug('onerror', er);
- unpipe();
- dest.removeListener('error', onerror);
- if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
- }
- // Make sure our error handler is attached before userland ones.
- prependListener(dest, 'error', onerror);
- // Both close and finish should trigger unpipe, but only once.
- function onclose() {
- dest.removeListener('finish', onfinish);
- unpipe();
- }
- dest.once('close', onclose);
- function onfinish() {
- debug('onfinish');
- dest.removeListener('close', onclose);
- unpipe();
- }
- dest.once('finish', onfinish);
- function unpipe() {
- debug('unpipe');
- src.unpipe(dest);
- }
- // tell the dest that it's being piped to
- dest.emit('pipe', src);
- // start the flow if it hasn't been started already.
- if (!state.flowing) {
- debug('pipe resume');
- src.resume();
- }
- return dest;
- };
- function pipeOnDrain(src) {
- return function () {
- var state = src._readableState;
- debug('pipeOnDrain', state.awaitDrain);
- if (state.awaitDrain) state.awaitDrain--;
- if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
- state.flowing = true;
- flow(src);
- }
- };
- }
- Readable.prototype.unpipe = function (dest) {
- var state = this._readableState;
- var unpipeInfo = { hasUnpiped: false };
- // if we're not piping anywhere, then do nothing.
- if (state.pipesCount === 0) return this;
- // just one destination. most common case.
- if (state.pipesCount === 1) {
- // passed in one, but it's not the right one.
- if (dest && dest !== state.pipes) return this;
- if (!dest) dest = state.pipes;
- // got a match.
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
- if (dest) dest.emit('unpipe', this, unpipeInfo);
- return this;
- }
- // slow case. multiple pipe destinations.
- if (!dest) {
- // remove all.
- var dests = state.pipes;
- var len = state.pipesCount;
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
- for (var i = 0; i < len; i++) {
- dests[i].emit('unpipe', this, unpipeInfo);
- }return this;
- }
- // try to find the right one.
- var index = indexOf(state.pipes, dest);
- if (index === -1) return this;
- state.pipes.splice(index, 1);
- state.pipesCount -= 1;
- if (state.pipesCount === 1) state.pipes = state.pipes[0];
- dest.emit('unpipe', this, unpipeInfo);
- return this;
- };
- // set up data events if they are asked for
- // Ensure readable listeners eventually get something
- Readable.prototype.on = function (ev, fn) {
- var res = Stream.prototype.on.call(this, ev, fn);
- if (ev === 'data') {
- // Start flowing on next tick if stream isn't explicitly paused
- if (this._readableState.flowing !== false) this.resume();
- } else if (ev === 'readable') {
- var state = this._readableState;
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.emittedReadable = false;
- if (!state.reading) {
- pna.nextTick(nReadingNextTick, this);
- } else if (state.length) {
- emitReadable(this);
- }
- }
- }
- return res;
- };
- Readable.prototype.addListener = Readable.prototype.on;
- function nReadingNextTick(self) {
- debug('readable nexttick read 0');
- self.read(0);
- }
- // pause() and resume() are remnants of the legacy readable stream API
- // If the user uses them, then switch into old mode.
- Readable.prototype.resume = function () {
- var state = this._readableState;
- if (!state.flowing) {
- debug('resume');
- state.flowing = true;
- resume(this, state);
- }
- return this;
- };
- function resume(stream, state) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true;
- pna.nextTick(resume_, stream, state);
- }
- }
- function resume_(stream, state) {
- if (!state.reading) {
- debug('resume read 0');
- stream.read(0);
- }
- state.resumeScheduled = false;
- state.awaitDrain = 0;
- stream.emit('resume');
- flow(stream);
- if (state.flowing && !state.reading) stream.read(0);
- }
- Readable.prototype.pause = function () {
- debug('call pause flowing=%j', this._readableState.flowing);
- if (false !== this._readableState.flowing) {
- debug('pause');
- this._readableState.flowing = false;
- this.emit('pause');
- }
- return this;
- };
- function flow(stream) {
- var state = stream._readableState;
- debug('flow', state.flowing);
- while (state.flowing && stream.read() !== null) {}
- }
- // wrap an old-style stream as the async data source.
- // This is *not* part of the readable stream interface.
- // It is an ugly unfortunate mess of history.
- Readable.prototype.wrap = function (stream) {
- var _this = this;
- var state = this._readableState;
- var paused = false;
- stream.on('end', function () {
- debug('wrapped end');
- if (state.decoder && !state.ended) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) _this.push(chunk);
- }
- _this.push(null);
- });
- stream.on('data', function (chunk) {
- debug('wrapped data');
- if (state.decoder) chunk = state.decoder.write(chunk);
- // don't skip over falsy values in objectMode
- if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
- var ret = _this.push(chunk);
- if (!ret) {
- paused = true;
- stream.pause();
- }
- });
- // proxy all the other methods.
- // important when wrapping filters and duplexes.
- for (var i in stream) {
- if (this[i] === undefined && typeof stream[i] === 'function') {
- this[i] = function (method) {
- return function () {
- return stream[method].apply(stream, arguments);
- };
- }(i);
- }
- }
- // proxy certain important events.
- for (var n = 0; n < kProxyEvents.length; n++) {
- stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
- }
- // when we try to consume some more bytes, simply unpause the
- // underlying stream.
- this._read = function (n) {
- debug('wrapped _read', n);
- if (paused) {
- paused = false;
- stream.resume();
- }
- };
- return this;
- };
- Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._readableState.highWaterMark;
- }
- });
- // exposed for testing purposes only.
- Readable._fromList = fromList;
- // Pluck off n bytes from an array of buffers.
- // Length is the combined lengths of all the buffers in the list.
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function fromList(n, state) {
- // nothing buffered
- if (state.length === 0) return null;
- var ret;
- if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
- // read it all, truncate the list
- if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
- state.buffer.clear();
- } else {
- // read part of list
- ret = fromListPartial(n, state.buffer, state.decoder);
- }
- return ret;
- }
- // Extracts only enough buffered data to satisfy the amount requested.
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function fromListPartial(n, list, hasStrings) {
- var ret;
- if (n < list.head.data.length) {
- // slice is the same for buffers and strings
- ret = list.head.data.slice(0, n);
- list.head.data = list.head.data.slice(n);
- } else if (n === list.head.data.length) {
- // first chunk is a perfect match
- ret = list.shift();
- } else {
- // result spans more than one buffer
- ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
- }
- return ret;
- }
- // Copies a specified amount of characters from the list of buffered data
- // chunks.
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function copyFromBufferString(n, list) {
- var p = list.head;
- var c = 1;
- var ret = p.data;
- n -= ret.length;
- while (p = p.next) {
- var str = p.data;
- var nb = n > str.length ? str.length : n;
- if (nb === str.length) ret += str;else ret += str.slice(0, n);
- n -= nb;
- if (n === 0) {
- if (nb === str.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = str.slice(nb);
- }
- break;
- }
- ++c;
- }
- list.length -= c;
- return ret;
- }
- // Copies a specified amount of bytes from the list of buffered data chunks.
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function copyFromBuffer(n, list) {
- var ret = Buffer.allocUnsafe(n);
- var p = list.head;
- var c = 1;
- p.data.copy(ret);
- n -= p.data.length;
- while (p = p.next) {
- var buf = p.data;
- var nb = n > buf.length ? buf.length : n;
- buf.copy(ret, ret.length - n, 0, nb);
- n -= nb;
- if (n === 0) {
- if (nb === buf.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = buf.slice(nb);
- }
- break;
- }
- ++c;
- }
- list.length -= c;
- return ret;
- }
- function endReadable(stream) {
- var state = stream._readableState;
- // If we get here before consuming all the bytes, then that is a
- // bug in node. Should never happen.
- if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
- if (!state.endEmitted) {
- state.ended = true;
- pna.nextTick(endReadableNT, state, stream);
- }
- }
- function endReadableNT(state, stream) {
- // Check that we didn't get one last unshift.
- if (!state.endEmitted && state.length === 0) {
- state.endEmitted = true;
- stream.readable = false;
- stream.emit('end');
- }
- }
- function indexOf(xs, x) {
- for (var i = 0, l = xs.length; i < l; i++) {
- if (xs[i] === x) return i;
- }
- return -1;
- }
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10), __webpack_require__(23)))
- /***/ }),
- /* 46 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(20).EventEmitter;
- /***/ }),
- /* 47 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /*<replacement>*/
- var pna = __webpack_require__(24);
- /*</replacement>*/
- // undocumented cb() API, needed for core, not for public API
- function destroy(err, cb) {
- var _this = this;
- var readableDestroyed = this._readableState && this._readableState.destroyed;
- var writableDestroyed = this._writableState && this._writableState.destroyed;
- if (readableDestroyed || writableDestroyed) {
- if (cb) {
- cb(err);
- } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
- pna.nextTick(emitErrorNT, this, err);
- }
- return this;
- }
- // we set destroyed to true before firing error callbacks in order
- // to make it re-entrance safe in case destroy() is called within callbacks
- if (this._readableState) {
- this._readableState.destroyed = true;
- }
- // if this is a duplex stream mark the writable part as destroyed as well
- if (this._writableState) {
- this._writableState.destroyed = true;
- }
- this._destroy(err || null, function (err) {
- if (!cb && err) {
- pna.nextTick(emitErrorNT, _this, err);
- if (_this._writableState) {
- _this._writableState.errorEmitted = true;
- }
- } else if (cb) {
- cb(err);
- }
- });
- return this;
- }
- function undestroy() {
- if (this._readableState) {
- this._readableState.destroyed = false;
- this._readableState.reading = false;
- this._readableState.ended = false;
- this._readableState.endEmitted = false;
- }
- if (this._writableState) {
- this._writableState.destroyed = false;
- this._writableState.ended = false;
- this._writableState.ending = false;
- this._writableState.finished = false;
- this._writableState.errorEmitted = false;
- }
- }
- function emitErrorNT(self, err) {
- self.emit('error', err);
- }
- module.exports = {
- destroy: destroy,
- undestroy: undestroy
- };
- /***/ }),
- /* 48 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- // a transform stream is a readable/writable stream where you do
- // something with the data. Sometimes it's called a "filter",
- // but that's not a great name for it, since that implies a thing where
- // some bits pass through, and others are simply ignored. (That would
- // be a valid example of a transform, of course.)
- //
- // While the output is causally related to the input, it's not a
- // necessarily symmetric or synchronous transformation. For example,
- // a zlib stream might take multiple plain-text writes(), and then
- // emit a single compressed chunk some time in the future.
- //
- // Here's how this works:
- //
- // The Transform stream has all the aspects of the readable and writable
- // stream classes. When you write(chunk), that calls _write(chunk,cb)
- // internally, and returns false if there's a lot of pending writes
- // buffered up. When you call read(), that calls _read(n) until
- // there's enough pending readable data buffered up.
- //
- // In a transform stream, the written data is placed in a buffer. When
- // _read(n) is called, it transforms the queued up data, calling the
- // buffered _write cb's as it consumes chunks. If consuming a single
- // written chunk would result in multiple output chunks, then the first
- // outputted bit calls the readcb, and subsequent chunks just go into
- // the read buffer, and will cause it to emit 'readable' if necessary.
- //
- // This way, back-pressure is actually determined by the reading side,
- // since _read has to be called to start processing a new chunk. However,
- // a pathological inflate type of transform can cause excessive buffering
- // here. For example, imagine a stream where every byte of input is
- // interpreted as an integer from 0-255, and then results in that many
- // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
- // 1kb of data being output. In this case, you could write a very small
- // amount of input, and end up with a very large amount of output. In
- // such a pathological inflating mechanism, there'd be no way to tell
- // the system to stop doing the transform. A single 4MB write could
- // cause the system to run out of memory.
- //
- // However, even in such a pathological case, only a single written chunk
- // would be consumed, and then the rest would wait (un-transformed) until
- // the results of the previous transformed chunk were consumed.
- module.exports = Transform;
- var Duplex = __webpack_require__(14);
- /*<replacement>*/
- var util = __webpack_require__(21);
- util.inherits = __webpack_require__(16);
- /*</replacement>*/
- util.inherits(Transform, Duplex);
- function afterTransform(er, data) {
- var ts = this._transformState;
- ts.transforming = false;
- var cb = ts.writecb;
- if (!cb) {
- return this.emit('error', new Error('write callback called multiple times'));
- }
- ts.writechunk = null;
- ts.writecb = null;
- if (data != null) // single equals check for both `null` and `undefined`
- this.push(data);
- cb(er);
- var rs = this._readableState;
- rs.reading = false;
- if (rs.needReadable || rs.length < rs.highWaterMark) {
- this._read(rs.highWaterMark);
- }
- }
- function Transform(options) {
- if (!(this instanceof Transform)) return new Transform(options);
- Duplex.call(this, options);
- this._transformState = {
- afterTransform: afterTransform.bind(this),
- needTransform: false,
- transforming: false,
- writecb: null,
- writechunk: null,
- writeencoding: null
- };
- // start out asking for a readable event once data is transformed.
- this._readableState.needReadable = true;
- // we have implemented the _read method, and done the other things
- // that Readable wants before the first _read call, so unset the
- // sync guard flag.
- this._readableState.sync = false;
- if (options) {
- if (typeof options.transform === 'function') this._transform = options.transform;
- if (typeof options.flush === 'function') this._flush = options.flush;
- }
- // When the writable side finishes, then flush out anything remaining.
- this.on('prefinish', prefinish);
- }
- function prefinish() {
- var _this = this;
- if (typeof this._flush === 'function') {
- this._flush(function (er, data) {
- done(_this, er, data);
- });
- } else {
- done(this, null, null);
- }
- }
- Transform.prototype.push = function (chunk, encoding) {
- this._transformState.needTransform = false;
- return Duplex.prototype.push.call(this, chunk, encoding);
- };
- // This is the part where you do stuff!
- // override this function in implementation classes.
- // 'chunk' is an input chunk.
- //
- // Call `push(newChunk)` to pass along transformed output
- // to the readable side. You may call 'push' zero or more times.
- //
- // Call `cb(err)` when you are done with this chunk. If you pass
- // an error, then that'll put the hurt on the whole operation. If you
- // never call cb(), then you'll never get another chunk.
- Transform.prototype._transform = function (chunk, encoding, cb) {
- throw new Error('_transform() is not implemented');
- };
- Transform.prototype._write = function (chunk, encoding, cb) {
- var ts = this._transformState;
- ts.writecb = cb;
- ts.writechunk = chunk;
- ts.writeencoding = encoding;
- if (!ts.transforming) {
- var rs = this._readableState;
- if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
- }
- };
- // Doesn't matter what the args are here.
- // _transform does all the work.
- // That we got here means that the readable side wants more data.
- Transform.prototype._read = function (n) {
- var ts = this._transformState;
- if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
- ts.transforming = true;
- this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
- } else {
- // mark that we need a transform, so that any data that comes in
- // will get processed, now that we've asked for it.
- ts.needTransform = true;
- }
- };
- Transform.prototype._destroy = function (err, cb) {
- var _this2 = this;
- Duplex.prototype._destroy.call(this, err, function (err2) {
- cb(err2);
- _this2.emit('close');
- });
- };
- function done(stream, er, data) {
- if (er) return stream.emit('error', er);
- if (data != null) // single equals check for both `null` and `undefined`
- stream.push(data);
- // if there's nothing in the write buffer, then that means
- // that nothing more will ever be provided
- if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
- if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
- return stream.push(null);
- }
- /***/ }),
- /* 49 */
- /***/ (function(module, exports, __webpack_require__) {
- var helper = __webpack_require__(31);
- var isArray = __webpack_require__(32).isArray;
- var currentElement, currentElementName;
- function validateOptions(userOptions) {
- var options = helper.copyOptions(userOptions);
- helper.ensureFlagExists('ignoreDeclaration', options);
- helper.ensureFlagExists('ignoreInstruction', options);
- helper.ensureFlagExists('ignoreAttributes', options);
- helper.ensureFlagExists('ignoreText', options);
- helper.ensureFlagExists('ignoreComment', options);
- helper.ensureFlagExists('ignoreCdata', options);
- helper.ensureFlagExists('ignoreDoctype', options);
- helper.ensureFlagExists('compact', options);
- helper.ensureFlagExists('indentText', options);
- helper.ensureFlagExists('indentCdata', options);
- helper.ensureFlagExists('indentAttributes', options);
- helper.ensureFlagExists('indentInstruction', options);
- helper.ensureFlagExists('fullTagEmptyElement', options);
- helper.ensureFlagExists('noQuotesForNativeAttributes', options);
- helper.ensureSpacesExists(options);
- if (typeof options.spaces === 'number') {
- options.spaces = Array(options.spaces + 1).join(' ');
- }
- helper.ensureKeyExists('declaration', options);
- helper.ensureKeyExists('instruction', options);
- helper.ensureKeyExists('attributes', options);
- helper.ensureKeyExists('text', options);
- helper.ensureKeyExists('comment', options);
- helper.ensureKeyExists('cdata', options);
- helper.ensureKeyExists('doctype', options);
- helper.ensureKeyExists('type', options);
- helper.ensureKeyExists('name', options);
- helper.ensureKeyExists('elements', options);
- helper.checkFnExists('doctype', options);
- helper.checkFnExists('instruction', options);
- helper.checkFnExists('cdata', options);
- helper.checkFnExists('comment', options);
- helper.checkFnExists('text', options);
- helper.checkFnExists('instructionName', options);
- helper.checkFnExists('elementName', options);
- helper.checkFnExists('attributeName', options);
- helper.checkFnExists('attributeValue', options);
- helper.checkFnExists('attributes', options);
- helper.checkFnExists('fullTagEmptyElement', options);
- return options;
- }
- function writeIndentation(options, depth, firstLine) {
- return (!firstLine && options.spaces ? '\n' : '') + Array(depth + 1).join(options.spaces);
- }
- function writeAttributes(attributes, options, depth) {
- if (options.ignoreAttributes) {
- return '';
- }
- if ('attributesFn' in options) {
- attributes = options.attributesFn(attributes, currentElementName, currentElement);
- }
- var key, attr, attrName, quote, result = [];
- for (key in attributes) {
- if (attributes.hasOwnProperty(key) && attributes[key] !== null && attributes[key] !== undefined) {
- quote = options.noQuotesForNativeAttributes && typeof attributes[key] !== 'string' ? '' : '"';
- attr = '' + attributes[key]; // ensure number and boolean are converted to String
- attr = attr.replace(/"/g, '"');
- attrName = 'attributeNameFn' in options ? options.attributeNameFn(key, attr, currentElementName, currentElement) : key;
- result.push((options.spaces && options.indentAttributes? writeIndentation(options, depth+1, false) : ' '));
- result.push(attrName + '=' + quote + ('attributeValueFn' in options ? options.attributeValueFn(attr, key, currentElementName, currentElement) : attr) + quote);
- }
- }
- if (attributes && Object.keys(attributes).length && options.spaces && options.indentAttributes) {
- result.push(writeIndentation(options, depth, false));
- }
- return result.join('');
- }
- function writeDeclaration(declaration, options, depth) {
- currentElement = declaration;
- currentElementName = 'xml';
- return options.ignoreDeclaration ? '' : '<?' + 'xml' + writeAttributes(declaration[options.attributesKey], options, depth) + '?>';
- }
- function writeInstruction(instruction, options, depth) {
- if (options.ignoreInstruction) {
- return '';
- }
- var key;
- for (key in instruction) {
- if (instruction.hasOwnProperty(key)) {
- break;
- }
- }
- var instructionName = 'instructionNameFn' in options ? options.instructionNameFn(key, instruction[key], currentElementName, currentElement) : key;
- if (typeof instruction[key] === 'object') {
- currentElement = instruction;
- currentElementName = instructionName;
- return '<?' + instructionName + writeAttributes(instruction[key][options.attributesKey], options, depth) + '?>';
- } else {
- var instructionValue = instruction[key] ? instruction[key] : '';
- if ('instructionFn' in options) instructionValue = options.instructionFn(instructionValue, key, currentElementName, currentElement);
- return '<?' + instructionName + (instructionValue ? ' ' + instructionValue : '') + '?>';
- }
- }
- function writeComment(comment, options) {
- return options.ignoreComment ? '' : '<!--' + ('commentFn' in options ? options.commentFn(comment, currentElementName, currentElement) : comment) + '-->';
- }
- function writeCdata(cdata, options) {
- return options.ignoreCdata ? '' : '<![CDATA[' + ('cdataFn' in options ? options.cdataFn(cdata, currentElementName, currentElement) : cdata.replace(']]>', ']]]]><![CDATA[>')) + ']]>';
- }
- function writeDoctype(doctype, options) {
- return options.ignoreDoctype ? '' : '<!DOCTYPE ' + ('doctypeFn' in options ? options.doctypeFn(doctype, currentElementName, currentElement) : doctype) + '>';
- }
- function writeText(text, options) {
- if (options.ignoreText) return '';
- text = '' + text; // ensure Number and Boolean are converted to String
- text = text.replace(/&/g, '&'); // desanitize to avoid double sanitization
- text = text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
- return 'textFn' in options ? options.textFn(text, currentElementName, currentElement) : text;
- }
- function hasContent(element, options) {
- var i;
- if (element.elements && element.elements.length) {
- for (i = 0; i < element.elements.length; ++i) {
- switch (element.elements[i][options.typeKey]) {
- case 'text':
- if (options.indentText) {
- return true;
- }
- break; // skip to next key
- case 'cdata':
- if (options.indentCdata) {
- return true;
- }
- break; // skip to next key
- case 'instruction':
- if (options.indentInstruction) {
- return true;
- }
- break; // skip to next key
- case 'doctype':
- case 'comment':
- case 'element':
- return true;
- default:
- return true;
- }
- }
- }
- return false;
- }
- function writeElement(element, options, depth) {
- currentElement = element;
- currentElementName = element.name;
- var xml = [], elementName = 'elementNameFn' in options ? options.elementNameFn(element.name, element) : element.name;
- xml.push('<' + elementName);
- if (element[options.attributesKey]) {
- xml.push(writeAttributes(element[options.attributesKey], options, depth));
- }
- var withClosingTag = element[options.elementsKey] && element[options.elementsKey].length || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';
- if (!withClosingTag) {
- if ('fullTagEmptyElementFn' in options) {
- withClosingTag = options.fullTagEmptyElementFn(element.name, element);
- } else {
- withClosingTag = options.fullTagEmptyElement;
- }
- }
- if (withClosingTag) {
- xml.push('>');
- if (element[options.elementsKey] && element[options.elementsKey].length) {
- xml.push(writeElements(element[options.elementsKey], options, depth + 1));
- currentElement = element;
- currentElementName = element.name;
- }
- xml.push(options.spaces && hasContent(element, options) ? '\n' + Array(depth + 1).join(options.spaces) : '');
- xml.push('</' + elementName + '>');
- } else {
- xml.push('/>');
- }
- return xml.join('');
- }
- function writeElements(elements, options, depth, firstLine) {
- return elements.reduce(function (xml, element) {
- var indent = writeIndentation(options, depth, firstLine && !xml);
- switch (element.type) {
- case 'element': return xml + indent + writeElement(element, options, depth);
- case 'comment': return xml + indent + writeComment(element[options.commentKey], options);
- case 'doctype': return xml + indent + writeDoctype(element[options.doctypeKey], options);
- case 'cdata': return xml + (options.indentCdata ? indent : '') + writeCdata(element[options.cdataKey], options);
- case 'text': return xml + (options.indentText ? indent : '') + writeText(element[options.textKey], options);
- case 'instruction':
- var instruction = {};
- instruction[element[options.nameKey]] = element[options.attributesKey] ? element : element[options.instructionKey];
- return xml + (options.indentInstruction ? indent : '') + writeInstruction(instruction, options, depth);
- }
- }, '');
- }
- function hasContentCompact(element, options, anyContent) {
- var key;
- for (key in element) {
- if (element.hasOwnProperty(key)) {
- switch (key) {
- case options.parentKey:
- case options.attributesKey:
- break; // skip to next key
- case options.textKey:
- if (options.indentText || anyContent) {
- return true;
- }
- break; // skip to next key
- case options.cdataKey:
- if (options.indentCdata || anyContent) {
- return true;
- }
- break; // skip to next key
- case options.instructionKey:
- if (options.indentInstruction || anyContent) {
- return true;
- }
- break; // skip to next key
- case options.doctypeKey:
- case options.commentKey:
- return true;
- default:
- return true;
- }
- }
- }
- return false;
- }
- function writeElementCompact(element, name, options, depth, indent) {
- currentElement = element;
- currentElementName = name;
- var elementName = 'elementNameFn' in options ? options.elementNameFn(name, element) : name;
- if (typeof element === 'undefined' || element === null || element === '') {
- return 'fullTagEmptyElementFn' in options && options.fullTagEmptyElementFn(name, element) || options.fullTagEmptyElement ? '<' + elementName + '></' + elementName + '>' : '<' + elementName + '/>';
- }
- var xml = [];
- if (name) {
- xml.push('<' + elementName);
- if (typeof element !== 'object') {
- xml.push('>' + writeText(element,options) + '</' + elementName + '>');
- return xml.join('');
- }
- if (element[options.attributesKey]) {
- xml.push(writeAttributes(element[options.attributesKey], options, depth));
- }
- var withClosingTag = hasContentCompact(element, options, true) || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';
- if (!withClosingTag) {
- if ('fullTagEmptyElementFn' in options) {
- withClosingTag = options.fullTagEmptyElementFn(name, element);
- } else {
- withClosingTag = options.fullTagEmptyElement;
- }
- }
- if (withClosingTag) {
- xml.push('>');
- } else {
- xml.push('/>');
- return xml.join('');
- }
- }
- xml.push(writeElementsCompact(element, options, depth + 1, false));
- currentElement = element;
- currentElementName = name;
- if (name) {
- xml.push((indent ? writeIndentation(options, depth, false) : '') + '</' + elementName + '>');
- }
- return xml.join('');
- }
- function writeElementsCompact(element, options, depth, firstLine) {
- var i, key, nodes, xml = [];
- for (key in element) {
- if (element.hasOwnProperty(key)) {
- nodes = isArray(element[key]) ? element[key] : [element[key]];
- for (i = 0; i < nodes.length; ++i) {
- switch (key) {
- case options.declarationKey: xml.push(writeDeclaration(nodes[i], options, depth)); break;
- case options.instructionKey: xml.push((options.indentInstruction ? writeIndentation(options, depth, firstLine) : '') + writeInstruction(nodes[i], options, depth)); break;
- case options.attributesKey: case options.parentKey: break; // skip
- case options.textKey: xml.push((options.indentText ? writeIndentation(options, depth, firstLine) : '') + writeText(nodes[i], options)); break;
- case options.cdataKey: xml.push((options.indentCdata ? writeIndentation(options, depth, firstLine) : '') + writeCdata(nodes[i], options)); break;
- case options.doctypeKey: xml.push(writeIndentation(options, depth, firstLine) + writeDoctype(nodes[i], options)); break;
- case options.commentKey: xml.push(writeIndentation(options, depth, firstLine) + writeComment(nodes[i], options)); break;
- default: xml.push(writeIndentation(options, depth, firstLine) + writeElementCompact(nodes[i], key, options, depth, hasContentCompact(nodes[i], options)));
- }
- firstLine = firstLine && !xml.length;
- }
- }
- }
- return xml.join('');
- }
- module.exports = function (js, options) {
- options = validateOptions(options);
- var xml = [];
- currentElement = js;
- currentElementName = '_root_';
- if (options.compact) {
- xml.push(writeElementsCompact(js, options, 0, true));
- } else {
- if (js[options.declarationKey]) {
- xml.push(writeDeclaration(js[options.declarationKey], options, 0));
- }
- if (js[options.elementsKey] && js[options.elementsKey].length) {
- xml.push(writeElements(js[options.elementsKey], options, 0, !xml.length));
- }
- }
- return xml.join('');
- };
- /***/ }),
- /* 50 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__50__;
- /***/ }),
- /* 51 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__51__;
- /***/ }),
- /* 52 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as references for various `Number` constants. */
- var INFINITY = 1 / 0;
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
- /** Used to generate unique IDs. */
- var idCounter = 0;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /** Built-in value references. */
- var Symbol = root.Symbol;
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
- /**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
- function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isSymbol(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
- }
- /**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- return value == null ? '' : baseToString(value);
- }
- /**
- * Generates a unique ID. If `prefix` is given, the ID is appended to it.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Util
- * @param {string} [prefix=''] The value to prefix the ID with.
- * @returns {string} Returns the unique ID.
- * @example
- *
- * _.uniqueId('contact_');
- * // => 'contact_104'
- *
- * _.uniqueId();
- * // => '105'
- */
- function uniqueId(prefix) {
- var id = ++idCounter;
- return toString(prefix) + id;
- }
- module.exports = uniqueId;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 53 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global, module) {/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
- /** Used as the size to enable large array optimizations. */
- var LARGE_ARRAY_SIZE = 200;
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED = '__lodash_hash_undefined__';
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER = 9007199254740991;
- /** `Object#toString` result references. */
- var argsTag = '[object Arguments]',
- arrayTag = '[object Array]',
- boolTag = '[object Boolean]',
- dateTag = '[object Date]',
- errorTag = '[object Error]',
- funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]',
- mapTag = '[object Map]',
- numberTag = '[object Number]',
- objectTag = '[object Object]',
- promiseTag = '[object Promise]',
- regexpTag = '[object RegExp]',
- setTag = '[object Set]',
- stringTag = '[object String]',
- symbolTag = '[object Symbol]',
- weakMapTag = '[object WeakMap]';
- var arrayBufferTag = '[object ArrayBuffer]',
- dataViewTag = '[object DataView]',
- float32Tag = '[object Float32Array]',
- float64Tag = '[object Float64Array]',
- int8Tag = '[object Int8Array]',
- int16Tag = '[object Int16Array]',
- int32Tag = '[object Int32Array]',
- uint8Tag = '[object Uint8Array]',
- uint8ClampedTag = '[object Uint8ClampedArray]',
- uint16Tag = '[object Uint16Array]',
- uint32Tag = '[object Uint32Array]';
- /**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
- var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
- /** Used to match `RegExp` flags from their coerced string values. */
- var reFlags = /\w*$/;
- /** Used to detect host constructors (Safari). */
- var reIsHostCtor = /^\[object .+?Constructor\]$/;
- /** Used to detect unsigned integer values. */
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- /** Used to identify `toStringTag` values supported by `_.clone`. */
- var cloneableTags = {};
- cloneableTags[argsTag] = cloneableTags[arrayTag] =
- cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
- cloneableTags[boolTag] = cloneableTags[dateTag] =
- cloneableTags[float32Tag] = cloneableTags[float64Tag] =
- cloneableTags[int8Tag] = cloneableTags[int16Tag] =
- cloneableTags[int32Tag] = cloneableTags[mapTag] =
- cloneableTags[numberTag] = cloneableTags[objectTag] =
- cloneableTags[regexpTag] = cloneableTags[setTag] =
- cloneableTags[stringTag] = cloneableTags[symbolTag] =
- cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
- cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
- cloneableTags[errorTag] = cloneableTags[funcTag] =
- cloneableTags[weakMapTag] = false;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || Function('return this')();
- /** Detect free variable `exports`. */
- var freeExports = true && exports && !exports.nodeType && exports;
- /** Detect free variable `module`. */
- var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
- /** Detect the popular CommonJS extension `module.exports`. */
- var moduleExports = freeModule && freeModule.exports === freeExports;
- /**
- * Adds the key-value `pair` to `map`.
- *
- * @private
- * @param {Object} map The map to modify.
- * @param {Array} pair The key-value pair to add.
- * @returns {Object} Returns `map`.
- */
- function addMapEntry(map, pair) {
- // Don't return `map.set` because it's not chainable in IE 11.
- map.set(pair[0], pair[1]);
- return map;
- }
- /**
- * Adds `value` to `set`.
- *
- * @private
- * @param {Object} set The set to modify.
- * @param {*} value The value to add.
- * @returns {Object} Returns `set`.
- */
- function addSetEntry(set, value) {
- // Don't return `set.add` because it's not chainable in IE 11.
- set.add(value);
- return set;
- }
- /**
- * A specialized version of `_.forEach` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
- */
- function arrayEach(array, iteratee) {
- var index = -1,
- length = array ? array.length : 0;
- while (++index < length) {
- if (iteratee(array[index], index, array) === false) {
- break;
- }
- }
- return array;
- }
- /**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
- function arrayPush(array, values) {
- var index = -1,
- length = values.length,
- offset = array.length;
- while (++index < length) {
- array[offset + index] = values[index];
- }
- return array;
- }
- /**
- * A specialized version of `_.reduce` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {boolean} [initAccum] Specify using the first element of `array` as
- * the initial value.
- * @returns {*} Returns the accumulated value.
- */
- function arrayReduce(array, iteratee, accumulator, initAccum) {
- var index = -1,
- length = array ? array.length : 0;
- if (initAccum && length) {
- accumulator = array[++index];
- }
- while (++index < length) {
- accumulator = iteratee(accumulator, array[index], index, array);
- }
- return accumulator;
- }
- /**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
- function baseTimes(n, iteratee) {
- var index = -1,
- result = Array(n);
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
- /**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
- function getValue(object, key) {
- return object == null ? undefined : object[key];
- }
- /**
- * Checks if `value` is a host object in IE < 9.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
- */
- function isHostObject(value) {
- // Many host objects are `Object` objects that can coerce to strings
- // despite having improperly defined `toString` methods.
- var result = false;
- if (value != null && typeof value.toString != 'function') {
- try {
- result = !!(value + '');
- } catch (e) {}
- }
- return result;
- }
- /**
- * Converts `map` to its key-value pairs.
- *
- * @private
- * @param {Object} map The map to convert.
- * @returns {Array} Returns the key-value pairs.
- */
- function mapToArray(map) {
- var index = -1,
- result = Array(map.size);
- map.forEach(function(value, key) {
- result[++index] = [key, value];
- });
- return result;
- }
- /**
- * Creates a unary function that invokes `func` with its argument transformed.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
- */
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- /**
- * Converts `set` to an array of its values.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the values.
- */
- function setToArray(set) {
- var index = -1,
- result = Array(set.size);
- set.forEach(function(value) {
- result[++index] = value;
- });
- return result;
- }
- /** Used for built-in method references. */
- var arrayProto = Array.prototype,
- funcProto = Function.prototype,
- objectProto = Object.prototype;
- /** Used to detect overreaching core-js shims. */
- var coreJsData = root['__core-js_shared__'];
- /** Used to detect methods masquerading as native. */
- var maskSrcKey = (function() {
- var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
- return uid ? ('Symbol(src)_1.' + uid) : '';
- }());
- /** Used to resolve the decompiled source of functions. */
- var funcToString = funcProto.toString;
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto.toString;
- /** Used to detect if a method is native. */
- var reIsNative = RegExp('^' +
- funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
- );
- /** Built-in value references. */
- var Buffer = moduleExports ? root.Buffer : undefined,
- Symbol = root.Symbol,
- Uint8Array = root.Uint8Array,
- getPrototype = overArg(Object.getPrototypeOf, Object),
- objectCreate = Object.create,
- propertyIsEnumerable = objectProto.propertyIsEnumerable,
- splice = arrayProto.splice;
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeGetSymbols = Object.getOwnPropertySymbols,
- nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
- nativeKeys = overArg(Object.keys, Object);
- /* Built-in method references that are verified to be native. */
- var DataView = getNative(root, 'DataView'),
- Map = getNative(root, 'Map'),
- Promise = getNative(root, 'Promise'),
- Set = getNative(root, 'Set'),
- WeakMap = getNative(root, 'WeakMap'),
- nativeCreate = getNative(Object, 'create');
- /** Used to detect maps, sets, and weakmaps. */
- var dataViewCtorString = toSource(DataView),
- mapCtorString = toSource(Map),
- promiseCtorString = toSource(Promise),
- setCtorString = toSource(Set),
- weakMapCtorString = toSource(WeakMap);
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined,
- symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
- /**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Hash(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
- function hashClear() {
- this.__data__ = nativeCreate ? nativeCreate(null) : {};
- }
- /**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function hashDelete(key) {
- return this.has(key) && delete this.__data__[key];
- }
- /**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function hashGet(key) {
- var data = this.__data__;
- if (nativeCreate) {
- var result = data[key];
- return result === HASH_UNDEFINED ? undefined : result;
- }
- return hasOwnProperty.call(data, key) ? data[key] : undefined;
- }
- /**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function hashHas(key) {
- var data = this.__data__;
- return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
- }
- /**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
- function hashSet(key, value) {
- var data = this.__data__;
- data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
- return this;
- }
- // Add methods to `Hash`.
- Hash.prototype.clear = hashClear;
- Hash.prototype['delete'] = hashDelete;
- Hash.prototype.get = hashGet;
- Hash.prototype.has = hashHas;
- Hash.prototype.set = hashSet;
- /**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function ListCache(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
- function listCacheClear() {
- this.__data__ = [];
- }
- /**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function listCacheDelete(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- return false;
- }
- var lastIndex = data.length - 1;
- if (index == lastIndex) {
- data.pop();
- } else {
- splice.call(data, index, 1);
- }
- return true;
- }
- /**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function listCacheGet(key) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- return index < 0 ? undefined : data[index][1];
- }
- /**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function listCacheHas(key) {
- return assocIndexOf(this.__data__, key) > -1;
- }
- /**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
- function listCacheSet(key, value) {
- var data = this.__data__,
- index = assocIndexOf(data, key);
- if (index < 0) {
- data.push([key, value]);
- } else {
- data[index][1] = value;
- }
- return this;
- }
- // Add methods to `ListCache`.
- ListCache.prototype.clear = listCacheClear;
- ListCache.prototype['delete'] = listCacheDelete;
- ListCache.prototype.get = listCacheGet;
- ListCache.prototype.has = listCacheHas;
- ListCache.prototype.set = listCacheSet;
- /**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function MapCache(entries) {
- var index = -1,
- length = entries ? entries.length : 0;
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
- /**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
- function mapCacheClear() {
- this.__data__ = {
- 'hash': new Hash,
- 'map': new (Map || ListCache),
- 'string': new Hash
- };
- }
- /**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function mapCacheDelete(key) {
- return getMapData(this, key)['delete'](key);
- }
- /**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function mapCacheGet(key) {
- return getMapData(this, key).get(key);
- }
- /**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function mapCacheHas(key) {
- return getMapData(this, key).has(key);
- }
- /**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
- function mapCacheSet(key, value) {
- getMapData(this, key).set(key, value);
- return this;
- }
- // Add methods to `MapCache`.
- MapCache.prototype.clear = mapCacheClear;
- MapCache.prototype['delete'] = mapCacheDelete;
- MapCache.prototype.get = mapCacheGet;
- MapCache.prototype.has = mapCacheHas;
- MapCache.prototype.set = mapCacheSet;
- /**
- * Creates a stack cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Stack(entries) {
- this.__data__ = new ListCache(entries);
- }
- /**
- * Removes all key-value entries from the stack.
- *
- * @private
- * @name clear
- * @memberOf Stack
- */
- function stackClear() {
- this.__data__ = new ListCache;
- }
- /**
- * Removes `key` and its value from the stack.
- *
- * @private
- * @name delete
- * @memberOf Stack
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function stackDelete(key) {
- return this.__data__['delete'](key);
- }
- /**
- * Gets the stack value for `key`.
- *
- * @private
- * @name get
- * @memberOf Stack
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function stackGet(key) {
- return this.__data__.get(key);
- }
- /**
- * Checks if a stack value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Stack
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function stackHas(key) {
- return this.__data__.has(key);
- }
- /**
- * Sets the stack `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Stack
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the stack cache instance.
- */
- function stackSet(key, value) {
- var cache = this.__data__;
- if (cache instanceof ListCache) {
- var pairs = cache.__data__;
- if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
- pairs.push([key, value]);
- return this;
- }
- cache = this.__data__ = new MapCache(pairs);
- }
- cache.set(key, value);
- return this;
- }
- // Add methods to `Stack`.
- Stack.prototype.clear = stackClear;
- Stack.prototype['delete'] = stackDelete;
- Stack.prototype.get = stackGet;
- Stack.prototype.has = stackHas;
- Stack.prototype.set = stackSet;
- /**
- * Creates an array of the enumerable property names of the array-like `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @param {boolean} inherited Specify returning inherited property names.
- * @returns {Array} Returns the array of property names.
- */
- function arrayLikeKeys(value, inherited) {
- // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
- // Safari 9 makes `arguments.length` enumerable in strict mode.
- var result = (isArray(value) || isArguments(value))
- ? baseTimes(value.length, String)
- : [];
- var length = result.length,
- skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) &&
- !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- /**
- * Assigns `value` to `key` of `object` if the existing value is not equivalent
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
- function assignValue(object, key, value) {
- var objValue = object[key];
- if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
- (value === undefined && !(key in object))) {
- object[key] = value;
- }
- }
- /**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function assocIndexOf(array, key) {
- var length = array.length;
- while (length--) {
- if (eq(array[length][0], key)) {
- return length;
- }
- }
- return -1;
- }
- /**
- * The base implementation of `_.assign` without support for multiple sources
- * or `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
- function baseAssign(object, source) {
- return object && copyObject(source, keys(source), object);
- }
- /**
- * The base implementation of `_.clone` and `_.cloneDeep` which tracks
- * traversed objects.
- *
- * @private
- * @param {*} value The value to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @param {boolean} [isFull] Specify a clone including symbols.
- * @param {Function} [customizer] The function to customize cloning.
- * @param {string} [key] The key of `value`.
- * @param {Object} [object] The parent object of `value`.
- * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
- * @returns {*} Returns the cloned value.
- */
- function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
- var result;
- if (customizer) {
- result = object ? customizer(value, key, object, stack) : customizer(value);
- }
- if (result !== undefined) {
- return result;
- }
- if (!isObject(value)) {
- return value;
- }
- var isArr = isArray(value);
- if (isArr) {
- result = initCloneArray(value);
- if (!isDeep) {
- return copyArray(value, result);
- }
- } else {
- var tag = getTag(value),
- isFunc = tag == funcTag || tag == genTag;
- if (isBuffer(value)) {
- return cloneBuffer(value, isDeep);
- }
- if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
- if (isHostObject(value)) {
- return object ? value : {};
- }
- result = initCloneObject(isFunc ? {} : value);
- if (!isDeep) {
- return copySymbols(value, baseAssign(result, value));
- }
- } else {
- if (!cloneableTags[tag]) {
- return object ? value : {};
- }
- result = initCloneByTag(value, tag, baseClone, isDeep);
- }
- }
- // Check for circular references and return its corresponding clone.
- stack || (stack = new Stack);
- var stacked = stack.get(value);
- if (stacked) {
- return stacked;
- }
- stack.set(value, result);
- if (!isArr) {
- var props = isFull ? getAllKeys(value) : keys(value);
- }
- arrayEach(props || value, function(subValue, key) {
- if (props) {
- key = subValue;
- subValue = value[key];
- }
- // Recursively populate clone (susceptible to call stack limits).
- assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
- });
- return result;
- }
- /**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
- function baseCreate(proto) {
- return isObject(proto) ? objectCreate(proto) : {};
- }
- /**
- * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
- * `keysFunc` and `symbolsFunc` to get the enumerable property names and
- * symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @param {Function} symbolsFunc The function to get the symbols of `object`.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function baseGetAllKeys(object, keysFunc, symbolsFunc) {
- var result = keysFunc(object);
- return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
- }
- /**
- * The base implementation of `getTag`.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- function baseGetTag(value) {
- return objectToString.call(value);
- }
- /**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- * else `false`.
- */
- function baseIsNative(value) {
- if (!isObject(value) || isMasked(value)) {
- return false;
- }
- var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
- return pattern.test(toSource(value));
- }
- /**
- * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != 'constructor') {
- result.push(key);
- }
- }
- return result;
- }
- /**
- * Creates a clone of `buffer`.
- *
- * @private
- * @param {Buffer} buffer The buffer to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Buffer} Returns the cloned buffer.
- */
- function cloneBuffer(buffer, isDeep) {
- if (isDeep) {
- return buffer.slice();
- }
- var result = new buffer.constructor(buffer.length);
- buffer.copy(result);
- return result;
- }
- /**
- * Creates a clone of `arrayBuffer`.
- *
- * @private
- * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
- * @returns {ArrayBuffer} Returns the cloned array buffer.
- */
- function cloneArrayBuffer(arrayBuffer) {
- var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
- new Uint8Array(result).set(new Uint8Array(arrayBuffer));
- return result;
- }
- /**
- * Creates a clone of `dataView`.
- *
- * @private
- * @param {Object} dataView The data view to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned data view.
- */
- function cloneDataView(dataView, isDeep) {
- var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
- return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
- }
- /**
- * Creates a clone of `map`.
- *
- * @private
- * @param {Object} map The map to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned map.
- */
- function cloneMap(map, isDeep, cloneFunc) {
- var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
- return arrayReduce(array, addMapEntry, new map.constructor);
- }
- /**
- * Creates a clone of `regexp`.
- *
- * @private
- * @param {Object} regexp The regexp to clone.
- * @returns {Object} Returns the cloned regexp.
- */
- function cloneRegExp(regexp) {
- var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
- result.lastIndex = regexp.lastIndex;
- return result;
- }
- /**
- * Creates a clone of `set`.
- *
- * @private
- * @param {Object} set The set to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned set.
- */
- function cloneSet(set, isDeep, cloneFunc) {
- var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
- return arrayReduce(array, addSetEntry, new set.constructor);
- }
- /**
- * Creates a clone of the `symbol` object.
- *
- * @private
- * @param {Object} symbol The symbol object to clone.
- * @returns {Object} Returns the cloned symbol object.
- */
- function cloneSymbol(symbol) {
- return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
- }
- /**
- * Creates a clone of `typedArray`.
- *
- * @private
- * @param {Object} typedArray The typed array to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned typed array.
- */
- function cloneTypedArray(typedArray, isDeep) {
- var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
- return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
- }
- /**
- * Copies the values of `source` to `array`.
- *
- * @private
- * @param {Array} source The array to copy values from.
- * @param {Array} [array=[]] The array to copy values to.
- * @returns {Array} Returns `array`.
- */
- function copyArray(source, array) {
- var index = -1,
- length = source.length;
- array || (array = Array(length));
- while (++index < length) {
- array[index] = source[index];
- }
- return array;
- }
- /**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property identifiers to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @param {Function} [customizer] The function to customize copied values.
- * @returns {Object} Returns `object`.
- */
- function copyObject(source, props, object, customizer) {
- object || (object = {});
- var index = -1,
- length = props.length;
- while (++index < length) {
- var key = props[index];
- var newValue = customizer
- ? customizer(object[key], source[key], key, object, source)
- : undefined;
- assignValue(object, key, newValue === undefined ? source[key] : newValue);
- }
- return object;
- }
- /**
- * Copies own symbol properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy symbols from.
- * @param {Object} [object={}] The object to copy symbols to.
- * @returns {Object} Returns `object`.
- */
- function copySymbols(source, object) {
- return copyObject(source, getSymbols(source), object);
- }
- /**
- * Creates an array of own enumerable property names and symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function getAllKeys(object) {
- return baseGetAllKeys(object, keys, getSymbols);
- }
- /**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
- function getMapData(map, key) {
- var data = map.__data__;
- return isKeyable(key)
- ? data[typeof key == 'string' ? 'string' : 'hash']
- : data.map;
- }
- /**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
- function getNative(object, key) {
- var value = getValue(object, key);
- return baseIsNative(value) ? value : undefined;
- }
- /**
- * Creates an array of the own enumerable symbol properties of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
- */
- var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
- /**
- * Gets the `toStringTag` of `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- var getTag = baseGetTag;
- // Fallback for data views, maps, sets, and weak maps in IE 11,
- // for data views in Edge < 14, and promises in Node.js.
- if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
- (Map && getTag(new Map) != mapTag) ||
- (Promise && getTag(Promise.resolve()) != promiseTag) ||
- (Set && getTag(new Set) != setTag) ||
- (WeakMap && getTag(new WeakMap) != weakMapTag)) {
- getTag = function(value) {
- var result = objectToString.call(value),
- Ctor = result == objectTag ? value.constructor : undefined,
- ctorString = Ctor ? toSource(Ctor) : undefined;
- if (ctorString) {
- switch (ctorString) {
- case dataViewCtorString: return dataViewTag;
- case mapCtorString: return mapTag;
- case promiseCtorString: return promiseTag;
- case setCtorString: return setTag;
- case weakMapCtorString: return weakMapTag;
- }
- }
- return result;
- };
- }
- /**
- * Initializes an array clone.
- *
- * @private
- * @param {Array} array The array to clone.
- * @returns {Array} Returns the initialized clone.
- */
- function initCloneArray(array) {
- var length = array.length,
- result = array.constructor(length);
- // Add properties assigned by `RegExp#exec`.
- if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
- result.index = array.index;
- result.input = array.input;
- }
- return result;
- }
- /**
- * Initializes an object clone.
- *
- * @private
- * @param {Object} object The object to clone.
- * @returns {Object} Returns the initialized clone.
- */
- function initCloneObject(object) {
- return (typeof object.constructor == 'function' && !isPrototype(object))
- ? baseCreate(getPrototype(object))
- : {};
- }
- /**
- * Initializes an object clone based on its `toStringTag`.
- *
- * **Note:** This function only supports cloning values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to clone.
- * @param {string} tag The `toStringTag` of the object to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the initialized clone.
- */
- function initCloneByTag(object, tag, cloneFunc, isDeep) {
- var Ctor = object.constructor;
- switch (tag) {
- case arrayBufferTag:
- return cloneArrayBuffer(object);
- case boolTag:
- case dateTag:
- return new Ctor(+object);
- case dataViewTag:
- return cloneDataView(object, isDeep);
- case float32Tag: case float64Tag:
- case int8Tag: case int16Tag: case int32Tag:
- case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
- return cloneTypedArray(object, isDeep);
- case mapTag:
- return cloneMap(object, isDeep, cloneFunc);
- case numberTag:
- case stringTag:
- return new Ctor(object);
- case regexpTag:
- return cloneRegExp(object);
- case setTag:
- return cloneSet(object, isDeep, cloneFunc);
- case symbolTag:
- return cloneSymbol(object);
- }
- }
- /**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length &&
- (typeof value == 'number' || reIsUint.test(value)) &&
- (value > -1 && value % 1 == 0 && value < length);
- }
- /**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
- function isKeyable(value) {
- var type = typeof value;
- return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
- ? (value !== '__proto__')
- : (value === null);
- }
- /**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
- function isMasked(func) {
- return !!maskSrcKey && (maskSrcKey in func);
- }
- /**
- * Checks if `value` is likely a prototype object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
- */
- function isPrototype(value) {
- var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
- return value === proto;
- }
- /**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to process.
- * @returns {string} Returns the source code.
- */
- function toSource(func) {
- if (func != null) {
- try {
- return funcToString.call(func);
- } catch (e) {}
- try {
- return (func + '');
- } catch (e) {}
- }
- return '';
- }
- /**
- * This method is like `_.clone` except that it recursively clones `value`.
- *
- * @static
- * @memberOf _
- * @since 1.0.0
- * @category Lang
- * @param {*} value The value to recursively clone.
- * @returns {*} Returns the deep cloned value.
- * @see _.clone
- * @example
- *
- * var objects = [{ 'a': 1 }, { 'b': 2 }];
- *
- * var deep = _.cloneDeep(objects);
- * console.log(deep[0] === objects[0]);
- * // => false
- */
- function cloneDeep(value) {
- return baseClone(value, true, true);
- }
- /**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
- function eq(value, other) {
- return value === other || (value !== value && other !== other);
- }
- /**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- * else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- function isArguments(value) {
- // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
- return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
- (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
- }
- /**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
- var isArray = Array.isArray;
- /**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- /**
- * This method is like `_.isArrayLike` except that it also checks if `value`
- * is an object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array-like object,
- * else `false`.
- * @example
- *
- * _.isArrayLikeObject([1, 2, 3]);
- * // => true
- *
- * _.isArrayLikeObject(document.body.children);
- * // => true
- *
- * _.isArrayLikeObject('abc');
- * // => false
- *
- * _.isArrayLikeObject(_.noop);
- * // => false
- */
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- /**
- * Checks if `value` is a buffer.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
- * @example
- *
- * _.isBuffer(new Buffer(2));
- * // => true
- *
- * _.isBuffer(new Uint8Array(2));
- * // => false
- */
- var isBuffer = nativeIsBuffer || stubFalse;
- /**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
- function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 8-9 which returns 'object' for typed array and other constructors.
- var tag = isObject(value) ? objectToString.call(value) : '';
- return tag == funcTag || tag == genTag;
- }
- /**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
- function isLength(value) {
- return typeof value == 'number' &&
- value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
- }
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
- /**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- /**
- * This method returns a new empty array.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {Array} Returns the new empty array.
- * @example
- *
- * var arrays = _.times(2, _.stubArray);
- *
- * console.log(arrays);
- * // => [[], []]
- *
- * console.log(arrays[0] === arrays[1]);
- * // => false
- */
- function stubArray() {
- return [];
- }
- /**
- * This method returns `false`.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {boolean} Returns `false`.
- * @example
- *
- * _.times(2, _.stubFalse);
- * // => [false, false]
- */
- function stubFalse() {
- return false;
- }
- module.exports = cloneDeep;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10), __webpack_require__(38)(module)))
- /***/ }),
- /* 54 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports,"__esModule",{value:true});exports.MAP_EVENT_NAMES=void 0;var MAP_EVENT_NAMES=['onResize','onWebglcontextlost','onWebglcontextrestored','onRemove','onMovestart','onContextmenu','onDblclick','onClick','onTouchcancel','onTouchmove','onTouchend','onTouchstart','onDataloading','onMousemove','onMouseup','onMousedown','onSourcedataloading','onError','onData','onStyledata','onSourcedata','onMouseout','onStyledataloading','onMoveend','onMove','onRender','onZoom','onZoomstart','onZoomend','onBoxzoomstart','onBoxzoomcancel','onBoxzoomend','onRotate','onRotatestart','onRotateend','onDragend','onDrag','onDragstart','onPitch','onIdle'];exports.MAP_EVENT_NAMES=MAP_EVENT_NAMES;;
- /***/ }),
- /* 55 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault = __webpack_require__(42);
- exports.__esModule = true;
- exports.default = void 0;
- var _getDisplayName = _interopRequireDefault(__webpack_require__(105));
- var wrapDisplayName = function wrapDisplayName(BaseComponent, hocName) {
- return hocName + "(" + (0, _getDisplayName.default)(BaseComponent) + ")";
- };
- var _default = wrapDisplayName;
- exports.default = _default;
- /***/ }),
- /* 56 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var reactIs = __webpack_require__(106);
- /**
- * Copyright 2015, Yahoo! Inc.
- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
- */
- var REACT_STATICS = {
- childContextTypes: true,
- contextType: true,
- contextTypes: true,
- defaultProps: true,
- displayName: true,
- getDefaultProps: true,
- getDerivedStateFromError: true,
- getDerivedStateFromProps: true,
- mixins: true,
- propTypes: true,
- type: true
- };
- var KNOWN_STATICS = {
- name: true,
- length: true,
- prototype: true,
- caller: true,
- callee: true,
- arguments: true,
- arity: true
- };
- var FORWARD_REF_STATICS = {
- '$$typeof': true,
- render: true,
- defaultProps: true,
- displayName: true,
- propTypes: true
- };
- var MEMO_STATICS = {
- '$$typeof': true,
- compare: true,
- defaultProps: true,
- displayName: true,
- propTypes: true,
- type: true
- };
- var TYPE_STATICS = {};
- TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;
- TYPE_STATICS[reactIs.Memo] = MEMO_STATICS;
- function getStatics(component) {
- // React v16.11 and below
- if (reactIs.isMemo(component)) {
- return MEMO_STATICS;
- } // React v16.12 and above
- return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;
- }
- var defineProperty = Object.defineProperty;
- var getOwnPropertyNames = Object.getOwnPropertyNames;
- var getOwnPropertySymbols = Object.getOwnPropertySymbols;
- var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
- var getPrototypeOf = Object.getPrototypeOf;
- var objectPrototype = Object.prototype;
- function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
- if (typeof sourceComponent !== 'string') {
- // don't hoist over string (html) components
- if (objectPrototype) {
- var inheritedComponent = getPrototypeOf(sourceComponent);
- if (inheritedComponent && inheritedComponent !== objectPrototype) {
- hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
- }
- }
- var keys = getOwnPropertyNames(sourceComponent);
- if (getOwnPropertySymbols) {
- keys = keys.concat(getOwnPropertySymbols(sourceComponent));
- }
- var targetStatics = getStatics(targetComponent);
- var sourceStatics = getStatics(sourceComponent);
- for (var i = 0; i < keys.length; ++i) {
- var key = keys[i];
- if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
- var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
- try {
- // Avoid failures from read-only properties
- defineProperty(targetComponent, key, descriptor);
- } catch (e) {}
- }
- }
- }
- return targetComponent;
- }
- module.exports = hoistNonReactStatics;
- /***/ }),
- /* 57 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));/**
- * @class CircleStyle
- * @category BaseTypes Style
- * @classdesc 点图层样式类。
- * @param {mapboxgl.LayersCircle} paint - MapboxGL 点图层 Paint 配置。
- * @param {mapboxgl.LayersCircle} layout - MapboxGL 点图层 Layout 配置。
- */var CircleStyle=function CircleStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,CircleStyle);this.layout={visibility:'visible'};this.paint={'circle-radius':6,'circle-color':'#3fb1e3','circle-opacity':1,'circle-blur':0,'circle-translate':[0,0],'circle-translate-anchor':'map','circle-pitch-scale':'map','circle-pitch-alignment':'viewport','circle-stroke-width':0,'circle-stroke-color':'#000','circle-stroke-opacity':1};Object.assign(this.paint,paint);Object.assign(this.layout,layout);};exports.default=CircleStyle;
- /***/ }),
- /* 58 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var HeatMapStyle=function HeatMapStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,HeatMapStyle);this.paint={'heatmap-radius':30,'heatmap-weight':1,'heatmap-intensity':1,'heatmap-color':['interpolate',['linear'],['heatmap-density'],0,'rgba(0, 0, 255, 0)',0.1,'royalblue',0.3,'cyan',0.5,'lime',0.7,'yellow',1,'red'],'heatmap-opacity':1};this.layout={visibility:'visible'};Object.assign(this.paint,paint);Object.assign(this.layout,layout);};exports.default=HeatMapStyle;
- /***/ }),
- /* 59 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CircleStyle",{enumerable:true,get:function get(){return _CircleStyle.default;}});Object.defineProperty(exports,"FillStyle",{enumerable:true,get:function get(){return _FillStyle.default;}});Object.defineProperty(exports,"LineStyle",{enumerable:true,get:function get(){return _LineStyle.default;}});Object.defineProperty(exports,"HeatMapStyle",{enumerable:true,get:function get(){return _HeatMapStyle.default;}});Object.defineProperty(exports,"SymbolStyle",{enumerable:true,get:function get(){return _SymbolStyle.default;}});var _CircleStyle=_interopRequireDefault(__webpack_require__(57));var _FillStyle=_interopRequireDefault(__webpack_require__(137));var _LineStyle=_interopRequireDefault(__webpack_require__(138));var _HeatMapStyle=_interopRequireDefault(__webpack_require__(58));var _SymbolStyle=_interopRequireDefault(__webpack_require__(139));
- /***/ }),
- /* 60 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(61);
- /***/ }),
- /* 61 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireWildcard=__webpack_require__(19);var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});var _exportNames={};exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));__webpack_require__(63);__webpack_require__(64);var components=_interopRequireWildcard(__webpack_require__(65));Object.keys(components).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return components[key];}});});var commontypes=_interopRequireWildcard(__webpack_require__(59));var _default=(0,_objectSpread2.default)((0,_objectSpread2.default)({},components),{},{commontypes:commontypes});exports.default=_default;
- /***/ }),
- /* 62 */
- /***/ (function(module, exports) {
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- module.exports = _typeof = function _typeof(obj) {
- return typeof obj;
- };
- } else {
- module.exports = _typeof = function _typeof(obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
- };
- }
- return _typeof(obj);
- }
- module.exports = _typeof;
- /***/ }),
- /* 63 */
- /***/ (function(module, exports, __webpack_require__) {
- // extracted by mini-css-extract-plugin
- /***/ }),
- /* 64 */
- /***/ (function(module, exports, __webpack_require__) {
- // extracted by mini-css-extract-plugin
- /***/ }),
- /* 65 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"SmWebMap",{enumerable:true,get:function get(){return _WebMap.default;}});Object.defineProperty(exports,"SmMap",{enumerable:true,get:function get(){return _Map.default;}});Object.defineProperty(exports,"SmSource",{enumerable:true,get:function get(){return _Source.default;}});Object.defineProperty(exports,"SmLayer",{enumerable:true,get:function get(){return _Layer.default;}});Object.defineProperty(exports,"SmGeojsonLayer",{enumerable:true,get:function get(){return _GeojsonLayer.default;}});Object.defineProperty(exports,"SmRasterTileLayer",{enumerable:true,get:function get(){return _RasterTileLayer.default;}});Object.defineProperty(exports,"SmVectorTileLayer",{enumerable:true,get:function get(){return _VectorTileLayer.default;}});Object.defineProperty(exports,"SmUniqueThemeLayer",{enumerable:true,get:function get(){return _UniqueThemeLayer.default;}});Object.defineProperty(exports,"SmRanksymbolThemeLayer",{enumerable:true,get:function get(){return _RanksymbolThemeLayer.default;}});Object.defineProperty(exports,"SmRangeThemeLayer",{enumerable:true,get:function get(){return _RangeThemeLayer.default;}});Object.defineProperty(exports,"SmGraphThemeLayer",{enumerable:true,get:function get(){return _GraphThemeLayer.default;}});Object.defineProperty(exports,"SmClusterLayer",{enumerable:true,get:function get(){return _ClusterLayer.default;}});Object.defineProperty(exports,"SmDeckglLayer",{enumerable:true,get:function get(){return _DeckglLayer.default;}});Object.defineProperty(exports,"SmLabelThemeLayer",{enumerable:true,get:function get(){return _LabelThemeLayer.default;}});Object.defineProperty(exports,"SmHeatmapLayer",{enumerable:true,get:function get(){return _HeatmapLayer.default;}});Object.defineProperty(exports,"SmMapvLayer",{enumerable:true,get:function get(){return _MapvLayer.default;}});Object.defineProperty(exports,"SmEchartsLayer",{enumerable:true,get:function get(){return _EchartsLayer.default;}});Object.defineProperty(exports,"SmDataFlowLayer",{enumerable:true,get:function get(){return _DataFlowLayer.default;}});Object.defineProperty(exports,"SmFireLayer",{enumerable:true,get:function get(){return _FireLayer.default;}});Object.defineProperty(exports,"SmAnimateMarkerLayer",{enumerable:true,get:function get(){return _AnimateMarkerLayer.default;}});var _WebMap=_interopRequireDefault(__webpack_require__(66));var _Map=_interopRequireDefault(__webpack_require__(102));var _Source=_interopRequireDefault(__webpack_require__(104));var _Layer=_interopRequireDefault(__webpack_require__(108));var _GeojsonLayer=_interopRequireDefault(__webpack_require__(109));var _RasterTileLayer=_interopRequireDefault(__webpack_require__(111));var _VectorTileLayer=_interopRequireDefault(__webpack_require__(113));var _UniqueThemeLayer=_interopRequireDefault(__webpack_require__(114));var _RanksymbolThemeLayer=_interopRequireDefault(__webpack_require__(116));var _RangeThemeLayer=_interopRequireDefault(__webpack_require__(118));var _GraphThemeLayer=_interopRequireDefault(__webpack_require__(120));var _ClusterLayer=_interopRequireDefault(__webpack_require__(122));var _DeckglLayer=_interopRequireDefault(__webpack_require__(124));var _LabelThemeLayer=_interopRequireDefault(__webpack_require__(127));var _HeatmapLayer=_interopRequireDefault(__webpack_require__(129));var _MapvLayer=_interopRequireDefault(__webpack_require__(131));var _EchartsLayer=_interopRequireDefault(__webpack_require__(133));var _DataFlowLayer=_interopRequireDefault(__webpack_require__(135));var _FireLayer=_interopRequireDefault(__webpack_require__(140));var _AnimateMarkerLayer=_interopRequireDefault(__webpack_require__(144));
- /***/ }),
- /* 66 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(18));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _react=_interopRequireDefault(__webpack_require__(5));var _resizeDetector=__webpack_require__(33);var _lodash=_interopRequireDefault(__webpack_require__(34));var _lodash2=_interopRequireDefault(__webpack_require__(26));var _lodash3=_interopRequireDefault(__webpack_require__(35));var _antd=__webpack_require__(36);var _lodash4=_interopRequireDefault(__webpack_require__(37));var _lodash5=_interopRequireDefault(__webpack_require__(13));var _mapEvent=_interopRequireDefault(__webpack_require__(27));var _WebMapViewModel=_interopRequireDefault(__webpack_require__(70));var _util=__webpack_require__(11);var _interface=__webpack_require__(54);var WebMap=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(WebMap,_React$Component);var _super=(0,_createSuper2.default)(WebMap);function WebMap(props){var _this;(0,_classCallCheck2.default)(this,WebMap);_this=_super.call(this,props);_this.map=void 0;_this.viewModel=void 0;_this.selfRef=void 0;_this.initializeWebMap=function(){var _this$props=_this.props,target=_this$props.target,serverUrl=_this$props.serverUrl,accessToken=_this$props.accessToken,accessKey=_this$props.accessKey,tiandituKey=_this$props.tiandituKey,withCredentials=_this$props.withCredentials,excludePortalProxyUrl=_this$props.excludePortalProxyUrl,mapOptions=_this$props.mapOptions,autoresize=_this$props.autoresize;_this.viewModel=new _WebMapViewModel.default(_this.props.mapId,{target:target,serverUrl:serverUrl,accessToken:accessToken,accessKey:accessKey,tiandituKey:tiandituKey,withCredentials:withCredentials,excludePortalProxyUrl:excludePortalProxyUrl},mapOptions);if(autoresize){(0,_resizeDetector.addListener)(_this.selfRef.current,_this.__resizeHandler);}};_this.registerEvents=function(){var _this$props2=_this.props,target=_this$props2.target,onLoad=_this$props2.onLoad;_this.viewModel.on('addlayerssucceeded',function(e){_this.setState({spinning:false});_mapEvent.default.setMap(target,e.map);_this.viewModel&&_mapEvent.default.setWebMap(target,_this.viewModel);_mapEvent.default.emit('load-map',e.map,target);e.map.resize();_this.map=e.map;// 绑定map event
- _this.bindMapEvents();/**
- * @event load
- * @desc webmap 加载完成之后触发。
- * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
- */(0,_util.isFunction)(onLoad)&&onLoad((0,_objectSpread2.default)((0,_objectSpread2.default)({},e),{},{component:(0,_assertThisInitialized2.default)(_this)}));});_this.viewModel.on('getmapinfofailed',function(e){var onGetMapFailed=_this.props.onGetMapFailed;/**
- * @event getMapFailed
- * @desc 获取 WebMap 地图信息失败。
- * @property {Object} error - 失败原因。
- */(0,_util.isFunction)(onGetMapFailed)&&onGetMapFailed({error:e.error});_antd.message.error(e.error.message);_this.setState({spinning:false});});_this.viewModel.on('getlayerdatasourcefailed',function(e){var onGetLayerDatasourceFailed=_this.props.onGetLayerDatasourceFailed;/**
- * @event getLayerDatasourceFailed
- * @desc 获取图层数据失败。
- * @property {Object} error - 失败原因。
- * @property {Object} layer - 图层信息。
- * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
- */(0,_util.isFunction)(onGetLayerDatasourceFailed)&&onGetLayerDatasourceFailed({error:e.error,layer:e.layer,map:e.map});// TODO
- // message.error(this.$t('webmap.getLayerInfoFailed'));
- _antd.message.error('获取图层信息失败!');});};_this.state={spinning:true,viewModelProps:['mapId','serverUrl','mapOptions.center','mapOptions.zoom','mapOptions.style','mapOptions.crs','mapOptions.minZoom','mapOptions.maxZoom','mapOptions.maxBounds','mapOptions.renderWorldCopies','mapOptions.bearing','mapOptions.pitch','withCredentials']};_this.selfRef=_react.default.createRef();_this.__resizeHandler=(0,_lodash.default)(_this.__resizeHandler.bind((0,_assertThisInitialized2.default)(_this)),100,{leading:true});return _this;}(0,_createClass2.default)(WebMap,[{key:"componentDidMount",value:function componentDidMount(){this.initializeWebMap();this.registerEvents();}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;this.viewModel&&this.state.viewModelProps.forEach(function(prop){var name=prop.includes('.')?prop.split('.')[1]:prop;var funcName="set".concat((0,_lodash3.default)(name));var propsValue=(0,_lodash4.default)(_this2.props,prop);var prevPropsValue=(0,_lodash4.default)(prevProps,prop);if(propsValue&&!(0,_lodash5.default)(propsValue,prevPropsValue)){_this2.viewModel[funcName](propsValue);}});}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this$props3=this.props,target=_this$props3.target,autoresize=_this$props3.autoresize;_mapEvent.default.deleteMap(target);_mapEvent.default.deleteWebMap(target);if(autoresize&&this.selfRef.current){(0,_resizeDetector.removeListener)(this.selfRef.current,this.__resizeHandler);}}},{key:"__resizeHandler",value:function __resizeHandler(){this.resize();}},{key:"resize",value:function resize(){if(this.viewModel&&this.viewModel.resize){this.viewModel.resize();}}},{key:"bindMapEvents",value:function bindMapEvents(){var _this3=this;Object.keys(this.props).forEach(function(eventName){if(_interface.MAP_EVENT_NAMES.includes(eventName)){var name=eventName.replace('on','');_this3.bindMapEvent(name.toLowerCase(),_this3.mapEventCallback.bind(_this3));}});}},{key:"bindMapEvent",value:function bindMapEvent(eventName,eventCallback){this.map.on(eventName,eventCallback);}},{key:"mapEventCallback",value:function mapEventCallback(event){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};this.emitMapEvent(event.type,(0,_objectSpread2.default)({mapboxEvent:event},data));}},{key:"emitMapEvent",value:function emitMapEvent(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(this.props[originEventName])){this.props[originEventName]((0,_objectSpread2.default)({map:this.map,component:this},data));}}},{key:"render",value:function render(){var spinning=this.state.spinning;var _this$props4=this.props,target=_this$props4.target,children=_this$props4.children;return/*#__PURE__*/_react.default.createElement("div",{id:target,className:"sm-component-web-map",ref:this.selfRef},children,spinning&&/*#__PURE__*/_react.default.createElement(_antd.Spin,{size:"large",tip:"\u5730\u56FE\u52A0\u8F7D\u4E2D...",spinning:spinning}));}}]);return WebMap;}(_react.default.Component);WebMap.defaultProps={target:'map',autoresize:true};var _default=WebMap;exports.default=_default;
- /***/ }),
- /* 67 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var SourceModel=/*#__PURE__*/function(){function SourceModel(options){(0,_classCallCheck2.default)(this,SourceModel);this.id=options.source;this.sourceLayerList={};this.layers=[];this.type=null;}(0,_createClass2.default)(SourceModel,[{key:"addLayer",value:function addLayer(layer,sourceLayer){if(sourceLayer){if(!this.sourceLayerList[sourceLayer]){this.sourceLayerList[sourceLayer]=[];}this.sourceLayerList[sourceLayer].push(layer);}else{this.sourceLayerList=undefined;}this.layers.push(layer);this.type=layer.type;if([layer.visibility,this.visibility].includes('visible')){this.visibility='visible';}else{this.visibility='none';}}}]);return SourceModel;}();var _default=SourceModel;exports.default=_default;
- /***/ }),
- /* 68 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));/**
- * @class LayerModel
- * @description 图层数据模型。
- * @param {Object} options - 图层参数。
- * @param {String} [options.id] - 图层 ID。
- * @param {Number} [options.maxzoom] - 最大缩放级别。
- * @param {Number} [options.minzoom] - 最小缩放级别。
- * @param {GeoJSONObject} [options.source] - 数据源。
- * @param {String} [options.type] - 图层类型。
- * @param {String} [options.visibility] - 图层是否可见。
- * @category Model
- */var LayerModel=function LayerModel(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};(0,_classCallCheck2.default)(this,LayerModel);this.id=options.id;this.maxzoom=options.maxzoom;this.minzoom=options.minzoom;this.source=options.source;this.type=options.type;this.visibility=options.visibility||'visible';};var _default=LayerModel;exports.default=_default;
- /***/ }),
- /* 69 */
- /***/ (function(module) {
- module.exports = JSON.parse("[{\"title\":\"经典深色\",\"label\":\"dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#dd6b66\",\"#759aa0\",\"#e69d87\",\"#8dc1a9\",\"#ea7e53\"]},{\"title\":\"经典浅色\",\"label\":\"light\",\"textColor\":\"#333\",\"background\":\"rgba(255, 255, 255,0.6)\",\"colorGroup\":[\"#3fb1e3\",\"#6be6c1\",\"#626c91\",\"#a0a7e6\",\"#c4ebad\"]},{\"title\":\"绿色渐变\",\"label\":\"green-g\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#064049\",\"#165A65\",\"#1F717F\",\"#3097AB\",\"#9AEAF4\"]},{\"title\":\"蓝色渐变\",\"label\":\"blue-g\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#243BCC\",\"#1C55FF\",\"#0C75FF\",\"#338FFF\",\"#00CDF1\"]},{\"title\":\"橙红渐变\",\"label\":\"red-g\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#770000\",\"#882241\",\"#BE3144\",\"#F05940\",\"#FF8417\"]},{\"title\":\"紫色渐变\",\"label\":\"purple-g\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#2F2AA4\",\"#5432D3\",\"#8B3B86\",\"#9740B1\",\"#7B6CF5\"]},{\"title\":\"深蓝黑色\",\"label\":\"bluedark-dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#15D1F2\",\"#499BFF\",\"#2C61FF\",\"#243BCC\",\"#67A9FF\"]},{\"title\":\"墨绿黑色\",\"label\":\"green-dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#2D808D\",\"#53A8B6\",\"#7AC2D0\",\"#BCE4E9\",\"#F1FDFF\"]},{\"title\":\"浅蓝黑色\",\"label\":\"blue-dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#00E9FF\",\"#BBE7FF\",\"#6AE5C1\",\"#46ABFF\",\"#363EFF\"]},{\"title\":\"浅灰黑色\",\"label\":\"grey-dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#52606D\",\"#8894A0\",\"#BACBDB\",\"#D3DDE8\",\"#F2F5F8\"]},{\"title\":\"深紫黑色\",\"label\":\"purple-dark\",\"textColor\":\"#fff\",\"background\":\"rgba(0,0,0,0.6)\",\"colorGroup\":[\"#7B6CF6\",\"#5432D3\",\"#241F92\",\"#8B3B86\",\"#E6A5FF\"]},{\"title\":\"深蓝白色\",\"label\":\"blue-light\",\"textColor\":\"#000\",\"background\":\"rgba(255,255,255,0.6)\",\"colorGroup\":[\"#243BCC\",\"#2C61FF\",\"#499BFF\",\"#15D1F2\",\"#67A9FF\"]},{\"title\":\"深红白色\",\"label\":\"red-light\",\"textColor\":\"#000\",\"background\":\"rgba(255,255,255,0.6)\",\"colorGroup\":[\"#F05940\",\"#BE3144\",\"#882241\",\"#770000\",\"#FF8418\"]}]");
- /***/ }),
- /* 70 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireWildcard=__webpack_require__(19);var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var _SourceListModel=_interopRequireDefault(__webpack_require__(39));var _geometryUtil=__webpack_require__(71);var _util=__webpack_require__(11);__webpack_require__(12);__webpack_require__(77);__webpack_require__(78);var convert=_interopRequireWildcard(__webpack_require__(79));var _canvg=_interopRequireDefault(__webpack_require__(97));var _echarts=_interopRequireDefault(__webpack_require__(50));var _EchartsLayer=_interopRequireDefault(__webpack_require__(51));var _ProvinceCenter=_interopRequireDefault(__webpack_require__(100));var _MunicipalCenter=_interopRequireDefault(__webpack_require__(101));var _lodash=_interopRequireDefault(__webpack_require__(52));var _lodash2=_interopRequireDefault(__webpack_require__(53));/* eslint-disable */ /* Copyright© 2000 - 2020 SuperMap Software Co.Ltd. All rights reserved.
- * This program are made available under the terms of the Apache License, Version 2.0
- * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html. */ // eslint-disable-line import/extensions
- // eslint-disable-line import/extensions
- var MB_SCALEDENOMINATOR_3857=['559082264.0287178','279541132.0143589','139770566.0071794','69885283.00358972','34942641.50179486','17471320.75089743','8735660.375448715','4367830.1877224357','2183915.093862179','1091957.546931089','545978.7734655447','272989.7734655447','272989.3867327723','136494.6933663862','68247.34668319309','34123.67334159654','17061.83667079827','8530.918335399136','4265.459167699568','2132.729583849784'];var MB_SCALEDENOMINATOR_4326=['5.590822640287176E8','2.795411320143588E8','1.397705660071794E8','6.98852830035897E7','3.494264150179485E7','1.7471320750897426E7','8735660.375448713','4367830.187724357','2183915.0938621783','1091957.5469310891','545978.7734655446','272989.3867327723','136494.69336638614','68247.34668319307','34123.673341596535','17061.836670798268','8530.918335399134'];var DEFAULT_WELLKNOWNSCALESET=['GoogleCRS84Quad','GoogleMapsCompatible','GlobalCRS84Scale'];// 迁徙图最大支持要素数量
- var MAX_MIGRATION_ANIMATION_COUNT=1000;/**
- * @class WebMapViewModel
- * @category ViewModel
- * @classdesc 对接 iPortal/Online 地图类。目前支持地图坐标系包括:'EPSG:3857','EPSG:4326','EPSG:4490','EPSG:4214','EPSG:4610'。
- * @param {number} id - iPortal|Online 地图 ID。
- * @param {Object} options - 参数。
- * @param {string} [options.target='map'] - 地图容器 ID。
- * @param {string} [options.serverUrl="http://www.supermapol.com"] - SuperMap iPortal/Online 服务器地址。当设置 `id` 时有效。
- * @param {string} [options.accessToken] - 用于访问 SuperMap iPortal 、SuperMap Online 中受保护的服务。当设置 `id` 时有效。
- * @param {string} [options.accessKey] - SuperMap iServer 提供的一种基于 Token(令牌)的用户身份验证机制。当设置 `id` 时有效。
- * @param {String} [options.tiandituKey] - 用于访问天地图的服务。当设置 `id` 时有效。
- * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。当设置 `id` 时有效。
- * @param {boolean} [options.excludePortalProxyUrl] - server 传递过来的 URL 是否带有代理。当设置 `id` 时有效。
- * @fires WebMapViewModel#mapinitialized
- * @fires WebMapViewModel#getmapinfofailed
- * @fires WebMapViewModel#getwmtsinfofailed
- * @fires WebMapViewModel#getlayerdatasourcefailed
- * @fires WebMapViewModel#addlayerssucceeded
- */var WebMapViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(WebMapViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(WebMapViewModel);// on: any;
- // fire: any;
- function WebMapViewModel(id){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var mapOptions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{style:{version:8,sources:{},layers:[]}};(0,_classCallCheck2.default)(this,WebMapViewModel);_this=_super.call(this);_this.map=void 0;_this.mapId=void 0;_this.mapOptions=void 0;_this.serverUrl=void 0;_this.accessToken=void 0;_this.accessKey=void 0;_this.tiandituKey=void 0;_this.withCredentials=void 0;_this.target=void 0;_this.excludePortalProxyUrl=void 0;_this.center=void 0;_this.zoom=void 0;_this.mapParams={};_this.baseProjection=void 0;_this.echartslayer=[];_this._sourceListModel=void 0;_this._legendList=void 0;_this._layers=[];_this._svgDiv=void 0;_this._fieldMaxValue=void 0;_this._taskID=void 0;_this.layerAdded=void 0;_this._handleDataflowFeaturesCallback=void 0;_this._dataflowService=void 0;_this.mapId=id;_this.mapOptions=Object.assign({style:{version:8,sources:{},layers:[]}},mapOptions);_this.serverUrl=options.serverUrl||'http://www.supermapol.com';_this.accessToken=options.accessToken;_this.accessKey=options.accessKey;_this.tiandituKey=options.tiandituKey||'';_this.withCredentials=options.withCredentials||false;_this.target=options.target||'map';_this.excludePortalProxyUrl=options.excludePortalProxyUrl;_this.center=mapOptions.center||[];_this.zoom=mapOptions.zoom;_this.echartslayer=[];_this._createWebMap();return _this;}/**
- * @function WebMapViewModel.prototype.resize
- * @description Map 更新大小。
- */(0,_createClass2.default)(WebMapViewModel,[{key:"resize",value:function resize(){this.map&&this.map.resize();this.echartsLayerResize();}/**
- * @function WebMapViewModel.prototype.EchartsLayerResize
- * @description echartslayer 更新大小。
- */},{key:"echartsLayerResize",value:function echartsLayerResize(){this.echartslayer.forEach(function(echartslayer){echartslayer.chart.resize();});}/**
- * @function WebMapViewModel.prototype.setMapId
- * @description 设置地图 ID。
- * @param {String} mapId - iPortal|Online 地图 ID。
- */},{key:"setMapId",value:function setMapId(mapId){var _this2=this;this.mapId=mapId;setTimeout(function(){_this2._createWebMap();},0);}/**
- * @function WebMapViewModel.prototype.setServerUrl
- * @description 设置地图的地址。
- * @param {string} options.serverUrl - 地图的地址。
- */},{key:"setServerUrl",value:function setServerUrl(serverUrl){this.serverUrl=serverUrl;}},{key:"setWithCredentials",value:function setWithCredentials(withCredentials){this.withCredentials=withCredentials;}/**
- * @function WebMapViewModel.prototype.setCRS
- * @description 设置地图的投影。
- * @param {Number} crs - 地图投影。
- */},{key:"setCrs",value:function setCrs(crs){if(this.map){this.mapOptions.crs=crs;//@ts-ignore
- crs&&this.map.setCRS(_mapboxGlEnhance.default.CRS.get(crs));}}/**
- * @function WebMapViewModel.prototype.setZoom
- * @description 设置地图的缩放级别。
- * @param {Number} zoom - 地图缩放级别。
- */},{key:"setZoom",value:function setZoom(zoom){if(this.map){this.mapOptions.zoom=zoom;(zoom||zoom===0)&&this.map.setZoom(zoom);}}/**
- * @function WebMapViewModel.prototype.setCenter
- * @description 设置地图的中心点。
- * @param {Array} center - 地图中心点。
- */},{key:"setCenter",value:function setCenter(center){if(this.map){this.mapOptions.center=center;center&¢er.length>0&&this.map.setCenter(center);}}/**
- * @function WebMapViewModel.prototype.setMaxBounds
- * @description 设置地图的最大范围。
- * @param {Array} maxBounds - 地图最大范围。
- */},{key:"setMaxBounds",value:function setMaxBounds(maxBounds){if(this.map){this.mapOptions.maxBounds=maxBounds;maxBounds&&maxBounds.length>0&&this.map.setMaxBounds(maxBounds);}}/**
- * @function WebMapViewModel.prototype.setMinZoom
- * @description 设置地图的最小级别。
- * @param {Number} minZoom - 地图最小级别。
- */},{key:"setMinZoom",value:function setMinZoom(minZoom){if(this.map){this.mapOptions.minZoom=minZoom;(minZoom||minZoom===0)&&this.map.setMinZoom(minZoom);}}/**
- * @function WebMapViewModel.prototype.setMaxZoom
- * @description 设置地图的最大级别。
- * @param {Number} maxZoom - 地图最大级别。
- */},{key:"setMaxZoom",value:function setMaxZoom(maxZoom){if(this.map){this.mapOptions.maxZoom=maxZoom;(maxZoom||maxZoom===0)&&this.map.setMinZoom(maxZoom);}}/**
- * @function WebMapViewModel.prototype.setRenderWorldCopies
- * @description 设置地图的平铺。
- * @param {Boolean} renderWorldCopies - 地图是否平铺。
- */},{key:"setRenderWorldCopies",value:function setRenderWorldCopies(renderWorldCopies){if(this.map){this.mapOptions.renderWorldCopies=renderWorldCopies;renderWorldCopies&&this.map.setRenderWorldCopies(renderWorldCopies);}}/**
- * @function WebMapViewModel.prototype.setBearing
- * @description 设置地图的方位。
- * @param {Number} bearing - 地图的初始方位。
- */},{key:"setBearing",value:function setBearing(bearing){if(this.map){this.mapOptions.bearing=bearing;(bearing||bearing===0)&&this.map.setBearing(bearing);}}/**
- * @function WebMapViewModel.prototype.setPitch
- * @description 设置地图的俯仰。
- * @param {Number} pitch - 地图的初始俯仰。
- */},{key:"setPitch",value:function setPitch(pitch){if(this.map){this.mapOptions.pitch=pitch;(pitch||pitch===0)&&this.map.setPitch(pitch);}}/**
- * @function WebMapViewModel.prototype.setStyle
- * @description 设置地图的样式。
- * @param {Object} style - 地图的样式。
- */},{key:"setStyle",value:function setStyle(style){if(this.map){this.mapOptions.style=style;style&&this.map.setStyle(style);}}},{key:"_createWebMap",/**
- * @private
- * @function WebMapViewModel.prototype._createWebMap
- * @description 登陆窗口后添加地图图层。
- */value:function _createWebMap(){var _this3=this;if(this.map){this.map.remove();this.center=[];this.zoom=null;this._dataflowService&&this._dataflowService.off('messageSucceeded',this._handleDataflowFeaturesCallback);}if(!this.mapId||!this.serverUrl){this.mapOptions.container=this.target;setTimeout(function(){_this3.map=new _mapboxGlEnhance.default.Map(_this3.mapOptions);_this3.map.on('load',function(){_this3.fire('addlayerssucceeded',{map:_this3.map,mapparams:{},layers:[]});});},0);return;}this._legendList={};this._taskID=new Date();var urlArr=this.serverUrl.split('');if(urlArr[urlArr.length-1]!=='/'){this.serverUrl+='/';}var mapUrl=this.serverUrl+'web/maps/'+this.mapId+'/map';if(this.accessToken||this.accessKey){mapUrl+= true?'token='+this.accessToken:undefined;}var filter='getUrlResource.json?url=';if(this.excludePortalProxyUrl&&this.serverUrl.indexOf(filter)>-1){// 大屏需求,或者有加上代理的
- var urlArray=this.serverUrl.split(filter);if(urlArray.length>1){mapUrl=urlArray[0]+filter+this.serverUrl+'web/maps/'+this.mapId+'/map.json';}}this._getMapInfo(mapUrl,this._taskID);}/**
- * @private
- * @function WebMapViewModel.prototype._createMap
- * @description 创建地图。
- */},{key:"_createMap",value:function _createMap(mapInfo){// 获取字体样式
- var fonts=[];var layers=mapInfo.layers;// 获取 label 图层字体类型
- if(layers&&layers.length>0){layers.forEach(function(layer){layer.labelStyle&&fonts.push(layer.labelStyle.fontFamily);},this);}fonts.push("'supermapol-icons'");var fontFamilys=fonts.join(',');// zoom
- var center;center=mapInfo.center&&[mapInfo.center.x,mapInfo.center.y];// center
- var zoom=mapInfo.level||0;zoom=zoom===0?0:zoom-1;if(!center){center=[0,0];}if(this.baseProjection==='EPSG:3857'){center=this._unproject(center);}center=new _mapboxGlEnhance.default.LngLat(center[0],center[1]);// 初始化 map
- this.map=new _mapboxGlEnhance.default.Map({container:this.target,center:this.center.length?this.center:center,zoom:this.zoom||zoom,style:{version:8,sources:{},// "glyphs": 'http://iclsvr.supermap.io/iserver/services/map-beijing/rest/maps/beijingMap/tileFeature/sdffonts/{fontstack}/{range}.pbf',
- layers:[]},// @ts-ignore -------- crs 为 enhance 新加属性
- crs:this.baseProjection,localIdeographFontFamily:fontFamilys||'',renderWorldCopies:false,preserveDrawingBuffer:this.mapOptions.preserveDrawingBuffer||false});/**
- * @event WebMapViewModel#mapinitialized
- * @description Map 初始化成功。
- * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
- */this.fire('mapinitialized',{map:this.map});}/**
- * @private
- * @function WebMapViewModel.prototype._getMapInfo
- * @description 获取地图的 JSON 信息。
- * @param {string} url - 请求地图的 url。
- */},{key:"_getMapInfo",value:function _getMapInfo(url,_taskID){var _this4=this;var mapUrl=url.indexOf('.json')===-1?"".concat(url,".json"):url;SuperMap.FetchRequest.get(mapUrl,null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(mapInfo){_this4.baseProjection=mapInfo.projection;// 存储地图的名称以及描述等信息,返回给用户
- _this4.mapParams={title:mapInfo.title,description:mapInfo.description};// 坐标系异常处理
- if(_mapboxGlEnhance.default.CRS.get(_this4.baseProjection)){_this4._createMap(mapInfo);var layers=mapInfo.layers;_this4.map.on('load',function(){if(mapInfo.baseLayer&&mapInfo.baseLayer.layerType==='MAPBOXSTYLE'){// 添加矢量瓦片服务作为底图
- _this4._addMVTBaseMap(mapInfo);}else{_this4._addBaseMap(mapInfo);}if(!layers||layers.length===0){_this4._sendMapToUser(0,0);}else{_this4._addLayers(layers,_taskID);}});}else{throw Error('不支持当前地图的坐标系');}}).catch(function(error){/**
- * @event WebMapViewModel#getmapinfofailed
- * @description 获取地图信息失败。
- * @property {Object} error - 失败原因。
- */_this4.fire('getmapinfofailed',{error:error});});}},{key:"_addMVTBaseMap",value:function _addMVTBaseMap(mapInfo){var baseLayer=mapInfo.baseLayer,url=baseLayer.dataSource.url;// @ts-ignore
- this.map.addStyle(url);}/**
- * @private
- * @function WebMapViewModel.prototype._addBaseMap
- * @description 添加底图。
- * @param {Object} mapInfo - map 信息。
- */},{key:"_addBaseMap",value:function _addBaseMap(mapInfo){this._createBaseLayer(mapInfo);}/**
- * @private
- * @function WebMapViewModel.prototype._createBaseLayer
- * @description 创建底图。
- * @param {Object} mapInfo - map 信息。
- */},{key:"_createBaseLayer",value:function _createBaseLayer(mapInfo){var layerInfo=mapInfo.baseLayer||mapInfo;var layerType=layerInfo.layerType;// 底图和rest地图兼容
- if(layerType.indexOf('TIANDITU_VEC')>-1||layerType.indexOf('TIANDITU_IMG')>-1||layerType.indexOf('TIANDITU_TER')>-1){layerType=layerType.substr(0,12);}var mapUrls={CLOUD:'http://t2.dituhui.com/FileService/image?map=quanguo&type=web&x={x}&y={y}&z={z}',CLOUD_BLACK:'http://t3.dituhui.com/MapService/getGdp?x={x}&y={y}&z={z}',OSM:'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',GOOGLE:'http://www.google.cn/maps/vt/pb=!1m4!1m3!1i{z}!2i{x}!3i{y}!2m3!1e0!2sm!3i380072576!3m8!2szh-CN!3scn!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m1!1e0',GOOGLE_CN:'https://mt{0-3}.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}',JAPAN_STD:'http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',JAPAN_PALE:'http://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png',JAPAN_RELIEF:'http://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png',JAPAN_ORT:'http://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg'};var url;switch(layerType){case'TIANDITU_VEC':case'TIANDITU_IMG':case'TIANDITU_TER':this._createTiandituLayer(mapInfo);break;case'BING':this._createBingLayer(layerInfo.name);break;case'WMS':this._createWMSLayer(layerInfo);break;case'WMTS':this._createWMTSLayer(layerInfo);break;case'TILE':case'SUPERMAP_REST':this._createDynamicTiledLayer(layerInfo);break;case'CLOUD':case'CLOUD_BLACK':case'OSM':case'JAPAN_ORT':case'JAPAN_RELIEF':case'JAPAN_PALE':case'JAPAN_STD':case'GOOGLE_CN':case'GOOGLE':url=mapUrls[layerType];this._createXYZLayer(layerInfo,url);break;default:break;}}/**
- * @private
- * @function WebMapViewModel.prototype._createTiandituLayer
- * @description 创建天地图底图。
- * @param {Object} mapInfo - map 信息。
- */},{key:"_createTiandituLayer",value:function _createTiandituLayer(mapInfo){var tiandituUrls=this._getTiandituUrl(mapInfo);var layerType=mapInfo.baseLayer.layerType;var isLabel=Boolean(mapInfo.baseLayer.labelLayerVisible);var labelUrl=tiandituUrls['labelUrl'];var tiandituUrl=tiandituUrls['tiandituUrl'];this._addBaselayer(tiandituUrl,'tianditu-layers-'+layerType);isLabel&&this._addBaselayer(labelUrl,'tianditu-label-layers-'+layerType);}/**
- * @private
- * @function WebMapViewModel.prototype._createWMTSLayer
- * @description 创建 WMTS 底图。
- * @param {Object} layerInfo - 地图信息。
- */},{key:"_createWMTSLayer",value:function _createWMTSLayer(layerInfo){var _this5=this;var wmtsUrl=this._getWMTSUrl(layerInfo);this._filterWMTSIsMatched(layerInfo,function(isMatched,matchMaxZoom){isMatched&&_this5._addBaselayer([wmtsUrl],'wmts-layers'+layerInfo.name,0,matchMaxZoom);});}/**
- * @private
- * @function WebMapViewModel.prototype._filterWMTSIsMatched
- * @description 过滤能够跟mapboxgl匹配的wmts服务。
- * @param {Object} mapInfo - map 信息。
- * @callback matchedCallback
- */},{key:"_filterWMTSIsMatched",value:function _filterWMTSIsMatched(mapInfo,matchedCallback){var _this6=this;var isMatched=false;var matchMaxZoom=22;var url=mapInfo.url;var options={withCredentials:false,withoutFormatSuffix:true};SuperMap.FetchRequest.get(url,null,options).then(function(response){return response.text();}).then(function(capabilitiesText){var converts=convert||window.convert;var tileMatrixSet=JSON.parse(converts.xml2json(capabilitiesText,{compact:true,spaces:4})).Capabilities.Contents.TileMatrixSet;for(var i=0;i<tileMatrixSet.length;i++){if(tileMatrixSet[i]['ows:Identifier']&&tileMatrixSet[i]['ows:Identifier']['_text']===mapInfo.tileMatrixSet){if(DEFAULT_WELLKNOWNSCALESET.includes(tileMatrixSet[i]['WellKnownScaleSet']['_text'])){isMatched=true;}else if(tileMatrixSet[i]['WellKnownScaleSet']&&tileMatrixSet[i]['WellKnownScaleSet']['_text']==='Custom'){var matchedScaleDenominator=[];// 坐标系判断
- var defaultCRSScaleDenominators=// @ts-ignore -------- crs 为 enhance 新加属性
- _this6.map.crs==='EPSG:3857'?MB_SCALEDENOMINATOR_3857:MB_SCALEDENOMINATOR_4326;for(var j=0,len=defaultCRSScaleDenominators.length;j<len;j++){if(!tileMatrixSet[i].TileMatrix[j]){break;}if(defaultCRSScaleDenominators[j]!==tileMatrixSet[i].TileMatrix[j]['ScaleDenominator']['_text']){break;}matchedScaleDenominator.push(defaultCRSScaleDenominators[j]);}matchMaxZoom=matchedScaleDenominator.length-1;if(matchedScaleDenominator.length!==0){isMatched=true;}else{throw Error('不支持传入的 TileMatrixSet');}}else{throw Error('不支持传入的 TileMatrixSet');}}}matchedCallback(isMatched,matchMaxZoom);}).catch(function(error){/**
- * @event WebMapViewModel#getwmtsinfofailed
- * @description 获取 WMTS 图层信息失败。
- * @property {Object} error - 失败原因。
- * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
- */_this6.fire('getwmtsinfofailed',{error:error,map:_this6.map});});}/**
- * @private
- * @function WebMapViewModel.prototype._createBingLayer
- * @description 创建 Bing 图层。
- */},{key:"_createBingLayer",value:function _createBingLayer(layerName){var bingUrl='http://dynamic.t0.tiles.ditu.live.com/comp/ch/{quadkey}?it=G,TW,L,LA&mkt=zh-cn&og=109&cstl=w4c&ur=CN&n=z';// @ts-ignore
- this._addBaselayer([bingUrl],'bing-layers-'+layerName);}/**
- * @private
- * @function WebMapViewModel.prototype._createXYZLayer
- * @description 创建 XYZ 底图。
- * @param {String} url - url 地址。
- */},{key:"_createXYZLayer",value:function _createXYZLayer(layerInfo,url){var urlArr=[];if(layerInfo.layerType==='OSM'){var res=url.match(/\w\-\w/g)[0];var start=res[0];var end=res[2];var alphabet='';for(var i=97;i<123;i++){alphabet+=String.fromCharCode(i);}var alphabetArr=alphabet.split('');var startIndex=alphabetArr.indexOf(start);var endIndex=alphabetArr.indexOf(end);var res3=alphabetArr.slice(startIndex,endIndex+1);for(var _i=0;_i<res3.length;_i++){var replaceRes=url.replace(/{\w\-\w}/g,res3[_i]);urlArr.push(replaceRes);}}else if(layerInfo.layerType==='GOOGLE_CN'){var _res=url.match(/\d\-\d/g)[0];var _start=parseInt(_res[0]);var _end=parseInt(_res[2]);for(var _i2=_start;_i2<=_end;_i2++){var _replaceRes=url.replace(/{\d\-\d}/g,_i2.toString());urlArr.push(_replaceRes);}}else{urlArr=[url];}this._addBaselayer(urlArr,'XYZ-layers-'+layerInfo.name);}/**
- * @private
- * @function WebMapViewModel.prototype._createDynamicTiledLayer
- * @description 创建 iserver 底图。
- * @param {Object} layerInfo - 图层信息。
- */},{key:"_createDynamicTiledLayer",value:function _createDynamicTiledLayer(layerInfo){var url=layerInfo.url+'/zxyTileImage.png?z={z}&x={x}&y={y}';// @ts-ignore -------- setCRS 为 enhance 新加属性
- if(this.map.setCRS&&this.baseProjection!=='EPSG:3857'){url=layerInfo.url+'/image.png?viewBounds={viewBounds}&width={width}&height={height}';}this._addBaselayer([url],'tile-layers-'+layerInfo.name);}/**
- * @private
- * @function WebMapViewModel.prototype._createWMSLayer
- * @description 创建 WMS 图层。
- * @param {Object} layerInfo - 图层信息。
- */},{key:"_createWMSLayer",value:function _createWMSLayer(layerInfo){var WMSUrl=this._getWMSUrl(layerInfo);this._addBaselayer([WMSUrl],'WMS-layers-'+layerInfo.name);}/**
- * @private
- * @function WebMapViewModel.prototype._createVectorLayer
- * @description 创建 Vector 图层。
- * @param {Object} layerInfo - map 信息。
- * @param {Array} features - 属性 信息。
- */},{key:"_createVectorLayer",value:function _createVectorLayer(layerInfo,features){var style=layerInfo.style;var type=layerInfo.featureType;var layerID=layerInfo.layerID;var visible=layerInfo.visible;var layerStyle={style:this._transformStyleToMapBoxGl(style,type),layout:{visibility:visible}};var source={type:'geojson',data:{type:'FeatureCollection',features:features}};this._addOverlayToMap(type,source,layerID,layerStyle);// 如果面有边框
- type==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeLine',visible);}/**
- * @function WebMapViewModel.prototype._getTiandituUrl
- * @private
- * @description 创建天地图url;
- * @param {Object} mapInfo - map 信息。
- */},{key:"_getTiandituUrl",value:function _getTiandituUrl(mapInfo){var re=/t0/gi;var tiandituUrls={tiandituUrl:[],labelUrl:[]};var layerType=mapInfo.baseLayer.layerType.split('_')[1].toLowerCase();var isLabel=Boolean(mapInfo.baseLayer.labelLayerVisible);var url="http://t0.tianditu.com/{layer}_{proj}/wmts?tk=".concat(this.tiandituKey);var labelUrl=url;var layerLabelMap={vec:'cva',ter:'cta',img:'cia'};var tilematrixSet=this.baseProjection==='EPSG:4326'?'c':'w';var options={service:'WMTS',request:'GetTile',style:'default',version:'1.0.0',layer:layerType,tilematrixSet:tilematrixSet,format:'tiles',width:256,height:256};url+=this._getParamString(options,url)+'&tilematrix={z}&tilerow={y}&tilecol={x}';var tiandituUrl=url.replace('{layer}',layerType).replace('{proj}',tilematrixSet);var tiandituUrlArr=[];for(var i=0;i<8;i++){tiandituUrlArr.push(tiandituUrl.replace(re,"t".concat(i)));}tiandituUrls['tiandituUrl']=tiandituUrlArr;// 如果有 label 图层
- if(isLabel){var labelLayer=layerLabelMap[layerType];options.layer=labelLayer;labelUrl+=this._getParamString(options,labelUrl)+'&tilematrix={z}&tilerow={y}&tilecol={x}';labelUrl=labelUrl.replace('{layer}',labelLayer).replace('{proj}',tilematrixSet);var labelUrlArr=[];for(var _i3=0;_i3<8;_i3++){labelUrlArr.push(labelUrl.replace(re,"t".concat(_i3)));}tiandituUrls['labelUrl']=labelUrlArr;}return tiandituUrls;}/**
- * @function WebMapViewModel.prototype._getWMSUrl
- * @private
- * @description 创建 WMS url;
- * @param {Object} mapInfo - map 信息。
- */},{key:"_getWMSUrl",value:function _getWMSUrl(mapInfo){var url=mapInfo.url;url=url.split('?')[0];var strArr=url.split('/');var options={service:'WMS',request:'GetMap',layers:strArr[strArr.length-1],styles:'',format:'image/png',transparent:'true',version:'1.1.1',width:256,height:256,srs:this.baseProjection};var bbox=this.baseProjection==='EPSG:4326'?'{bbox-epsg-4326}':'{bbox-epsg-3857}';url+=this._getParamString(options,url)+"&bbox=".concat(bbox);return url;}/**
- * @private
- * @function WebMapViewModel.prototype._checkUploadToRelationship
- * @description 检查是否上传到关系型
- * @param {String} fileId - 文件的id
- * @returns {Promise<T | never>} 关系型文件一些参数
- */},{key:"_checkUploadToRelationship",value:function _checkUploadToRelationship(fileId){return SuperMap.FetchRequest.get("".concat(this.serverUrl,"web/datas/").concat(fileId,"/datasets.json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(result){return result;});}/**
- * @private
- * @function ol.supermap.WebMap.prototype._getDataService
- * @description 获取上传的数据信息
- * @param {String} fileId - 文件id
- * @param {String} datasetName 数据服务的数据集名称
- * @returns {Promise<T | never>} 数据的信息
- */},{key:"_getDataService",value:function _getDataService(fileId,datasetName){return SuperMap.FetchRequest.get("".concat(this.serverUrl,"web/datas/").concat(fileId,".json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(result){result.fileId=fileId;result.datasetName=datasetName;return result;});}/**
- * @private
- * @function WebMapViewModel.prototype._getService
- * @description 获取当前数据发布的服务中的某种类型服务
- * @param {Array} services 服务集合
- * @param {String} type 服务类型,RESTDATA, RESTMAP
- * @returns {Object} 服务
- */},{key:"_getService",value:function _getService(services,type){var service=services.filter(function(info){return info&&info.serviceType===type;});return service[0];}},{key:"_getServiceInfoFromLayer",value:function _getServiceInfoFromLayer(layerIndex,len,layer,dataItemServices,datasetName,featureType,info){var _this7=this;var isMapService=info?!info.isMvt:layer.layerType==='HOSTED_TILE',isAdded=false;dataItemServices.forEach(function(service,index){if(isAdded){return;}//有服务了,就不需要循环
- if(service&&isMapService&&service.serviceType==='RESTMAP'){isAdded=true;//地图服务,判断使用mvt还是tile
- _this7._getTileLayerInfo(service.address).then(function(restMaps){restMaps.forEach(function(restMapInfo){var bounds=restMapInfo.bounds;layer.layerType='TILE';layer.orginEpsgCode=_this7.baseProjection;layer.units=restMapInfo.coordUnit&&restMapInfo.coordUnit.toLowerCase();layer.extent=[bounds.left,bounds.bottom,bounds.right,bounds.top];layer.visibleScales=restMapInfo.visibleScales;layer.url=restMapInfo.url;layer.sourceType='TILE';_this7._createBaseLayer(layer);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);});});}// TODO 对接 MVT
- else if(service&&!isMapService&&service.serviceType==='RESTDATA'){if(info&&info.isMvt){_this7._addVectorLayer(info,layer,featureType);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);}else{//数据服务
- isAdded=true;//关系型文件发布的数据服务
- _this7._getDatasources(service.address).then(function(datasourceName){layer.dataSource.dataSourceName=datasourceName+':'+datasetName;layer.dataSource.url="".concat(service.address,"/data");_this7._getFeatureBySQL(layer.dataSource.url,[layer.dataSource.dataSourceName||layer.name],function(result){var features=_this7._parseGeoJsonData2Feature({allDatas:{features:result.result.features.features},fileCode:layer.projection,featureProjection:_this7.baseProjection});_this7._addLayer(layer,features,layerIndex);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);},function(err){_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);_this7.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this7.map});});});}}},this);if(!isAdded){//循环完成了,也没有找到合适的服务。有可能服务被删除
- this.layerAdded++;this._sendMapToUser(this.layerAdded,len);this.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:this.map});}}/**
- * @private
- * @function WebMapViewModel.prototype._getDatasources
- * @description 获取关系型文件发布的数据服务中数据源的名称
- * @param {String} url - 获取数据源信息的url
- * @returns {Promise<T | never>} 数据源名称
- */},{key:"_getDatasources",value:function _getDatasources(url){return SuperMap.FetchRequest.get("".concat(url,"/data/datasources.json")).then(function(response){return response.json();}).then(function(datasource){var datasourceNames=datasource.datasourceNames;return datasourceNames[0];});}/**
- * @private
- * @function WebMapViewModel.prototype._getTileLayerInfo
- * @description 获取地图服务的信息
- * @param {String} url 地图服务的url(没有地图名字)
- * @returns {Promise<T | never>} 地图服务信息
- */},{key:"_getTileLayerInfo",value:function _getTileLayerInfo(url){var _this8=this;var proxyUrl=this.serverUrl+'apps/viewer/getUrlResource.json?url=';var requestUrl=proxyUrl+encodeURIComponent(url);var epsgCode=this.baseProjection.split('EPSG:')[1];return SuperMap.FetchRequest.get("".concat(requestUrl,"/maps.json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(mapInfo){var promises=[];if(mapInfo){mapInfo.forEach(function(info){var promise=SuperMap.FetchRequest.get("".concat(proxyUrl).concat(info.path,".json?prjCoordSys=").concat(JSON.stringify({epsgCode:epsgCode})),null,{withCredentials:_this8.withCredentials}).then(function(response){return response.json();}).then(function(restMapInfo){restMapInfo.url=info.path;return restMapInfo;});promises.push(promise);});}return Promise.all(promises).then(function(allRestMaps){return allRestMaps;});});}/**
- * @private
- * @function WebMapViewModel.prototype._addLayers
- * @description 添加叠加图层。
- * @param {Object} mapInfo - 图层信息。
- */},{key:"_addLayers",value:function _addLayers(layers,_taskID){var _this9=this;// 存储地图上所有的图层对象
- this._layers=layers;var features;this.layerAdded=0;var len=layers.length;if(len>0){layers.forEach(function(layer,index){if(layer.dataSource&&layer.dataSource.serverId||layer.layerType==='MARKER'||layer.layerType==='HOSTED_TILE'){//数据存储到iportal上了
- var dataSource=layer.dataSource,serverId=dataSource?dataSource.serverId:layer.serverId;if(!serverId){_this9._addLayer(layer,null,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);return;}if(layer.layerType==='MARKER'||dataSource&&(!dataSource.accessType||dataSource.accessType==='DIRECT')){//原来二进制文件
- var url="".concat(_this9.serverUrl,"web/datas/").concat(serverId,"/content.json?pageSize=9999999¤tPage=1");if(_this9.accessToken){url="".concat(url,"&").concat(_this9.accessKey,"=").concat(_this9.accessToken);}SuperMap.FetchRequest.get(url,null,{withCredentials:_this9.withCredentials}).then(function(response){return response.json();}).then(function(data){if(_taskID!==_this9._taskID){return;}if(data.succeed===false){//请求失败
- _this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);// -----------------------todo-----------------
- _this9.fire('getlayerdatasourcefailed',{error:data.error,layer:layer,map:_this9.map});return;}if(data&&data.type){if(data.type==='JSON'||data.type==='GEOJSON'){data.content=JSON.parse(data.content.trim());features=_this9._formatGeoJSON(data.content);}else if(data.type==='EXCEL'||data.type==='CSV'){features=_this9._excelData2Feature(data.content);}_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);}}).catch(function(error){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:error,layer:layer,map:_this9.map});});}else{//关系型文件
- var isMapService=layer.layerType==='HOSTED_TILE',_serverId=dataSource?dataSource.serverId:layer.serverId;_this9._checkUploadToRelationship(_serverId).then(function(result){if(result&&result.length>0){var datasetName=result[0].name,featureType=result[0].type.toUpperCase();_this9._getDataService(_serverId,datasetName).then(function(data){var dataItemServices=data.dataItemServices;if(dataItemServices.length===0){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:_this9.map});return;}if(isMapService){var dataService=dataItemServices.filter(function(info){return info&&info.serviceType==='RESTDATA';})[0];_this9._isMvt(dataService.address,datasetName).then(function(info){_this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType,info);}).catch(function(){//判断失败就走之前逻辑,>数据量用tile
- _this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType);});}else{_this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType);}});}else{_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:_this9.map});}}).catch(function(error){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:error,layer:layer,map:_this9.map});});}}else if(layer.layerType==='SUPERMAP_REST'||layer.layerType==='TILE'||layer.layerType==='WMS'||layer.layerType==='WMTS'){_this9._createBaseLayer(layer);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);}else if(layer.dataSource&&layer.dataSource.type==='REST_DATA'){//从restData获取数据
- var _dataSource=layer.dataSource;_this9._getFeatureBySQL(_dataSource.url,[_dataSource.dataSourseName||layer.name],function(result){features=_this9._parseGeoJsonData2Feature({allDatas:{features:result.result.features.features},fileCode:layer.projection,featureProjection:_this9.baseProjection});_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(err){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});});}else if(layer.dataSource&&layer.dataSource.type==='REST_MAP'&&layer.dataSource.url){_this9._queryFeatureBySQL(layer.dataSource.url,layer.dataSource.layerName,function(result){var recordsets=result&&result.result.recordsets;var recordset=recordsets&&recordsets[0];var attributes=recordset.fields;if(recordset&&attributes){var fileterAttrs=[];for(var i in attributes){var value=attributes[i];if(value.indexOf('Sm')!==0||value==='SmID'){fileterAttrs.push(value);}}_this9._getFeatures(fileterAttrs,layer,function(features){_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(err){_this9.layerAdded++;_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});});}},function(err){_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});},'smid=1');}else if(layer.layerType==='DATAFLOW_POINT_TRACK'||layer.layerType==='DATAFLOW_HEAT'){_this9._getDataflowInfo(layer,function(){_this9._addLayer(layer,null,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(e){_this9.layerAdded++;// TODO fire faild
- });}},this);}}/**
- * @private
- * @function WebMapViewModel.prototype._getFeatures
- */},{key:"_getFeatures",value:function _getFeatures(fields,layerInfo,resolve,reject){var _this10=this;var source=layerInfo.dataSource;// 示例数据
- var fileCode=layerInfo.projection;this._queryFeatureBySQL(source.url,source.layerName,function(result){var recordsets=result.result.recordsets[0];var features=recordsets.features.features;var featuresObj=_this10._parseGeoJsonData2Feature({allDatas:{features:features},fileCode:fileCode,featureProjection:_this10.baseProjection});resolve(featuresObj);},function(err){reject(err);},null,fields);}/**
- * @private
- * @function WebMapViewModel.prototype._addLayer
- * @description 将单个图层添加到地图上。
- * @param layerInfo 某个图层的图层信息
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_addLayer",value:function _addLayer(layerInfo,features,index){var layerType=layerInfo.layerType;layerInfo.layerID=layerType+'-'+layerInfo.name+'-'+index;layerInfo.visible=layerInfo.visible?'visible':'none';// mbgl 目前不能处理 geojson 复杂面情况
- // mbgl isssue https://github.com/mapbox/mapbox-gl-js/issues/7023
- if(features&&features[0]&&features[0].geometry.type==='Polygon'){features=(0,_geometryUtil.handleMultyPolygon)(features);}if(layerInfo.style&&layerInfo.filterCondition){// 将 feature 根据过滤条件进行过滤, 分段专题图和单值专题图因为要计算 styleGroup 所以暂时不过滤
- if(layerType!=='RANGE'&&layerType!=='UNIQUE'&&layerType!=='RANK_SYMBOL'){features=this._getFiterFeatures(layerInfo.filterCondition,features);}}if(features&&layerInfo.projection!=='EPSG:4326'){this._transformFeatures(features);}if(layerType==='VECTOR'){if(layerInfo.featureType==='POINT'){if(layerInfo.style.type==='SYMBOL_POINT'){this._createSymbolLayer(layerInfo,features);}else{this._createGraphicLayer(layerInfo,features);}}else{// 线和面
- this._createVectorLayer(layerInfo,features);}}else if(layerType==='UNIQUE'){this._createUniqueLayer(layerInfo,features);}else if(layerType==='RANGE'){this._createRangeLayer(layerInfo,features);}else if(layerType==='HEAT'){this._createHeatLayer(layerInfo,features);}else if(layerType==='MARKER'){this._createMarkerLayer(layerInfo,features);}else if(layerInfo.layerType==='MIGRATION'){this._createMigrationLayer(layerInfo,features);}else if(layerInfo.layerType==='RANK_SYMBOL'){this._createRankSymbolLayer(layerInfo,features);}else if(layerInfo.layerType==='DATAFLOW_POINT_TRACK'||layerInfo.layerType==='DATAFLOW_HEAT'){this._createDataflowLayer(layerInfo);}if(layerInfo.labelStyle&&layerInfo.labelStyle.labelField&&layerInfo.layerType!=='DATAFLOW_POINT_TRACK'){// 存在标签专题图
- this._addLabelLayer(layerInfo,features);}}},{key:"_createDataflowLayer",value:function _createDataflowLayer(layerInfo){var dataflowService=new _mapboxGlEnhance.default.supermap.DataFlowService(layerInfo.wsUrl).initSubscribe();this._handleDataflowFeaturesCallback=this._handleDataflowFeatures.bind(this,layerInfo);dataflowService.on('messageSucceeded',this._handleDataflowFeaturesCallback);this._dataflowService=dataflowService;}},{key:"_handleDataflowFeatures",value:function _handleDataflowFeatures(layerInfo,e){var features=JSON.parse(e.data);// this._transformFeatures([features]); // TODO 坐标系
- this.fire('dataflowfeatureupdated',{features:features,identifyField:layerInfo.identifyField,layerID:layerInfo.layerID});if(layerInfo.filterCondition){//过滤条件
- var condition=this._replaceFilterCharacter(layerInfo.filterCondition);var sql='select * from json where ('+condition+')';var filterResult=window['jsonsql'].query(sql,{attributes:features.properties});if(filterResult&&filterResult.length>0){this._addDataflowLayer(layerInfo,features);}}else{this._addDataflowLayer(layerInfo,features);}}},{key:"_getDataFlowRotateStyle",value:function _getDataFlowRotateStyle(features,directionField,identifyField){var iconRotateExpression=['match',['get',identifyField]];features.forEach(function(feature){var value;if(directionField!==undefined&&directionField!=='未设置'&&directionField!=='None'){value=feature.properties[directionField];}else{value=0;}if(value>360||value<0){return null;}// @ts-ignore
- iconRotateExpression.push(feature.properties[identifyField],parseInt(value));});// @ts-ignore
- iconRotateExpression.push(0);return iconRotateExpression;}},{key:"_addDataflowLayer",value:function _addDataflowLayer(layerInfo,feature){var layerID=layerInfo.layerID;if(layerInfo.layerType==='DATAFLOW_HEAT'){if(!this.map.getSource(layerID)){this._createHeatLayer(layerInfo,[feature]);}else{this._updateDataFlowFeature(layerID,feature,layerInfo);}}else{var layerStyle=layerInfo.pointStyle;layerInfo.style=layerStyle;if(!this.map.getSource(layerID)){var iconRotateExpression=this._getDataFlowRotateStyle([feature],layerInfo.directionField,layerInfo.identifyField);if(['BASIC_POINT','SVG_POINT','IMAGE_POINT'].includes(layerStyle.type)){this._createGraphicLayer(layerInfo,[feature],null,iconRotateExpression);}else{this._createSymbolLayer(layerInfo,[feature],null,iconRotateExpression);}}else{this._updateDataFlowFeature(layerID,feature,layerInfo,'point');}if(layerInfo.labelStyle&&layerInfo.visible){if(!this.map.getSource(layerID+'label')){this._addLabelLayer(layerInfo,[feature]);}else{this._updateDataFlowFeature(layerID+'label',feature,layerInfo);}}if(layerInfo.lineStyle&&layerInfo.visible){if(!this.map.getSource(layerID+'-line')){var geometry=feature.geometry.coordinates;var lineFeature={type:'Feature',properties:feature.properties,geometry:{type:'LineString',coordinates:[geometry]}};this._createVectorLayer({style:layerInfo.lineStyle,featureType:'LINE',visible:'visible',layerID:layerID+'-line'},[lineFeature]);}else{this._updateDataFlowFeature(layerID+'-line',feature,layerInfo,'line');}}}}},{key:"_updateDataFlowFeature",value:function _updateDataFlowFeature(sourceID,newFeature,layerInfo,type){var identifyField=layerInfo.identifyField,maxPointCount=layerInfo.maxPointCount,directionField=layerInfo.directionField;// @ts-ignore
- var features=(0,_lodash2.default)(this.map.getSource(sourceID)._data.features);var has=false;features.map(function(item,index){if(item.properties[identifyField]===newFeature.properties[identifyField]){has=true;if(type==='line'){var coordinates=item.geometry.coordinates;coordinates.push(newFeature.geometry.coordinates);if(maxPointCount&&coordinates.length>maxPointCount){coordinates.splice(0,coordinates.length-maxPointCount);}features[index].geometry.coordinates=coordinates;}else{features[index]=newFeature;}}});if(!has){if(type==='line'){features.push({type:'Feature',properties:newFeature.properties,geometry:{type:'LineString',coordinates:[newFeature.geometry.coordinates]}});}else{features.push(newFeature);}}// @ts-ignore
- this.map.getSource(sourceID).setData({type:'FeatureCollection',features:features});if(type==='point'){var _type=layerInfo.pointStyle.type;var iconRotateExpression=this._getDataFlowRotateStyle(features,directionField,identifyField);if(['SVG_POINT','IMAGE_POINT'].includes(_type)){this.map.setLayoutProperty(sourceID,'icon-rotate',iconRotateExpression);}else if(_type==='SYMBOL_POINT'){this.map.setLayoutProperty(sourceID,'text-rotate',iconRotateExpression);}}}},{key:"_getDataflowInfo",value:function _getDataflowInfo(layerInfo,success,faild){var url=layerInfo.url,token;var requestUrl="".concat(url,".json");if(layerInfo.credential&&layerInfo.credential.token){token=layerInfo.credential.token;requestUrl+="?token=".concat(token);}SuperMap.FetchRequest.get(requestUrl).then(function(response){return response.json();}).then(function(result){if(result&&result.featureMetaData){layerInfo.featureType=result.featureMetaData.featureType.toUpperCase();layerInfo.dataSource={dataTypes:{}};if(result.featureMetaData.fieldInfos&&result.featureMetaData.fieldInfos.length>0){result.featureMetaData.fieldInfos.forEach(function(data){var name=data.name.trim();if(data.type==='TEXT'){layerInfo.dataSource.dataTypes[name]='STRING';}else if(['DOUBLE','INT','FLOAT','LONG','SHORT'].includes(data.type)){layerInfo.dataSource.dataTypes[name]='NUMBER';}else{layerInfo.dataSource.dataTypes[name]='UNKNOWN';}});}layerInfo.wsUrl=result.urls[0].url;layerInfo.name=result.urls[0].url.split('iserver/services/')[1].split('/dataflow')[0];success();}else{//失败也要到成功会调函数中,否则不会继续执行
- faild();}}).catch(function(){faild();});}},{key:"_createMigrationLayer",value:function _createMigrationLayer(layerInfo,features){window['echarts']=_echarts.default;var properties=this._getFeatureProperties(features);var lineData=this._createLinesData(layerInfo,properties);var pointData=this._createPointsData(lineData,layerInfo,properties);var options=this._createOptions(layerInfo,lineData,pointData);var echartslayer=new _EchartsLayer.default(this.map);echartslayer.chart.setOption(options);this.echartslayer.push(echartslayer);}},{key:"_createOptions",value:function _createOptions(layerInfo,lineData,pointData){var series;var lineSeries=this._createLineSeries(layerInfo,lineData);if(pointData&&pointData.length){var pointSeries=this._createPointSeries(layerInfo,pointData);series=lineSeries.concat(pointSeries);}else{series=lineSeries.slice();}var options={GLMap:{roam:true},// geo: {
- // map: 'GLMap',
- // label: {
- // emphasis: {
- // show: false
- // }
- // },
- // roam: true,
- // itemStyle: {
- // normal: {
- // areaColor: '#323c48',
- // borderColor: '#404a59'
- // },
- // emphasis: {
- // areaColor: '#2a333d'
- // }
- // }
- // },
- series:series};return options;}},{key:"_createPointSeries",value:function _createPointSeries(layerInfo,pointData){var lineSetting=layerInfo.lineSetting;var animationSetting=layerInfo.animationSetting;var labelSetting=layerInfo.labelSetting;var pointSeries=[{name:'point-series',coordinateSystem:'GLMap',zlevel:2,label:{normal:{show:labelSetting.show,position:'right',formatter:'{b}',color:labelSetting.color,fontFamily:labelSetting.fontFamily}},itemStyle:{normal:{color:lineSetting.color||labelSetting.color}},data:pointData}];if(animationSetting.show){// 开启动画
- // @ts-ignore
- pointSeries[0].type='effectScatter';// @ts-ignore
- pointSeries[0].rippleEffect={brushType:'stroke'};}else{// 关闭动画
- // @ts-ignore
- pointSeries[0].type='scatter';}return pointSeries;}},{key:"_createLineSeries",value:function _createLineSeries(layerInfo,lineData){var lineSetting=layerInfo.lineSetting;var animationSetting=layerInfo.animationSetting;var linesSeries=[// 轨迹线样式
- {name:'line-series',coordinateSystem:'GLMap',type:'lines',zlevel:1,effect:{show:animationSetting.show,constantSpeed:animationSetting.constantSpeed,trailLength:0,symbol:animationSetting.symbol,symbolSize:animationSetting.symbolSize},lineStyle:{normal:{color:lineSetting.color,type:lineSetting.type,width:lineSetting.width,opacity:lineSetting.opacity,curveness:lineSetting.curveness}},data:lineData}];if(lineData.length>=MAX_MIGRATION_ANIMATION_COUNT){// @ts-ignore
- linesSeries[0].large=true;// @ts-ignore
- linesSeries[0].largeThreshold=100;// @ts-ignore
- linesSeries[0].blendMode='lighter';}return linesSeries;}},{key:"_createLinesData",value:function _createLinesData(layerInfo,properties){var data=[];if(properties&&properties.length){// 重新获取数据
- var from=layerInfo.from,to=layerInfo.to,fromCoord,toCoord;if(from.type==='XY_FIELD'&&from['xField']&&from['yField']&&to['xField']&&to['yField']){properties.forEach(function(property){var fromX=property[from['xField']],fromY=property[from['yField']],toX=property[to['xField']],toY=property[to['yField']];if(!fromX||!fromY||!toX||!toY){return;}fromCoord=[property[from['xField']],property[from['yField']]];toCoord=[property[to['xField']],property[to['yField']]];data.push({coords:[fromCoord,toCoord]});});}else if(from.type==='PLACE_FIELD'&&from['field']&&to['field']){var centerDatas=_ProvinceCenter.default.concat(_MunicipalCenter.default);properties.forEach(function(property){var fromField=property[from['field']],toField=property[to['field']];fromCoord=centerDatas.find(function(item){return _mapboxGlEnhance.default.supermap.Util.isMatchAdministrativeName(item.name,fromField);});toCoord=centerDatas.find(function(item){return _mapboxGlEnhance.default.supermap.Util.isMatchAdministrativeName(item.name,toField);});if(!fromCoord||!toCoord){return;}data.push({coords:[fromCoord.coord,toCoord.coord]});});}}return data;}},{key:"_createPointsData",value:function _createPointsData(lineData,layerInfo,properties){var data=[],labelSetting=layerInfo.labelSetting;// 标签隐藏则直接返回
- if(!labelSetting.show||!lineData.length){return data;}var fromData=[],toData=[];lineData.forEach(function(item,idx){var coords=item.coords,fromCoord=coords[0],toCoord=coords[1],fromProperty=properties[idx][labelSetting.from],toProperty=properties[idx][labelSetting.to];// 起始字段去重
- var f=fromData.find(function(d){return d.value[0]===fromCoord[0]&&d.value[1]===fromCoord[1];});!f&&fromData.push({name:fromProperty,value:fromCoord});// 终点字段去重
- var t=toData.find(function(d){return d.value[0]===toCoord[0]&&d.value[1]===toCoord[1];});!t&&toData.push({name:toProperty,value:toCoord});});data=fromData.concat(toData);return data;}},{key:"_createRankSymbolLayer",value:function _createRankSymbolLayer(layerInfo,features){var fieldName=layerInfo.themeSetting.themeField;var style=layerInfo.style;var featureType=layerInfo.featureType;var styleSource=this._createRankStyleSource(layerInfo,features,layerInfo.featureType);var styleGroups=styleSource.styleGroups;features=this._getFiterFeatures(layerInfo.filterCondition,features);// 获取 expression
- var expression=['match',['get','index']];features.forEach(function(row){var tartget=parseFloat(row.properties[fieldName]);if(styleGroups){for(var i=0;i<styleGroups.length;i++){if(styleGroups[i].start<=tartget&&tartget<styleGroups[i].end){var radius=style.type==='SYMBOL_POINT'||style.type==='IMAGE_POINT'?style.type==='SYMBOL_POINT'?styleGroups[i].radius*2:Number.parseFloat((styleGroups[i].radius/style.imageInfo.size.h).toFixed(2))*2:styleGroups[i].radius;expression.push(row.properties['index'],radius);}}}// @ts-ignore
- !tartget&&expression.push(row.properties['index'],1);},this);// @ts-ignore
- expression.push(1);if(style.type==='SYMBOL_POINT'){this._createSymbolLayer(layerInfo,features,expression);}else if(style.type==='IMAGE_POINT'){this._createGraphicLayer(layerInfo,features,expression);}else{var source={type:'geojson',data:{type:'FeatureCollection',features:features}};// 获取样式
- var layerStyle={layout:{visibility:layerInfo.visible}};layerStyle.style=this._transformStyleToMapBoxGl(style,featureType,expression,'circle-radius');var layerID=layerInfo.layerID;this._addOverlayToMap(featureType,source,layerID,layerStyle);}}},{key:"_createRankStyleSource",value:function _createRankStyleSource(parameters,features,featureType){var themeSetting=parameters.themeSetting,themeField=themeSetting.themeField;var styleGroups=this._getRankStyleGroup(themeField,features,parameters,featureType);// @ts-ignore
- return styleGroups?{parameters:parameters,styleGroups:styleGroups}:false;}},{key:"_getRankStyleGroup",value:function _getRankStyleGroup(themeField,features,parameters,featureType){// 找出所有的单值
- var values=[],segements=[],style=parameters.style,themeSetting=parameters.themeSetting,segmentMethod=themeSetting.segmentMethod,segmentCount=themeSetting.segmentCount,customSettings=themeSetting.customSettings,minR=parameters.themeSetting.minRadius,maxR=parameters.themeSetting.maxRadius;features.forEach(function(feature){var properties=feature.properties,value=properties[themeField];// 过滤掉空值和非数值
- if(value==null||!_mapboxGlEnhance.default.supermap.Util.isNumber(value)){return;}values.push(Number(value));});try{segements=SuperMap.ArrayStatistic.getArraySegments(values,segmentMethod,segmentCount);}catch(error){console.error(error);}// 处理自定义 分段
- for(var i=0;i<segmentCount;i++){if(i in customSettings){var startValue=customSettings[i]['segment']['start'],endValue=customSettings[i]['segment']['end'];startValue!=null&&(segements[i]=startValue);endValue!=null&&(segements[i+1]=endValue);}}//生成styleGroup
- var styleGroup=[];if(segements&&segements.length){var len=segements.length,incrementR=(maxR-minR)/(len-1),// 半径增量
- start,end,radius=Number(((maxR+minR)/2).toFixed(2));for(var _i4=0;_i4<len-1;_i4++){start=Number(segements[_i4].toFixed(2));end=Number(segements[_i4+1].toFixed(2));// 这里特殊处理以下分段值相同的情况(即所有字段值相同)
- radius=start===end?radius:minR+Math.round(incrementR*_i4);// 最后一个分段时将end+0.01,避免取不到最大值
- end=_i4===len-2?end+0.01:end;// 处理自定义 半径
- radius=customSettings[_i4]&&customSettings[_i4].radius?customSettings[_i4].radius:radius;style.radius=radius;styleGroup.push({radius:radius,start:start,end:end});}return styleGroup;}else{return false;}}/**
- * @private
- * @function WebMapViewModel.prototype._addLabelLayer
- * @description 添加标签图层。
- * @param layerInfo 某个图层的图层信息。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_addLabelLayer",value:function _addLabelLayer(layerInfo,features){var labelStyle=layerInfo.labelStyle;this.map.addLayer({id:layerInfo.layerID+'label',type:'symbol',source:{type:'geojson',data:{type:'FeatureCollection',features:features}},paint:{'text-color':labelStyle.fill,'text-halo-color':'rgba(255,255,255,0.8)','text-halo-width':parseFloat(labelStyle.fontSize)||12},layout:{'text-field':"{".concat(labelStyle.labelField,"}"),'text-size':parseFloat(labelStyle.fontSize)||12,'text-offset':labelStyle.offsetX?[labelStyle.offsetX/10||0,labelStyle.offsetY/10||0]:[0,-2.5],'text-font':['DIN Offc Pro Italic','Arial Unicode MS Regular'],visibility:layerInfo.visible}});}/**
- * @private
- * @function WebMapViewModel.prototype._createSymbolLayer
- * @description 添加 symbol 图层。
- * @param layerInfo 某个图层的图层信息。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_createSymbolLayer",value:function _createSymbolLayer(layerInfo,features,textSize,textRotateExpresion){// 用来请求symbol_point字体文件
- var target=document.getElementById("".concat(this.target));target.classList.add('supermapol-icons-map');var style=layerInfo.style;var unicode=layerInfo.style.unicode;var text=String.fromCharCode(parseInt(unicode.replace(/^&#x/,''),16));var layerID=layerInfo.layerID;this.map.addSource(layerID,{type:'geojson',data:{type:'FeatureCollection',features:[]}});this.map.addLayer({id:layerID,type:'symbol',source:layerID,paint:{'text-color':style.fillColor},layout:{'text-field':text,'text-size':textSize||style.fontSize&&parseFloat(style.fontSize)||12,'text-font':['DIN Offc Pro Italic','Arial Unicode MS Regular'],'text-rotate':textRotateExpresion||0,visibility:layerInfo.visible}});// @ts-ignore
- this.map.getSource(layerID).setData({type:'FeatureCollection',features:features});}/**
- * @private
- * @function WebMapViewModel.prototype._createGraphicLayer
- * @description 创建 Graphic 图层。
- * @param {Object} layerInfo - map 信息。
- * @param {Array} features - 属性 信息。
- */},{key:"_createGraphicLayer",value:function _createGraphicLayer(layerInfo,features,iconSizeExpression,iconRotateExpression){var _this11=this;var style=layerInfo.style;var layerID=layerInfo.layerID;var source={type:'geojson',data:{type:'FeatureCollection',features:features}};if(style.type==='IMAGE_POINT'){var imageInfo=style.imageInfo;this.map.loadImage(imageInfo.url,function(error,image){if(error){console.log(error);}var iconSize=Number.parseFloat((style.radius/image.height).toFixed(2))*2;_this11.map.addImage('imageIcon',image);_this11.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':'imageIcon','icon-size':iconSizeExpression||iconSize,visibility:layerInfo.visible,'icon-rotate':iconRotateExpression||0}});});}else if(style.type==='SVG_POINT'){var svgUrl=style.url;if(!this._svgDiv){this._svgDiv=document.createElement('div');document.body.appendChild(this._svgDiv);}this._getCanvasFromSVG(svgUrl,this._svgDiv,function(canvas){var imgUrl=canvas.toDataURL('img/png');imgUrl&&_this11.map.loadImage(imgUrl,function(error,image){if(error){console.log(error);}var iconSize=Number.parseFloat((style.radius/canvas.width).toFixed(2));_this11.map.addImage('imageIcon',image);_this11.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':'imageIcon','icon-size':iconSizeExpression||iconSize,visibility:layerInfo.visible,'icon-rotate':iconRotateExpression||0}});});});}else{var layerStyle={style:this._transformStyleToMapBoxGl(style,layerInfo.featureType),layout:{visibility:layerInfo.visible}};this._addOverlayToMap('POINT',source,layerID,layerStyle);}}/**
- * @private
- * @function WebMapViewModel.prototype._createUniqueLayer
- * @description 创建单值图层。
- * @param layerInfo 某个图层的图层信息
- * @param features 图层上的 feature
- */},{key:"_createUniqueLayer",value:function _createUniqueLayer(layerInfo,features){var styleGroup=this._getUniqueStyleGroup(layerInfo,features);features=this._getFiterFeatures(layerInfo.filterCondition,features);var style=layerInfo.style;var themeField=layerInfo.themeSetting.themeField;Object.keys(features[0].properties).forEach(function(key){key.toLocaleUpperCase()===themeField.toLocaleUpperCase()&&(themeField=key);});var type=layerInfo.featureType;var expression=['match',['get','index']];var layerID=layerInfo.layerID;features.forEach(function(row){styleGroup.forEach(function(item){if(item.value===row.properties[themeField]){expression.push(row.properties['index'],item.color);}});});expression.push('#ffffff');// 图例相关
- this._initLegendConfigInfo(layerInfo,styleGroup);var visible=layerInfo.visible;var layerStyle={style:this._transformStyleToMapBoxGl(style,type,expression),layout:{visibility:visible}};var source={type:'geojson',data:{type:'FeatureCollection',features:features}};this._addOverlayToMap(type,source,layerID,layerStyle);type==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeLine',visible);}/**
- * @private
- * @function WebMapViewModel.prototype._getUniqueStyleGroup
- * @description 获取单值的目标字段与颜色的对应数组。
- * @param layerInfo 某个图层的图层信息
- * @param features 图层上的 feature
- */},{key:"_getUniqueStyleGroup",value:function _getUniqueStyleGroup(parameters,features){// 找出所有的单值
- var featureType=parameters.featureType;var style=parameters.style;var themeSetting=parameters.themeSetting;var fieldName=themeSetting.themeField;var colors=themeSetting.colors;Object.keys(features[0].properties).forEach(function(key){key.toLocaleUpperCase()===fieldName.toLocaleUpperCase()&&(fieldName=key);});var names=[];var customSettings=themeSetting.customSettings;for(var i in features){var properties=features[i].properties;var name=properties[fieldName];var isSaved=false;for(var j in names){if(names[j]===name){isSaved=true;break;}}if(!isSaved){names.push(name);}}// 获取一定量的颜色
- var curentColors=colors;curentColors=SuperMap.ColorsPickerUtil.getGradientColors(curentColors,names.length);// 生成styleGroup
- var styleGroup=[];names.forEach(function(name,index){var color=curentColors[index];if(name in customSettings){color=customSettings[name];}if(featureType==='LINE'){style.strokeColor=color;}else{style.fillColor=color;}styleGroup.push({color:color,value:name});},this);return styleGroup;}/**
- * @private
- * @function WebMapViewModel.prototype._getWMTSUrl
- * @description 根据传入的配置信息拼接wmts url。
- * @param options 配置对象
- */},{key:"_getWMTSUrl",value:function _getWMTSUrl(options){var obj={service:'WMTS',request:'GetTile',version:'1.0.0',style:'default',layer:options.layer,tilematrixSet:options.tileMatrixSet,format:'image/png'};var url=options.url;url+=this._getParamString(obj,url)+'&tilematrix={z}&tilerow={y}&tilecol={x}';return url;}/**
- * @private
- * @function WebMapViewModel.prototype._createMarkerLayer
- * @description 添加标记图层。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_createMarkerLayer",value:function _createMarkerLayer(layerInfo,features){var _this12=this;features&&features.forEach(function(feature){var geomType=feature.geometry.type.toUpperCase();var defaultStyle=feature.dv_v5_markerStyle;if(geomType==='POINT'&&defaultStyle.text){// 说明是文字的feature类型
- geomType='TEXT';}var featureInfo=_this12._setFeatureInfo(feature);feature.properties['useStyle']=defaultStyle;feature.properties['featureInfo']=featureInfo;if(geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('http://')===-1&&defaultStyle.src.indexOf('https://')===-1){// 说明地址不完整
- defaultStyle.src=_this12.serverUrl+defaultStyle.src;}var source={type:'geojson',data:feature};var index=feature.properties.index;var layerID=geomType+'-'+index;// image-marker
- geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('svg')<=-1&&_this12.map.loadImage(defaultStyle.src,function(error,image){if(error){console.log(error);}_this12.map.addImage(index+'',image);_this12.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':index+'','icon-size':defaultStyle.scale,visibility:layerInfo.visible}});});// svg-marker
- if(geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('svg')>-1){if(!_this12._svgDiv){_this12._svgDiv=document.createElement('div');document.body.appendChild(_this12._svgDiv);}_this12._getCanvasFromSVG(defaultStyle.src,_this12._svgDiv,function(canvas){var imgUrl=canvas.toDataURL('img/png');imgUrl&&_this12.map.loadImage(imgUrl,function(error,image){if(error){console.log(error);}_this12.map.addImage(index+'',image);_this12.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':index+'','icon-size':defaultStyle.scale,visibility:layerInfo.visible}});});});}// point-line-polygon-marker
- if(!defaultStyle.src){var layeStyle={layout:{}};if(geomType==='LINESTRING'&&defaultStyle.lineCap){geomType='LINE';layeStyle.layout={'line-cap':defaultStyle.lineCap};}var visible=layerInfo.visible;layeStyle.layout.visibility=visible;// get style
- layeStyle.style=_this12._transformStyleToMapBoxGl(defaultStyle,geomType);_this12._addOverlayToMap(geomType,source,layerID,layeStyle);// 若面有边框
- geomType==='POLYGON'&&defaultStyle.strokeColor&&_this12._addStrokeLineForPoly(defaultStyle,source,layerID+'-strokeLine',visible);}},this);}/**
- * @private
- * @function WebMapViewModel.prototype._setFeatureInfo
- * @description 设置 feature 信息。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_setFeatureInfo",value:function _setFeatureInfo(feature){var featureInfo;var info=feature.dv_v5_markerInfo;if(info&&info.dataViz_title){// 有featureInfo信息就不需要再添加
- featureInfo=info;}else{// featureInfo = this.getDefaultAttribute();
- return info;}var properties=feature.properties;for(var key in featureInfo){if(properties[key]){featureInfo[key]=properties[key];delete properties[key];}}return featureInfo;}/**
- * @private
- * @function WebMapViewModel.prototype._createHeatLayer
- * @description 添加热力图。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_createHeatLayer",value:function _createHeatLayer(layerInfo,features){var style=layerInfo.themeSetting;var layerOption={gradient:style.colors.slice(),radius:parseInt(style.radius)};// 自定义颜色
- var customSettings=style.customSettings;for(var i in customSettings){layerOption.gradient[i]=customSettings[i];}// 权重字段恢复
- if(style.weight){this._changeWeight(features,style.weight);}var color=['interpolate',['linear'],['heatmap-density']];var length=layerOption.gradient.length;var step=parseFloat((1/length).toFixed(2));layerOption.gradient.forEach(function(item,index){color.push(index*step);if(index===0){item=_mapboxGlEnhance.default.supermap.Util.hexToRgba(item,0);}color.push(item);});// 图例相关
- this._initLegendConfigInfo(layerInfo,layerOption.gradient);var paint={'heatmap-color':color,'heatmap-radius':style.radius+15,'heatmap-intensity':{base:1,stops:[[0,0.8],[22,1]]}};if(features[0].weight&&features.length>=4){var weight=[];features.forEach(function(item){weight.push(item.weight);});var max=SuperMap.ArrayStatistic.getMax(weight);var min=SuperMap.ArrayStatistic.getMin(weight);paint['heatmap-weight']=['interpolate',['linear'],['get','weight'],min,0,max,1];}this.map.addLayer({id:layerInfo.layerID,type:'heatmap',source:{type:'geojson',data:{type:'FeatureCollection',features:features}},paint:paint});}/**
- * @private
- * @function WebMapViewModel.prototype._changeWeight
- * @description 改变当前权重字段
- * @param {Array.<GeoJSON>} features - feature。
- * @param {String} weightFeild - 权重字段
- */},{key:"_changeWeight",value:function _changeWeight(features,weightFeild){this._fieldMaxValue={};this._getMaxValue(features,weightFeild);var maxValue=this._fieldMaxValue[weightFeild];features.forEach(function(feature){var attributes=feature.properties;var value=attributes[weightFeild];feature['weight']=value/maxValue;});}/**
- * @private
- * @function WebMapViewModel.prototype._getMaxValue
- * @description 获取当前字段对应的最大值,用于计算权重。
- * @param {Array.<GeoJSON>} features - feature。
- * @param {String} weightFeild - 权重字段
- */},{key:"_getMaxValue",value:function _getMaxValue(features,weightField){var values=[];var attributes;var field=weightField;if(this._fieldMaxValue[field]){return;}features.forEach(function(feature){// 收集当前权重字段对应的所有值
- attributes=feature.properties;attributes&&parseFloat(attributes[field])&&values.push(parseFloat(attributes[field]));});this._fieldMaxValue[field]=SuperMap.ArrayStatistic.getArrayStatistic(values,'Maximum');}/**
- * @private
- * @function WebMapViewModel.prototype._createRangeLayer
- * @description 添加分段专题图。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_createRangeLayer",value:function _createRangeLayer(layerInfo,features){var fieldName=layerInfo.themeSetting.themeField;var style=layerInfo.style;var featureType=layerInfo.featureType;var styleGroups=this._getRangeStyleGroup(layerInfo,features);features=this._getFiterFeatures(layerInfo.filterCondition,features);var source={type:'geojson',data:{type:'FeatureCollection',features:features}};// 获取 expression
- var expression=['match',['get','index']];features.forEach(function(row){var tartget=parseFloat(row.properties[fieldName]);if(styleGroups){for(var i=0;i<styleGroups.length;i++){if(styleGroups[i].start<=tartget&&tartget<styleGroups[i].end){expression.push(row.properties['index'],styleGroups[i].color);}}}!tartget&&expression.push(row.properties['index'],'rgba(0, 0, 0, 0)');},this);expression.push('rgba(0, 0, 0, 0)');// 图例处理
- this._initLegendConfigInfo(layerInfo,styleGroups);// 获取样式
- var layerStyle={layout:{}};if(featureType==='LINE'&&style.lineCap){layerStyle.layout={'line-cap':style.lineCap};}var visible=layerInfo.visible;layerStyle.layout.visibility=visible;layerStyle.style=this._transformStyleToMapBoxGl(style,featureType,expression);// 添加图层
- var layerID=layerInfo.layerID;this._addOverlayToMap(featureType,source,layerID,layerStyle);// 如果面有边框
- featureType==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeline',visible);}/**
- * @private
- * @function WebMapViewModel.prototype._getFiterFeatures
- * @description 通过过滤条件查询满足的 feature。
- * @param {String} filterCondition - 过滤条件。
- * @param {array} allFeatures - 图层上的 feature 集合
- */},{key:"_getFiterFeatures",value:function _getFiterFeatures(filterCondition,allFeatures){if(!filterCondition){return allFeatures;}var condition=this._replaceFilterCharacter(filterCondition);var sql='select * from json where ('+condition+')';var filterFeatures=[];for(var i=0;i<allFeatures.length;i++){var feature=allFeatures[i];var filterResult=void 0;try{filterResult=window['jsonsql'].query(sql,{properties:feature.properties});}catch(err){// 必须把要过滤得内容封装成一个对象,主要是处理jsonsql(line : 62)中由于with语句遍历对象造成的问题
- continue;}if(filterResult&&filterResult.length>0){// afterFilterFeatureIdx.push(i);
- filterFeatures.push(feature);}}return filterFeatures;}/**
- * @private
- * @function WebMapViewModel.prototype._replaceFilterCharacter
- * @description 获取过滤字符串。
- * @param {String} filterString - 过滤条件。
- */},{key:"_replaceFilterCharacter",value:function _replaceFilterCharacter(filterString){filterString=filterString.replace(/=/g,'==').replace(/AND|and/g,'&&').replace(/or|OR/g,'||').replace(/<==/g,'<=').replace(/>==/g,'>=');return filterString;}/**
- * @private
- * @function WebMapViewModel.prototype._getRangeStyleGroup
- * @description 获取分段样式。
- * @param {Array.<GeoJSON>} features - feature。
- */},{key:"_getRangeStyleGroup",value:function _getRangeStyleGroup(layerInfo,features){// 找出分段值
- var featureType=layerInfo.featureType;var style=layerInfo.style;var values=[];var attributes;var themeSetting=layerInfo.themeSetting;var customSettings=themeSetting.customSettings;var fieldName=themeSetting.themeField;var segmentCount=themeSetting.segmentCount;features.forEach(function(feature){attributes=feature.properties||feature.get('Properties');if(attributes){// 过滤掉非数值的数据
- attributes[fieldName]&&_mapboxGlEnhance.default.supermap.Util.isNumber(attributes[fieldName])&&values.push(parseFloat(attributes[fieldName]));}else if(feature.get(fieldName)&&_mapboxGlEnhance.default.supermap.Util.isNumber(feature.get(fieldName))){feature.get(fieldName)&&values.push(parseFloat(feature.get(fieldName)));}},this);var segements=SuperMap.ArrayStatistic.getArraySegments(values,themeSetting.segmentMethod,segmentCount);if(segements){var itemNum=segmentCount;if(attributes&&segements[0]===segements[attributes.length-1]){itemNum=1;segements.length=2;}// 保留两位有效数
- for(var i=0;i<segements.length;i++){var value=segements[i];value=i===0?Math.floor(value*100)/100:Math.ceil(value*100)/100+0.1;// 加0.1 解决最大值没有样式问题
- segements[i]=Number(value.toFixed(2));}// 获取一定量的颜色
- var curentColors=themeSetting.colors;// curentColors = SuperMap.ColorsPickerUtil.getGradientColors(curentColors, itemNum, 'RANGE');
- for(var index=0;index<itemNum;index++){if(index in customSettings){if(customSettings[index]['segment']['start']){segements[index]=customSettings[index]['segment']['start'];}if(customSettings[index]['segment']['end']){segements[index+1]=customSettings[index]['segment']['end'];}}}// 生成styleGroup
- var styleGroups=[];for(var _i5=0;_i5<itemNum;_i5++){var color=curentColors[_i5];if(_i5 in customSettings){if(customSettings[_i5].color){color=customSettings[_i5].color;}}if(featureType==='LINE'){style.strokeColor=color;}else{style.fillColor=color;}var start=segements[_i5];var end=segements[_i5+1];var styleObj=JSON.parse(JSON.stringify(style));styleGroups.push({style:styleObj,color:color,start:start,end:end});}return styleGroups;}}/**
- * @private
- * @function WebMapViewModel.prototype._formatGeoJSON
- * @description 格式 GeoJSON。
- * @param {GeoJSON} data - GeoJSON 数据。
- */},{key:"_formatGeoJSON",value:function _formatGeoJSON(data){var features=data.features;features.forEach(function(row,index){row.properties['index']=index;});return features;}/**
- * @private
- * @function WebMapViewModel.prototype._excelData2Feature将
- * @description csv 和 xls 文件内容转换成 geojson
- * @param content 文件内容
- * @param layerInfo 图层信息
- * @returns {Array} feature的数组集合
- */},{key:"_excelData2Feature",value:function _excelData2Feature(dataContent){var fieldCaptions=dataContent.colTitles;// 位置属性处理
- var xfieldIndex=-1;var yfieldIndex=-1;for(var i=0,len=fieldCaptions.length;i<len;i++){if((0,_util.isXField)(fieldCaptions[i])){xfieldIndex=i;}if((0,_util.isYField)(fieldCaptions[i])){yfieldIndex=i;}}// feature 构建后期支持坐标系 4326/3857
- var features=[];for(var _i6=0,_len=dataContent.rows.length;_i6<_len;_i6++){var row=dataContent.rows[_i6];var x=Number(row[xfieldIndex]);var y=Number(row[yfieldIndex]);// 属性信息
- var attributes={};for(var index in dataContent.colTitles){var key=dataContent.colTitles[index];attributes[key]=dataContent.rows[_i6][index];}attributes['index']=_i6+'';// 目前csv 只支持处理点,所以先生成点类型的 geojson
- var feature={type:'Feature',geometry:{type:'Point',coordinates:[x,y]},properties:attributes};features.push(feature);}return features;}/**
- * @private
- * @function WebMapViewModel.prototype._sendMapToUser
- * @description 返回最终的 map 对象给用户,供他们操作使用。
- * @param count
- * @param layersLen
- */},{key:"_sendMapToUser",value:function _sendMapToUser(count,layersLen){if(count===layersLen){/**
- * @event WebMapViewModel#addlayerssucceeded
- * @description 添加图层成功。
- * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
- * @property {Object} mapparams - 地图信息。
- * @property {string} mapParams.title - 地图标题。
- * @property {string} mapParams.description - 地图描述。
- * @property {Array.<Object>} layers - 地图上所有的图层对象。
- */this._sourceListModel=new _SourceListModel.default({map:this.map});for(var layerID in this._legendList){this._sourceListModel.addSourceStyle(layerID,this._legendList[layerID]);}for(var index=this._layers.length-2;index>-1;index--){var targetlayerId=this._layers[index].layerID;var beforLayerId=this._layers[index+1].layerID;this.map.moveLayer(targetlayerId,beforLayerId);}this.fire('addlayerssucceeded',{map:this.map,mapparams:this.mapParams,layers:this._layers});}}/**
- * @function WebMapViewModel.prototype._unproject
- * @private
- * @description 墨卡托转经纬度。
- * @param {} point - 待转换的点。
- */},{key:"_unproject",value:function _unproject(point){var d=180/Math.PI;var r=6378137;var ts=Math.exp(-point[1]/r);var phi=Math.PI/2-2*Math.atan(ts);for(var i=0,dphi=0.1,con;i<15&&Math.abs(dphi)>1e-7;i++){con=1;dphi=Math.PI/2-2*Math.atan(ts*con)-phi;phi+=dphi;}return[point[0]*d/r,phi*d];}/**
- * @function WebMapViewModel.prototype._getParamString
- * @private
- * @param {Object} obj - 待添加的参数。
- * @param {string} existingUrl - 待添加参数的 url。
- * @param {Boolean} [uppercase] - 参数是否转换为大写。
- */},{key:"_getParamString",value:function _getParamString(obj,existingUrl){var uppercase=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var params=[];for(var i in obj){params.push((uppercase?i.toUpperCase():i)+'='+obj[i]);}return(!existingUrl||existingUrl.indexOf('?')===-1?'?':'&')+params.join('&');}/**
- * @private
- * @function WebMapViewModel.prototype._transformStyleToMapBoxGl
- * @description 根据图层类型将 layerInfo 中的 style 属性格式转换为 mapboxglTypes 中的 style 格式。
- * @param {Object} style - layerInfo中的style属性
- * @param {String} type - 图层类型
- * @param {Array} [expression] - 存储颜色值得表达式
- */},{key:"_transformStyleToMapBoxGl",value:function _transformStyleToMapBoxGl(style,type,expression,expressionType){var transTable={};if((style.type==='POINT'||style.type==='BASIC_POINT'||type==='POINT')&&type!=='LINE'){transTable={fillColor:'circle-color',strokeWidth:'circle-stroke-width',fillOpacity:'circle-opacity',radius:'circle-radius',strokeColor:'circle-stroke-color',strokeOpacity:'circle-stroke-opacity'};}else if(['LINE','LINESTRING','MULTILINESTRING'].includes(type)){transTable={strokeWidth:'line-width',strokeColor:'line-color',strokeOpacity:'line-opacity'};}else if(['REGION','POLYGON','MULTIPOLYGON'].includes(type)){transTable={fillColor:'fill-color',fillOpacity:'fill-opacity',strokeColor:'fill-outline-color'};}var newObj={};for(var item in style){if(transTable[item]){newObj[transTable[item]]=style[item];}}if(expression){if(expressionType){newObj[expressionType]=expression;}else if(newObj['circle-color']){newObj['circle-color']=expression;}else if(newObj['line-color']){newObj['line-color']=expression;}else{newObj['fill-color']=expression;}}if(style.lineDash&&style.lineDash!=='solid'&&type==='LINE'){newObj['line-dasharray']=this._dashStyle(style);}return newObj;}/**
- * @private
- * @function WebMapViewModel.prototype.._dashStyle
- * @description 符号样式。
- * @param {Object} style - 样式参数。
- * @param {number} widthFactor - 宽度系数。
- */},{key:"_dashStyle",value:function _dashStyle(style){if(!style){return[];}// var w = style.strokeWidth * widthFactor;
- var w=1;var str=style.strokeDashstyle||style.lineDash;switch(str){case'solid':return[];case'dot':return[1,4*w];case'dash':return[4*w,4*w];case'dashdot':return[4*w,4*w,1*w,4*w];case'longdash':return[8*w,4*w];case'longdashdot':return[8*w,4*w,1,4*w];default:if(!str){return[];}if(SuperMap.Util.isArray(str)){return str;}str=SuperMap.String.trim(str).replace(/\s+/g,',');return str.replace(/\[|\]/gi,'').split(',');}}/**
- * @private
- * @description 将SVG转换成Canvas
- * @param svgUrl
- * @param divDom
- * @param callBack
- */},{key:"_getCanvasFromSVG",value:function _getCanvasFromSVG(svgUrl,divDom,callBack){// 一个图层对应一个canvas
- var canvas=document.createElement('canvas');canvas.id='dataviz-canvas-'+_mapboxGlEnhance.default.supermap.Util.newGuid(8);canvas.style.display='none';divDom.appendChild(canvas);var canvgs=window.canvg?window.canvg:_canvg.default;canvgs(canvas.id,svgUrl,{ignoreMouse:true,ignoreAnimation:true,renderCallback:function renderCallback(){if(canvas.width>300||canvas.height>300){return;}callBack(canvas);},forceRedraw:function forceRedraw(){return false;}});}/**
- * @private
- * @function WebMapViewModel.prototype._addOverlayToMap
- * @description 添加基础矢量图层到 MAP
- * @param {Object} style - mabgl style
- * @param {String} type - 图层类型
- */},{key:"_addOverlayToMap",value:function _addOverlayToMap(type,source,layerID,layerStyle){var mbglTypeMap={POINT:'circle',LINE:'line',POLYGON:'fill'};var mbglType=mbglTypeMap[type];if(mbglType==='circle'||mbglType==='line'||mbglType==='fill'){this.map.addLayer({id:layerID,type:mbglType,source:source,paint:layerStyle.style,layout:layerStyle.layout||{}});}}},{key:"_addBaselayer",value:function _addBaselayer(url,layerID){var minzoom=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var maxzoom=arguments.length>3&&arguments[3]!==undefined?arguments[3]:22;var source={type:'raster',tiles:url,tileSize:256};this.map.addLayer({id:layerID,type:'raster',source:source,minzoom:minzoom,maxzoom:maxzoom});}/**
- * @private
- * @function WebMapViewModel.prototype._addStrokeLineForPoly
- * @description 添加面的边框。
- * @param {Object} style - mabgl style
- */},{key:"_addStrokeLineForPoly",value:function _addStrokeLineForPoly(style,source,layerID,visible){var lineStyle={style:this._transformStyleToMapBoxGl(style,'LINE'),layout:{visibility:visible}};this._addOverlayToMap('LINE',source,layerID,lineStyle);}/**
- * @private
- * @function WebMapViewModel.prototype._parseGeoJsonData2Feature
- * @description 将从restData地址上获取的json转换成feature(从iserver中获取的json转换成feature)
- * @param {object} metaData - json内容
- */},{key:"_parseGeoJsonData2Feature",value:function _parseGeoJsonData2Feature(metaData){var allFeatures=metaData.allDatas.features;var features=[];for(var i=0,len=allFeatures.length;i<len;i++){var feature=allFeatures[i];var coordinate=feature.geometry.coordinates;if(allFeatures[i].geometry.type==='Point'){// 标注图层 还没有属性值时候不加
- if(allFeatures[i].properties){allFeatures[i].properties.lon=coordinate[0];allFeatures[i].properties.lat=coordinate[1];}}feature.properties['index']=i+'';features.push(feature);}return features;}/**
- * @private
- * @function WebMapViewModel.prototype._getFeatureBySQL
- * @description 通过 sql 方式查询数据。
- */},{key:"_getFeatureBySQL",value:function _getFeatureBySQL(url,datasetNames,_processCompleted,processFaild){var getFeatureParam,getFeatureBySQLService,getFeatureBySQLParams;getFeatureParam=new SuperMap.FilterParameter({name:datasetNames.join().replace(':','@'),attributeFilter:'SMID > 0'});getFeatureBySQLParams=new SuperMap.GetFeaturesBySQLParameters({queryParameter:getFeatureParam,datasetNames:datasetNames,fromIndex:0,toIndex:-1,maxFeatures:-1,returnContent:true});var options={eventListeners:{processCompleted:function processCompleted(getFeaturesEventArgs){_processCompleted&&_processCompleted(getFeaturesEventArgs);},processFailed:function processFailed(e){processFaild&&processFaild(e);}}};getFeatureBySQLService=new SuperMap.GetFeaturesBySQLService(url,options);getFeatureBySQLService.processAsync(getFeatureBySQLParams);}/**
- * @private
- * @function WebMapViewModel.prototype._queryFeatureBySQL
- * @description 通过 sql 方式查询数据。
- */},{key:"_queryFeatureBySQL",value:function _queryFeatureBySQL(url,layerName,processCompleted,processFaild,attributeFilter,fields,epsgCode,startRecord,recordLength,onlyAttribute){var queryParam=new SuperMap.FilterParameter({name:layerName,attributeFilter:attributeFilter});if(fields){queryParam.fields=fields;}var params={queryParams:[queryParam]};if(onlyAttribute){params.queryOption=SuperMap.QueryOption.ATTRIBUTE;}startRecord&&(params.startRecord=startRecord);recordLength&&(params.expectCount=recordLength);if(epsgCode){params.prjCoordSys={epsgCode:epsgCode};}var queryBySQLParams=new SuperMap.QueryBySQLParameters(params);var queryBySQLService=new _mapboxGlEnhance.default.supermap.QueryService(url);queryBySQLService.queryBySQL(queryBySQLParams,function(data){data.type==='processCompleted'?processCompleted(data):processFaild(data);});}},{key:"_initLegendConfigInfo",value:function _initLegendConfigInfo(layerInfo,style){if(!this._legendList[layerInfo.layerID]){this._legendList[layerInfo.layerID]={layerType:layerInfo.layerType,featureType:layerInfo.featureType,layerId:layerInfo.layerID,themeField:layerInfo.layerType==='HEAT'?layerInfo.themeSetting.weight:layerInfo.themeSetting.themeField,styleGroup:style};}}},{key:"_getFeatureProperties",value:function _getFeatureProperties(features){var properties=[];if(features&&features.length){features.forEach(function(feature){var property=feature.properties;property&&properties.push(property);});}return properties;}},{key:"_addVectorLayer",value:function _addVectorLayer(info,layerInfo,featureType){var style=this._getDataVectorTileStyle(featureType);var paint=this._transformStyleToMapBoxGl(style,featureType);var url=info.url+'/tileFeature.mvt';var origin=_mapboxGlEnhance.default.CRS.get(this.baseProjection).getOrigin();url+="?&returnAttributes=true&width=512&height=512&x={x}&y={y}&scale={scale}&origin={x:".concat(origin[0],",y:").concat(origin[1],"}");this.map.addLayer({id:(0,_lodash.default)(layerInfo.name+'-'),// @ts-ignore
- type:style.mbglType,source:{type:'vector',tiles:[url]},'source-layer':"".concat(info.datasetName,"@").concat(info.datasourceName),paint:paint,layout:{visibility:layerInfo.visible?'visible':'none'}});}},{key:"_isMvt",value:function _isMvt(serviceUrl,datasetName){var _this13=this;return this._getDatasetsInfo(serviceUrl,datasetName).then(function(info){//判断是否和底图坐标系一直
- if(info.epsgCode==_this13.baseProjection.split('EPSG:')[1]){return SuperMap.FetchRequest.get("".concat(info.url,"/tilefeature.mvt")).then(function(response){return response.json();}).then(function(result){info.isMvt=result.error&&result.error.code===400;return info;}).catch(function(){return info;});}return info;});}},{key:"_getDatasetsInfo",value:function _getDatasetsInfo(serviceUrl,datasetName){return this._getDatasources(serviceUrl).then(function(datasourceName){//判断mvt服务是否可用
- var url="".concat(serviceUrl,"/data/datasources/").concat(datasourceName,"/datasets/").concat(datasetName);return SuperMap.FetchRequest.get(url).then(function(response){return response.json();}).then(function(datasetsInfo){return{epsgCode:datasetsInfo.datasetInfo.prjCoordSys.epsgCode,bounds:datasetsInfo.datasetInfo.bounds,datasourceName:datasourceName,datasetName:datasetName,url:url//返回的是原始url,没有代理。因为用于请求mvt
- };});});}},{key:"_getDataVectorTileStyle",value:function _getDataVectorTileStyle(featureType){var styleParameters={radius:8,//圆点半径
- fillColor:'#EE4D5A',//填充色
- fillOpacity:0.9,strokeColor:'#ffffff',//边框颜色
- strokeWidth:1,strokeOpacity:1,lineDash:'solid',type:'BASIC_POINT',mbglType:'circle'};if(['LINE','LINESTRING','MULTILINESTRING'].includes(featureType)){styleParameters.strokeColor='#4CC8A3';styleParameters.strokeWidth=2;styleParameters.mbglType='line';}else if(['REGION','POLYGON','MULTIPOLYGON'].includes(featureType)){styleParameters.fillColor='#826DBA';styleParameters.mbglType='fill';}return styleParameters;}},{key:"_transformFeatures",value:function _transformFeatures(features){var _this14=this;features&&features.forEach(function(feature,index){var geometryType=feature.geometry.type;var coordinates=feature.geometry.coordinates;if(geometryType==='LineString'){coordinates.forEach(function(coordinate,index){coordinate=_this14._unproject(coordinate);coordinates[index]=coordinate;},_this14);}else if(geometryType==='Point'){coordinates=_this14._unproject(coordinates);feature.geometry.coordinates=coordinates;}else if(geometryType==='MultiPolygon'||geometryType==='Polygon'){coordinates.forEach(function(coordinate,index){var coords=geometryType==='MultiPolygon'?coordinate[0]:coordinate;coords.forEach(function(latlng,index){latlng=_this14._unproject(latlng);coords[index]=latlng;});coordinates[index]=coordinate;});}features[index]=feature;},this);}},{key:"getSourceListModel",get:function get(){return this._sourceListModel;}}]);return WebMapViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=WebMapViewModel;
- /***/ }),
- /* 71 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports,"__esModule",{value:true});exports.handleMultyPolygon=void 0;var handleMultyPolygon=function handleMultyPolygon(features){features.forEach(function(feature){if(feature.geometry.type!=='Polygon'){return;}var coords=feature.geometry.coordinates;if(coords.length>1){var coordinates=[];coords.forEach(function(coord){coordinates.push([coord]);});feature.geometry.coordinates=coordinates;feature.geometry.type='MultiPolygon';}});return features;};exports.handleMultyPolygon=handleMultyPolygon;
- /***/ }),
- /* 72 */
- /***/ (function(module, exports, __webpack_require__) {
- var arrayWithHoles = __webpack_require__(73);
- var iterableToArrayLimit = __webpack_require__(74);
- var nonIterableRest = __webpack_require__(75);
- function _slicedToArray(arr, i) {
- return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
- }
- module.exports = _slicedToArray;
- /***/ }),
- /* 73 */
- /***/ (function(module, exports) {
- function _arrayWithHoles(arr) {
- if (Array.isArray(arr)) return arr;
- }
- module.exports = _arrayWithHoles;
- /***/ }),
- /* 74 */
- /***/ (function(module, exports) {
- function _iterableToArrayLimit(arr, i) {
- if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
- return;
- }
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"] != null) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
- return _arr;
- }
- module.exports = _iterableToArrayLimit;
- /***/ }),
- /* 75 */
- /***/ (function(module, exports) {
- function _nonIterableRest() {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- module.exports = _nonIterableRest;
- /***/ }),
- /* 76 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "darkkhaki": [189, 183, 107],
- "darkmagenta": [139, 0, 139],
- "darkolivegreen": [85, 107, 47],
- "darkorange": [255, 140, 0],
- "darkorchid": [153, 50, 204],
- "darkred": [139, 0, 0],
- "darksalmon": [233, 150, 122],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50]
- };
- /***/ }),
- /* 77 */
- /***/ (function(module, exports, __webpack_require__) {
- /**
- * geostats() is a tiny and standalone javascript library for classification
- * Project page - https://github.com/simogeo/geostats
- * Copyright (c) 2011 Simon Georget, http://www.empreinte-urbaine.eu
- * Licensed under the MIT license
- */
- (function (definition) {
- // This file will function properly as a <script> tag, or a module
- // using CommonJS and NodeJS or RequireJS module formats.
- // CommonJS
- if (true) {
- module.exports = definition();
- // RequireJS
- } else {}
- })(function () {
- var isInt = function(n) {
- return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
- } // 6 characters
- var _t = function(str) {
- return str;
- };
- //taking from http://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric
- var isNumber = function(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
- //indexOf polyfill
- // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
- if (!Array.prototype.indexOf) {
- Array.prototype.indexOf = function (searchElement, fromIndex) {
- if ( this === undefined || this === null ) {
- throw new TypeError( '"this" is null or not defined' );
- }
- var length = this.length >>> 0; // Hack to convert object.length to a UInt32
- fromIndex = +fromIndex || 0;
- if (Math.abs(fromIndex) === Infinity) {
- fromIndex = 0;
- }
- if (fromIndex < 0) {
- fromIndex += length;
- if (fromIndex < 0) {
- fromIndex = 0;
- }
- }
- for (;fromIndex < length; fromIndex++) {
- if (this[fromIndex] === searchElement) {
- return fromIndex;
- }
- }
- return -1;
- };
- }
- var geostats = function(a) {
- this.objectID = '';
- this.separator = ' - ';
- this.legendSeparator = this.separator;
- this.method = '';
- this.precision = 0;
- this.precisionflag = 'auto';
- this.roundlength = 2; // Number of decimals, round values
- this.is_uniqueValues = false;
- this.debug = false;
- this.silent = false;
-
- this.bounds = Array();
- this.ranges = Array();
- this.inner_ranges = null;
- this.colors = Array();
- this.counter = Array();
-
- // statistics information
- this.stat_sorted = null;
- this.stat_mean = null;
- this.stat_median = null;
- this.stat_sum = null;
- this.stat_max = null;
- this.stat_min = null;
- this.stat_pop = null;
- this.stat_variance = null;
- this.stat_stddev = null;
- this.stat_cov = null;
-
- /**
- * logging method
- */
- this.log = function(msg, force) {
-
- if(this.debug == true || force != null)
- console.log(this.objectID + "(object id) :: " + msg);
-
- };
-
- /**
- * Set bounds
- */
- this.setBounds = function(a) {
-
- this.log('Setting bounds (' + a.length + ') : ' + a.join());
-
- this.bounds = Array() // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
-
- this.bounds = a;
- //this.bounds = this.decimalFormat(a);
-
- };
-
- /**
- * Set a new serie
- */
- this.setSerie = function(a) {
-
- this.log('Setting serie (' + a.length + ') : ' + a.join());
-
- this.serie = Array() // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
- this.serie = a;
-
- //reset statistics after changing serie
- this.resetStatistics();
-
- this.setPrecision();
-
- };
-
- /**
- * Set colors
- */
- this.setColors = function(colors) {
-
- this.log('Setting color ramp (' + colors.length + ') : ' + colors.join());
-
- this.colors = colors;
-
- };
-
- /**
- * Get feature count
- * With bounds array(0, 0.75, 1.5, 2.25, 3);
- * should populate this.counter with 5 keys
- * and increment counters for each key
- */
- this.doCount = function() {
- if (this._nodata())
- return;
-
- var tmp = this.sorted();
-
- this.counter = new Array();
-
- // we init counter with 0 value
- for(i = 0; i < this.bounds.length -1; i++) {
- this.counter[i]= 0;
- }
-
- for(j=0; j < tmp.length; j++) {
-
- // get current class for value to increment the counter
- var cclass = this.getClass(tmp[j]);
- this.counter[cclass]++;
- }
- };
-
- /**
- * Set decimal precision according to user input
- * or automatcally determined according
- * to the given serie.
- */
- this.setPrecision = function(decimals) {
-
- // only when called from user
- if(typeof decimals !== "undefined") {
- this.precisionflag = 'manual';
- this.precision = decimals;
- }
-
- // we calculate the maximal decimal length on given serie
- if(this.precisionflag == 'auto') {
-
- for (var i = 0; i < this.serie.length; i++) {
-
- // check if the given value is a number and a float
- if (!isNaN((this.serie[i]+"")) && (this.serie[i]+"").toString().indexOf('.') != -1) {
- var precision = (this.serie[i] + "").split(".")[1].length;
- } else {
- var precision = 0;
- }
-
- if(precision > this.precision) {
- this.precision = precision;
- }
-
- }
-
- }
- if(this.precision > 20) {
- // prevent "Uncaught RangeError: toFixed() digits argument must be between 0 and 20" bug. See https://github.com/simogeo/geostats/issues/34
- this.log('this.precision value (' + this.precision + ') is greater than max value. Automatic set-up to 20 to prevent "Uncaught RangeError: toFixed()" when calling decimalFormat() method.');
- this.precision = 20;
- }
- this.log('Calling setPrecision(). Mode : ' + this.precisionflag + ' - Decimals : '+ this.precision);
-
- this.serie = this.decimalFormat(this.serie);
-
- };
-
- /**
- * Format array numbers regarding to precision
- */
- this.decimalFormat = function(a) {
-
- var b = new Array();
-
- for (var i = 0; i < a.length; i++) {
- // check if the given value is a number
- if (isNumber(a[i])) {
- b[i] = parseFloat(parseFloat(a[i]).toFixed(this.precision));
- } else {
- b[i] = a[i];
- }
- }
-
- return b;
- }
-
- /**
- * Transform a bounds array to a range array the following array : array(0,
- * 0.75, 1.5, 2.25, 3); becomes : array('0-0.75', '0.75-1.5', '1.5-2.25',
- * '2.25-3');
- */
- this.setRanges = function() {
-
- this.ranges = Array(); // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
-
- for (i = 0; i < (this.bounds.length - 1); i++) {
- this.ranges[i] = this.bounds[i] + this.separator + this.bounds[i + 1];
- }
- };
- /** return min value */
- this.min = function() {
-
- if (this._nodata())
- return;
-
- this.stat_min = this.serie[0];
-
- for (i = 0; i < this.pop(); i++) {
- if (this.serie[i] < this.stat_min) {
- this.stat_min = this.serie[i];
- }
- }
- return this.stat_min;
- };
- /** return max value */
- this.max = function() {
-
- if (this._nodata())
- return;
-
- this.stat_max = this.serie[0];
- for (i = 0; i < this.pop(); i++) {
- if (this.serie[i] > this.stat_max) {
- this.stat_max = this.serie[i];
- }
- }
-
- return this.stat_max;
- };
- /** return sum value */
- this.sum = function() {
-
- if (this._nodata())
- return;
-
- if (this.stat_sum == null) {
-
- this.stat_sum = 0;
- for (i = 0; i < this.pop(); i++) {
- this.stat_sum += parseFloat(this.serie[i]);
- }
-
- }
-
- return this.stat_sum;
- };
- /** return population number */
- this.pop = function() {
-
- if (this._nodata())
- return;
-
- if (this.stat_pop == null) {
-
- this.stat_pop = this.serie.length;
-
- }
-
- return this.stat_pop;
- };
- /** return mean value */
- this.mean = function() {
-
- if (this._nodata())
- return;
- if (this.stat_mean == null) {
-
- this.stat_mean = parseFloat(this.sum() / this.pop());
-
- }
-
- return this.stat_mean;
- };
- /** return median value */
- this.median = function() {
-
- if (this._nodata())
- return;
-
- if (this.stat_median == null) {
-
- this.stat_median = 0;
- var tmp = this.sorted();
-
- // serie pop is odd
- if (tmp.length % 2) {
- this.stat_median = parseFloat(tmp[(Math.ceil(tmp.length / 2) - 1)]);
-
- // serie pop is even
- } else {
- this.stat_median = ( parseFloat(tmp[((tmp.length / 2) - 1)]) + parseFloat(tmp[(tmp.length / 2)]) ) / 2;
- }
-
- }
-
- return this.stat_median;
- };
- /** return variance value */
- this.variance = function() {
-
- round = (typeof round === "undefined") ? true : false;
-
- if (this._nodata())
- return;
-
- if (this.stat_variance == null) {
- var tmp = 0, serie_mean = this.mean();
- for (var i = 0; i < this.pop(); i++) {
- tmp += Math.pow( (this.serie[i] - serie_mean), 2 );
- }
- this.stat_variance = tmp / this.pop();
-
- if(round == true) {
- this.stat_variance = Math.round(this.stat_variance * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
- }
-
- }
-
- return this.stat_variance;
- };
-
- /** return standard deviation value */
- this.stddev = function(round) {
-
- round = (typeof round === "undefined") ? true : false;
-
- if (this._nodata())
- return;
-
- if (this.stat_stddev == null) {
-
- this.stat_stddev = Math.sqrt(this.variance());
-
- if(round == true) {
- this.stat_stddev = Math.round(this.stat_stddev * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
- }
-
- }
-
- return this.stat_stddev;
- };
-
- /** coefficient of variation - measure of dispersion */
- this.cov = function(round) {
-
- round = (typeof round === "undefined") ? true : false;
-
- if (this._nodata())
- return;
-
- if (this.stat_cov == null) {
-
- this.stat_cov = this.stddev() / this.mean();
-
- if(round == true) {
- this.stat_cov = Math.round(this.stat_cov * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
- }
-
- }
-
- return this.stat_cov;
- };
-
- /** reset all attributes after setting a new serie */
- this.resetStatistics = function() {
- this.stat_sorted = null;
- this.stat_mean = null;
- this.stat_median = null;
- this.stat_sum = null;
- this.stat_max = null;
- this.stat_min = null;
- this.stat_pop = null;
- this.stat_variance = null;
- this.stat_stddev = null;
- this.stat_cov = null;
- }
-
- /** data test */
- this._nodata = function() {
- if (this.serie.length == 0) {
-
- if(this.silent) this.log("[silent mode] Error. You should first enter a serie!", true);
- else throw new TypeError("Error. You should first enter a serie!");
- return 1;
- } else
- return 0;
-
- };
-
- /** check if the serie contains negative value */
- this._hasNegativeValue = function() {
-
- for (i = 0; i < this.serie.length; i++) {
- if(this.serie[i] < 0)
- return true;
- }
- return false;
- };
-
- /** check if the serie contains zero value */
- this._hasZeroValue = function() {
-
- for (i = 0; i < this.serie.length; i++) {
- if(parseFloat(this.serie[i]) === 0)
- return true;
- }
- return false;
- };
- /** return sorted values (as array) */
- this.sorted = function() {
-
- if (this.stat_sorted == null) {
-
- if(this.is_uniqueValues == false) {
- this.stat_sorted = this.serie.sort(function(a, b) {
- return a - b;
- });
- } else {
- this.stat_sorted = this.serie.sort(function(a,b){
- var nameA=a.toString().toLowerCase(), nameB=b.toString().toLowerCase();
- if(nameA < nameB) return -1;
- if(nameA > nameB) return 1;
- return 0;
- })
- }
- }
-
- return this.stat_sorted;
-
- };
- /** return all info */
- this.info = function() {
-
- if (this._nodata())
- return;
-
- var content = '';
- content += _t('Population') + ' : ' + this.pop() + ' - [' + _t('Min')
- + ' : ' + this.min() + ' | ' + _t('Max') + ' : ' + this.max()
- + ']' + "\n";
- content += _t('Mean') + ' : ' + this.mean() + ' - ' + _t('Median') + ' : ' + this.median() + "\n";
- content += _t('Variance') + ' : ' + this.variance() + ' - ' + _t('Standard deviation') + ' : ' + this.stddev()
- + ' - ' + _t('Coefficient of variation') + ' : ' + this.cov() + "\n";
- return content;
- };
-
- /**
- * Set Manual classification Return an array with bounds : ie array(0,
- * 0.75, 1.5, 2.25, 3);
- * Set ranges and prepare data for displaying legend
- *
- */
- this.setClassManually = function(array) {
- if (this._nodata())
- return;
- if(array[0] !== this.min() || array[array.length-1] !== this.max()) {
- if(this.silent) this.log("[silent mode] " + t('Given bounds may not be correct! please check your input.\nMin value : ' + this.min() + ' / Max value : ' + this.max()), true);
- else throw new TypeError(_t('Given bounds may not be correct! please check your input.\nMin value : ' + this.min() + ' / Max value : ' + this.max()));
- return;
- }
- this.setBounds(array);
- this.setRanges();
-
- // we specify the classification method
- this.method = _t('manual classification') + ' (' + (array.length -1) + ' ' + _t('classes') + ')';
- return this.bounds;
- };
- /**
- * Equal intervals classification Return an array with bounds : ie array(0,
- * 0.75, 1.5, 2.25, 3);
- */
- this.getClassEqInterval = function(nbClass, forceMin, forceMax) {
- if (this._nodata())
- return;
- var tmpMin = (typeof forceMin === "undefined") ? this.min() : forceMin;
- var tmpMax = (typeof forceMax === "undefined") ? this.max() : forceMax;
-
- var a = Array();
- var val = tmpMin;
- var interval = (tmpMax - tmpMin) / nbClass;
- for (i = 0; i <= nbClass; i++) {
- a[i] = val;
- val += interval;
- }
- //-> Fix last bound to Max of values
- a[nbClass] = tmpMax;
- this.setBounds(a);
- this.setRanges();
-
- // we specify the classification method
- this.method = _t('eq. intervals') + ' (' + nbClass + ' ' + _t('classes') + ')';
- return this.bounds;
- };
-
- this.getQuantiles = function(nbClass) {
- var tmp = this.sorted();
- var quantiles = [];
- var step = this.pop() / nbClass;
- for (var i = 1; i < nbClass; i++) {
- var qidx = Math.round(i*step+0.49);
- quantiles.push(tmp[qidx-1]); // zero-based
- }
- return quantiles;
- };
- /**
- * Quantile classification Return an array with bounds : ie array(0, 0.75,
- * 1.5, 2.25, 3);
- */
- this.getClassQuantile = function(nbClass) {
- if (this._nodata())
- return;
- var tmp = this.sorted();
- var bounds = this.getQuantiles(nbClass);
- bounds.unshift(tmp[0]);
- if (bounds[tmp.length - 1] !== tmp[tmp.length - 1])
- bounds.push(tmp[tmp.length - 1]);
- this.setBounds(bounds);
- this.setRanges();
- // we specify the classification method
- this.method = _t('quantile') + ' (' + nbClass + ' ' + _t('classes') + ')';
- return this.bounds;
- };
-
- /**
- * Standard Deviation classification
- * Return an array with bounds : ie array(0,
- * 0.75, 1.5, 2.25, 3);
- */
- this.getClassStdDeviation = function(nbClass, matchBounds) {
- if (this._nodata())
- return;
- var tmpMax = this.max();
- var tmpMin = this.min();
-
- var a = Array();
-
- // number of classes is odd
- if(nbClass % 2 == 1) {
- // Euclidean division to get the inferior bound
- var infBound = Math.floor(nbClass / 2);
-
- var supBound = infBound + 1;
-
- // we set the central bounds
- a[infBound] = this.mean() - ( this.stddev() / 2);
- a[supBound] = this.mean() + ( this.stddev() / 2);
-
- // Values < to infBound, except first one
- for (i = infBound - 1; i > 0; i--) {
- var val = a[i+1] - this.stddev();
- a[i] = val;
- }
-
- // Values > to supBound, except last one
- for (i = supBound + 1; i < nbClass; i++) {
- var val = a[i-1] + this.stddev();
- a[i] = val;
- }
-
- // number of classes is even
- } else {
-
- var meanBound = nbClass / 2;
-
- // we get the mean value
- a[meanBound] = this.mean();
-
- // Values < to the mean, except first one
- for (i = meanBound - 1; i > 0; i--) {
- var val = a[i+1] - this.stddev();
- a[i] = val;
- }
-
- // Values > to the mean, except last one
- for (i = meanBound + 1; i < nbClass; i++) {
- var val = a[i-1] + this.stddev();
- a[i] = val;
- }
- }
-
-
- // we finally set the first value
- // do we excatly match min value or not ?
- a[0] = (typeof matchBounds === "undefined") ? a[1]-this.stddev() : this.min();
-
- // we finally set the last value
- // do we excatly match max value or not ?
- a[nbClass] = (typeof matchBounds === "undefined") ? a[nbClass-1]+this.stddev() : this.max();
- this.setBounds(a);
- this.setRanges();
-
- // we specify the classification method
- this.method = _t('std deviation') + ' (' + nbClass + ' ' + _t('classes')+ ')';
-
- return this.bounds;
- };
-
-
- /**
- * Geometric Progression classification
- * http://en.wikipedia.org/wiki/Geometric_progression
- * Return an array with bounds : ie array(0,
- * 0.75, 1.5, 2.25, 3);
- */
- this.getClassGeometricProgression = function(nbClass) {
- if (this._nodata())
- return;
- if(this._hasNegativeValue() || this._hasZeroValue()) {
- if(this.silent) this.log("[silent mode] " + _t('geometric progression can\'t be applied with a serie containing negative or zero values.'), true);
- else throw new TypeError(_t('geometric progression can\'t be applied with a serie containing negative or zero values.'));
- return;
- }
-
- var a = Array();
- var tmpMin = this.min();
- var tmpMax = this.max();
-
- var logMax = Math.log(tmpMax) / Math.LN10; // max decimal logarithm (or base 10)
- var logMin = Math.log(tmpMin) / Math.LN10;; // min decimal logarithm (or base 10)
-
- var interval = (logMax - logMin) / nbClass;
-
- // we compute log bounds
- for (i = 0; i < nbClass; i++) {
- if(i == 0) {
- a[i] = logMin;
- } else {
- a[i] = a[i-1] + interval;
- }
- }
-
- // we compute antilog
- a = a.map(function(x) { return Math.pow(10, x); });
-
- // and we finally add max value
- a.push(this.max());
-
- this.setBounds(a);
- this.setRanges();
-
- // we specify the classification method
- this.method = _t('geometric progression') + ' (' + nbClass + ' ' + _t('classes') + ')';
- return this.bounds;
- };
-
- /**
- * Arithmetic Progression classification
- * http://en.wikipedia.org/wiki/Arithmetic_progression
- * Return an array with bounds : ie array(0,
- * 0.75, 1.5, 2.25, 3);
- */
- this.getClassArithmeticProgression = function(nbClass) {
- if (this._nodata())
- return;
-
- var denominator = 0;
-
- // we compute the (french) "Raison"
- for (i = 1; i <= nbClass; i++) {
- denominator += i;
- }
- var a = Array();
- var tmpMin = this.min();
- var tmpMax = this.max();
-
- var interval = (tmpMax - tmpMin) / denominator;
- for (i = 0; i <= nbClass; i++) {
- if(i == 0) {
- a[i] = tmpMin;
- } else {
- a[i] = a[i-1] + (i * interval);
- }
- }
- this.setBounds(a);
- this.setRanges();
-
- // we specify the classification method
- this.method = _t('arithmetic progression') + ' (' + nbClass + ' ' + _t('classes') + ')';
- return this.bounds;
- };
-
- /**
- * Credits : Doug Curl (javascript) and Daniel J Lewis (python implementation)
- * http://www.arcgis.com/home/item.html?id=0b633ff2f40d412995b8be377211c47b
- * http://danieljlewis.org/2010/06/07/jenks-natural-breaks-algorithm-in-python/
- */
- this.getClassJenks = function(nbClass) {
-
- if (this._nodata())
- return;
-
- dataList = this.sorted();
- // now iterate through the datalist:
- // determine mat1 and mat2
- // really not sure how these 2 different arrays are set - the code for
- // each seems the same!
- // but the effect are 2 different arrays: mat1 and mat2
- var mat1 = []
- for ( var x = 0, xl = dataList.length + 1; x < xl; x++) {
- var temp = []
- for ( var j = 0, jl = nbClass + 1; j < jl; j++) {
- temp.push(0)
- }
- mat1.push(temp)
- }
- var mat2 = []
- for ( var i = 0, il = dataList.length + 1; i < il; i++) {
- var temp2 = []
- for ( var c = 0, cl = nbClass + 1; c < cl; c++) {
- temp2.push(0)
- }
- mat2.push(temp2)
- }
- // absolutely no idea what this does - best I can tell, it sets the 1st
- // group in the
- // mat1 and mat2 arrays to 1 and 0 respectively
- for ( var y = 1, yl = nbClass + 1; y < yl; y++) {
- mat1[0][y] = 1
- mat2[0][y] = 0
- for ( var t = 1, tl = dataList.length + 1; t < tl; t++) {
- mat2[t][y] = Infinity
- }
- var v = 0.0
- }
- // and this part - I'm a little clueless on - but it works
- // pretty sure it iterates across the entire dataset and compares each
- // value to
- // one another to and adjust the indices until you meet the rules:
- // minimum deviation
- // within a class and maximum separation between classes
- for ( var l = 2, ll = dataList.length + 1; l < ll; l++) {
- var s1 = 0.0
- var s2 = 0.0
- var w = 0.0
- for ( var m = 1, ml = l + 1; m < ml; m++) {
- var i3 = l - m + 1
- var val = parseFloat(dataList[i3 - 1])
- s2 += val * val
- s1 += val
- w += 1
- v = s2 - (s1 * s1) / w
- var i4 = i3 - 1
- if (i4 != 0) {
- for ( var p = 2, pl = nbClass + 1; p < pl; p++) {
- if (mat2[l][p] >= (v + mat2[i4][p - 1])) {
- mat1[l][p] = i3
- mat2[l][p] = v + mat2[i4][p - 1]
- }
- }
- }
- }
- mat1[l][1] = 1
- mat2[l][1] = v
- }
- var k = dataList.length
- var kclass = []
- // fill the kclass (classification) array with zeros:
- for (i = 0; i <= nbClass; i++) {
- kclass.push(0);
- }
- // this is the last number in the array:
- kclass[nbClass] = parseFloat(dataList[dataList.length - 1])
- // this is the first number - can set to zero, but want to set to lowest
- // to use for legend:
- kclass[0] = parseFloat(dataList[0])
- var countNum = nbClass
- while (countNum >= 2) {
- var id = parseInt((mat1[k][countNum]) - 2)
- kclass[countNum - 1] = dataList[id]
- k = parseInt((mat1[k][countNum] - 1))
- // spits out the rank and value of the break values:
- // console.log("id="+id,"rank = " + String(mat1[k][countNum]),"val =
- // " + String(dataList[id]))
- // count down:
- countNum -= 1
- }
- // check to see if the 0 and 1 in the array are the same - if so, set 0
- // to 0:
- if (kclass[0] == kclass[1]) {
- kclass[0] = 0
- }
- this.setBounds(kclass);
- this.setRanges();
-
- this.method = _t('Jenks') + ' (' + nbClass + ' ' + _t('classes') + ')';
-
- return this.bounds; //array of breaks
- }
-
-
- /**
- * Quantile classification Return an array with bounds : ie array(0, 0.75,
- * 1.5, 2.25, 3);
- */
- this.getClassUniqueValues = function() {
- if (this._nodata())
- return;
-
- this.is_uniqueValues = true;
-
- var tmp = this.sorted(); // display in alphabetical order
- var a = Array();
- for (i = 0; i < this.pop(); i++) {
- if(a.indexOf(tmp[i]) === -1)
- a.push(tmp[i]);
- }
-
- this.bounds = a;
-
- // we specify the classification method
- this.method = _t('unique values');
-
- return a;
- };
-
-
- /**
- * Return the class of a given value.
- * For example value : 6
- * and bounds array = (0, 4, 8, 12);
- * Return 2
- */
- this.getClass = function(value) {
- for(i = 0; i < this.bounds.length; i++) {
-
-
- if(this.is_uniqueValues == true) {
- if(value == this.bounds[i])
- return i;
- } else {
- // parseFloat() is necessary
- if(parseFloat(value) <= this.bounds[i + 1]) {
- return i;
- }
- }
- }
-
- return _t("Unable to get value's class.");
-
- };
- /**
- * Return the ranges array : array('0-0.75', '0.75-1.5', '1.5-2.25',
- * '2.25-3');
- */
- this.getRanges = function() {
-
- return this.ranges;
-
- };
- /**
- * Returns the number/index of this.ranges that value falls into
- */
- this.getRangeNum = function(value) {
-
- var bounds, i;
- for (i = 0; i < this.ranges.length; i++) {
- bounds = this.ranges[i].split(/ - /);
- if (value <= parseFloat(bounds[1])) {
- return i;
- }
- }
- }
-
- /*
- * Compute inner ranges based on serie.
- * Produce discontinous ranges used for legend - return an array similar to :
- * array('0.00-0.74', '0.98-1.52', '1.78-2.25', '2.99-3.14');
- * If inner ranges already computed, return array values.
- */
- this.getInnerRanges = function() {
-
- // if already computed, we return the result
- if(this.inner_ranges != null)
- return this.inner_ranges;
-
- var a = new Array();
- var tmp = this.sorted();
-
- var cnt = 1; // bounds array counter
-
- for (i = 0; i < tmp.length; i++) {
-
- if(i == 0) var range_firstvalue = tmp[i]; // we init first range value
-
- if(parseFloat(tmp[i]) > parseFloat(this.bounds[cnt])) {
-
- a[cnt - 1] = '' + range_firstvalue + this.separator + tmp[i-1];
-
- var range_firstvalue = tmp[i];
-
- cnt++;
- }
-
- // we reach the last range, we finally complete manually
- // and return the array
- if(cnt == (this.bounds.length - 1)) {
- // we set the last value
- a[cnt - 1] = '' + range_firstvalue + this.separator + tmp[tmp.length-1];
-
- this.inner_ranges = a;
- return this.inner_ranges;
- }
-
- }
-
- };
-
- this.getSortedlist = function() {
-
- return this.sorted().join(', ');
-
- };
-
- /**
- * Return an html legend
- * colors : specify an array of color (hexadecimal values)
- * legend : specify a text input for the legend. By default, just displays 'legend'
- * counter : if not null, display counter value
- * callback : if not null, callback function applied on legend boundaries
- * mode : null, 'default', 'distinct', 'discontinuous' :
- * - if mode is null, will display legend as 'default mode'
- * - 'default' : displays ranges like in ranges array (continuous values), sample : 29.26 - 378.80 / 378.80 - 2762.25 / 2762.25 - 6884.84
- * - 'distinct' : Add + 1 according to decimal precision to distinguish classes (discrete values), sample : 29.26 - 378.80 / 378.81 - 2762.25 / 2762.26 - 6884.84
- * - 'discontinuous' : indicates the range of data actually falling in each class , sample : 29.26 - 225.43 / 852.12 - 2762.20 / 3001.25 - 6884.84 / not implemented yet
- * order : null, 'ASC', 'DESC'
- */
- this.getHtmlLegend = function(colors, legend, counter, callback, mode, order) {
-
- var cnt= '';
- var elements = new Array();
-
- this.doCount(); // we do count, even if not displayed
-
- if(colors != null) {
- ccolors = colors;
- }
- else {
- ccolors = this.colors;
- }
-
- if(legend != null) {
- lg = legend;
- }
- else {
- lg = 'Legend';
- }
-
- if(counter != null) {
- getcounter = true;
- }
- else {
- getcounter = false;
- }
-
- if(callback != null) {
- fn = callback;
- }
- else {
- fn = function(o) {return o;};
- }
- if(mode == null) {
- mode = 'default';
- }
- if(mode == 'discontinuous') {
- this.getInnerRanges();
- // check if some classes are not populated / equivalent of in_array function
- if(this.counter.indexOf(0) !== -1) {
- if(this.silent) this.log("[silent mode] " + _t("Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\nPlease switch to 'default' or 'distinct' modes. Exit!"), true);
- else throw new TypeError(_t("Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\nPlease switch to 'default' or 'distinct' modes. Exit!"));
- return;
- }
- }
- if(order !== 'DESC') order = 'ASC';
-
- if(ccolors.length < this.ranges.length) {
- if(this.silent) this.log("[silent mode] " + _t('The number of colors should fit the number of ranges. Exit!'), true);
- else throw new TypeError(_t('The number of colors should fit the number of ranges. Exit!'));
- return;
- }
-
- if(this.is_uniqueValues == false) {
-
- for (i = 0; i < (this.ranges.length); i++) {
- if(getcounter===true) {
- cnt = ' <span class="geostats-legend-counter">(' + this.counter[i] + ')</span>';
- }
- //console.log("Ranges : " + this.ranges[i]);
-
- // default mode
- var tmp = this.ranges[i].split(this.separator);
-
- var start_value = parseFloat(tmp[0]).toFixed(this.precision);
- var end_value = parseFloat(tmp[1]).toFixed(this.precision);
-
-
- // if mode == 'distinct' and we are not working on the first value
- if(mode == 'distinct' && i != 0) {
- if(isInt(start_value)) {
- start_value = parseInt(start_value) + 1;
- // format to float if necessary
- if(this.precisionflag == 'manual' && this.precision != 0) start_value = parseFloat(start_value).toFixed(this.precision);
- } else {
- start_value = parseFloat(start_value) + (1 / Math.pow(10,this.precision));
- // strangely the formula above return sometimes long decimal values,
- // the following instruction fix it
- start_value = parseFloat(start_value).toFixed(this.precision);
- }
- }
-
- // if mode == 'discontinuous'
- if(mode == 'discontinuous') {
-
- var tmp = this.inner_ranges[i].split(this.separator);
- // console.log("Ranges : " + this.inner_ranges[i]);
-
- var start_value = parseFloat(tmp[0]).toFixed(this.precision);
- var end_value = parseFloat(tmp[1]).toFixed(this.precision);
-
- }
-
- // we apply callback function
- var el = fn(start_value) + this.legendSeparator + fn(end_value);
-
- var block = '<div><div class="geostats-legend-block" style="background-color:' + ccolors[i] + '"></div> ' + el + cnt + '</div>';
- elements.push(block);
- }
-
- } else {
-
- // only if classification is done on unique values
- for (i = 0; i < (this.bounds.length); i++) {
- if(getcounter===true) {
- cnt = ' <span class="geostats-legend-counter">(' + this.counter[i] + ')</span>';
- }
- var el = fn(this.bounds[i]);
- var block = '<div><div class="geostats-legend-block" style="background-color:' + ccolors[i] + '"></div> ' + el + cnt + '</div>';
- elements.push(block);
- }
-
- }
-
- // do we reverse the return legend ?
- if(order === 'DESC') elements.reverse();
-
- // finally we create HTML and return it
- var content = '<div class="geostats-legend"><div class="geostats-legend-title">' + _t(lg) + '</div>';
- for (i = 0; i < (elements.length); i++) {
- content += elements[i];
- }
- content += '</div>';
-
- return content;
- };
-
-
- // object constructor
- // At the end of script. If not setPrecision() method is not known
-
- // we create an object identifier for debugging
- this.objectID = new Date().getUTCMilliseconds();
- this.log('Creating new geostats object');
-
- if(typeof a !== 'undefined' && a.length > 0) {
- this.serie = a;
- this.setPrecision();
- this.log('Setting serie (' + a.length + ') : ' + a.join());
- } else {
- this.serie = Array();
- };
-
- // creating aliases on classification function for backward compatibility
- this.getJenks = this.getClassJenks;
- this.getGeometricProgression = this.getClassGeometricProgression;
- this.getEqInterval = this.getClassEqInterval;
- this.getQuantile = this.getClassQuantile;
- this.getStdDeviation = this.getClassStdDeviation;
- this.getUniqueValues = this.getClassUniqueValues;
- this.getArithmeticProgression = this.getClassArithmeticProgression;
- };
- window.geostats = geostats;
- return geostats;
- });
- /***/ }),
- /* 78 */
- /***/ (function(module, exports) {
- /*
- * JsonSQL
- * By: Trent Richardson [http://trentrichardson.com]
- * Version 0.1
- * Last Modified: 1/1/2008
- *
- * Copyright 2008 Trent Richardson
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- window.jsonsql = {
- query: function(sql,json){
- var returnfields = sql.match(/^(select)\s+([a-z0-9_\,\.\s\*]+)\s+from\s+([a-z0-9_\.]+)(?: where\s+\((.+)\))?\s*(?:order\sby\s+([a-z0-9_\,]+))?\s*(asc|desc|ascnum|descnum)?\s*(?:limit\s+([0-9_\,]+))?/i);
- var ops = {
- fields: returnfields[2].replace(' ','').split(','),
- from: returnfields[3].replace(' ',''),
- where: (returnfields[4] == undefined)? "true":returnfields[4],
- orderby: (returnfields[5] == undefined)? []:returnfields[5].replace(' ','').split(','),
- order: (returnfields[6] == undefined)? "asc":returnfields[6],
- limit: (returnfields[7] == undefined)? []:returnfields[7].replace(' ','').split(',')
- };
- return this.parse(json, ops);
- },
- parse: function(json,ops){
- var o = { fields:["*"], from:"json", where:"", orderby:[], order: "asc", limit:[] };
- for(i in ops) o[i] = ops[i];
- var result = [];
- result = this.returnFilter(json,o);
- result = this.returnOrderBy(result,o.orderby,o.order);
- result = this.returnLimit(result,o.limit);
- return result;
- },
- returnFilter: function(json,jsonsql_o){
- var jsonsql_scope = eval(jsonsql_o.from);
- var jsonsql_result = [];
- var jsonsql_rc = 0;
- if(jsonsql_o.where == "")
- jsonsql_o.where = "true";
- for(var jsonsql_i in jsonsql_scope){
- with(jsonsql_scope[jsonsql_i]){
- if(eval(jsonsql_o.where)){
- jsonsql_result[jsonsql_rc++] = this.returnFields(jsonsql_scope[jsonsql_i],jsonsql_o.fields);
- }
- }
- }
- return jsonsql_result;
- },
- returnFields: function(scope,fields){
- if(fields.length == 0)
- fields = ["*"];
- if(fields[0] == "*")
- return scope;
- var returnobj = {};
- for(var i in fields)
- returnobj[fields[i]] = scope[fields[i]];
- return returnobj;
- },
- returnOrderBy: function(result,orderby,order){
- if(orderby.length == 0)
- return result;
- result.sort(function(a,b){
- switch(order.toLowerCase()){
- case "desc": return (eval('a.'+ orderby[0] +' < b.'+ orderby[0]))? 1:-1;
- case "asc": return (eval('a.'+ orderby[0] +' > b.'+ orderby[0]))? 1:-1;
- case "descnum": return (eval('a.'+ orderby[0] +' - b.'+ orderby[0]));
- case "ascnum": return (eval('b.'+ orderby[0] +' - a.'+ orderby[0]));
- }
- });
- return result;
- },
- returnLimit: function(result,limit){
- switch(limit.length){
- case 0: return result;
- case 1: return result.splice(0,limit[0]);
- case 2: return result.splice(limit[0]-1,limit[1]);
- }
- }
- };
- /***/ }),
- /* 79 */
- /***/ (function(module, exports, __webpack_require__) {
- /*jslint node:true */
- var xml2js = __webpack_require__(43);
- var xml2json = __webpack_require__(95);
- var js2xml = __webpack_require__(49);
- var json2xml = __webpack_require__(96);
- module.exports = {
- xml2js: xml2js,
- xml2json: xml2json,
- js2xml: js2xml,
- json2xml: json2xml
- };
- /***/ }),
- /* 80 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(Buffer) {;(function (sax) { // wrapper for non-node envs
- sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
- sax.SAXParser = SAXParser
- sax.SAXStream = SAXStream
- sax.createStream = createStream
- // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
- // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
- // since that's the earliest that a buffer overrun could occur. This way, checks are
- // as rare as required, but as often as necessary to ensure never crossing this bound.
- // Furthermore, buffers are only tested at most once per write(), so passing a very
- // large string into write() might have undesirable effects, but this is manageable by
- // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
- // edge case, result in creating at most one complete copy of the string passed in.
- // Set to Infinity to have unlimited buffers.
- sax.MAX_BUFFER_LENGTH = 64 * 1024
- var buffers = [
- 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
- 'procInstName', 'procInstBody', 'entity', 'attribName',
- 'attribValue', 'cdata', 'script'
- ]
- sax.EVENTS = [
- 'text',
- 'processinginstruction',
- 'sgmldeclaration',
- 'doctype',
- 'comment',
- 'opentagstart',
- 'attribute',
- 'opentag',
- 'closetag',
- 'opencdata',
- 'cdata',
- 'closecdata',
- 'error',
- 'end',
- 'ready',
- 'script',
- 'opennamespace',
- 'closenamespace'
- ]
- function SAXParser (strict, opt) {
- if (!(this instanceof SAXParser)) {
- return new SAXParser(strict, opt)
- }
- var parser = this
- clearBuffers(parser)
- parser.q = parser.c = ''
- parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
- parser.opt = opt || {}
- parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
- parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
- parser.tags = []
- parser.closed = parser.closedRoot = parser.sawRoot = false
- parser.tag = parser.error = null
- parser.strict = !!strict
- parser.noscript = !!(strict || parser.opt.noscript)
- parser.state = S.BEGIN
- parser.strictEntities = parser.opt.strictEntities
- parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
- parser.attribList = []
- // namespaces form a prototype chain.
- // it always points at the current tag,
- // which protos to its parent tag.
- if (parser.opt.xmlns) {
- parser.ns = Object.create(rootNS)
- }
- // mostly just for error reporting
- parser.trackPosition = parser.opt.position !== false
- if (parser.trackPosition) {
- parser.position = parser.line = parser.column = 0
- }
- emit(parser, 'onready')
- }
- if (!Object.create) {
- Object.create = function (o) {
- function F () {}
- F.prototype = o
- var newf = new F()
- return newf
- }
- }
- if (!Object.keys) {
- Object.keys = function (o) {
- var a = []
- for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
- return a
- }
- }
- function checkBufferLength (parser) {
- var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
- var maxActual = 0
- for (var i = 0, l = buffers.length; i < l; i++) {
- var len = parser[buffers[i]].length
- if (len > maxAllowed) {
- // Text/cdata nodes can get big, and since they're buffered,
- // we can get here under normal conditions.
- // Avoid issues by emitting the text node now,
- // so at least it won't get any bigger.
- switch (buffers[i]) {
- case 'textNode':
- closeText(parser)
- break
- case 'cdata':
- emitNode(parser, 'oncdata', parser.cdata)
- parser.cdata = ''
- break
- case 'script':
- emitNode(parser, 'onscript', parser.script)
- parser.script = ''
- break
- default:
- error(parser, 'Max buffer length exceeded: ' + buffers[i])
- }
- }
- maxActual = Math.max(maxActual, len)
- }
- // schedule the next check for the earliest possible buffer overrun.
- var m = sax.MAX_BUFFER_LENGTH - maxActual
- parser.bufferCheckPosition = m + parser.position
- }
- function clearBuffers (parser) {
- for (var i = 0, l = buffers.length; i < l; i++) {
- parser[buffers[i]] = ''
- }
- }
- function flushBuffers (parser) {
- closeText(parser)
- if (parser.cdata !== '') {
- emitNode(parser, 'oncdata', parser.cdata)
- parser.cdata = ''
- }
- if (parser.script !== '') {
- emitNode(parser, 'onscript', parser.script)
- parser.script = ''
- }
- }
- SAXParser.prototype = {
- end: function () { end(this) },
- write: write,
- resume: function () { this.error = null; return this },
- close: function () { return this.write(null) },
- flush: function () { flushBuffers(this) }
- }
- var Stream
- try {
- Stream = __webpack_require__(83).Stream
- } catch (ex) {
- Stream = function () {}
- }
- var streamWraps = sax.EVENTS.filter(function (ev) {
- return ev !== 'error' && ev !== 'end'
- })
- function createStream (strict, opt) {
- return new SAXStream(strict, opt)
- }
- function SAXStream (strict, opt) {
- if (!(this instanceof SAXStream)) {
- return new SAXStream(strict, opt)
- }
- Stream.apply(this)
- this._parser = new SAXParser(strict, opt)
- this.writable = true
- this.readable = true
- var me = this
- this._parser.onend = function () {
- me.emit('end')
- }
- this._parser.onerror = function (er) {
- me.emit('error', er)
- // if didn't throw, then means error was handled.
- // go ahead and clear error, so we can write again.
- me._parser.error = null
- }
- this._decoder = null
- streamWraps.forEach(function (ev) {
- Object.defineProperty(me, 'on' + ev, {
- get: function () {
- return me._parser['on' + ev]
- },
- set: function (h) {
- if (!h) {
- me.removeAllListeners(ev)
- me._parser['on' + ev] = h
- return h
- }
- me.on(ev, h)
- },
- enumerable: true,
- configurable: false
- })
- })
- }
- SAXStream.prototype = Object.create(Stream.prototype, {
- constructor: {
- value: SAXStream
- }
- })
- SAXStream.prototype.write = function (data) {
- if (typeof Buffer === 'function' &&
- typeof Buffer.isBuffer === 'function' &&
- Buffer.isBuffer(data)) {
- if (!this._decoder) {
- var SD = __webpack_require__(30).StringDecoder
- this._decoder = new SD('utf8')
- }
- data = this._decoder.write(data)
- }
- this._parser.write(data.toString())
- this.emit('data', data)
- return true
- }
- SAXStream.prototype.end = function (chunk) {
- if (chunk && chunk.length) {
- this.write(chunk)
- }
- this._parser.end()
- return true
- }
- SAXStream.prototype.on = function (ev, handler) {
- var me = this
- if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
- me._parser['on' + ev] = function () {
- var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
- args.splice(0, 0, ev)
- me.emit.apply(me, args)
- }
- }
- return Stream.prototype.on.call(me, ev, handler)
- }
- // this really needs to be replaced with character classes.
- // XML allows all manner of ridiculous numbers and digits.
- var CDATA = '[CDATA['
- var DOCTYPE = 'DOCTYPE'
- var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
- var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
- var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
- // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
- // This implementation works on strings, a single character at a time
- // as such, it cannot ever support astral-plane characters (10000-EFFFF)
- // without a significant breaking change to either this parser, or the
- // JavaScript language. Implementation of an emoji-capable xml parser
- // is left as an exercise for the reader.
- var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
- var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
- var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
- var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
- function isWhitespace (c) {
- return c === ' ' || c === '\n' || c === '\r' || c === '\t'
- }
- function isQuote (c) {
- return c === '"' || c === '\''
- }
- function isAttribEnd (c) {
- return c === '>' || isWhitespace(c)
- }
- function isMatch (regex, c) {
- return regex.test(c)
- }
- function notMatch (regex, c) {
- return !isMatch(regex, c)
- }
- var S = 0
- sax.STATE = {
- BEGIN: S++, // leading byte order mark or whitespace
- BEGIN_WHITESPACE: S++, // leading whitespace
- TEXT: S++, // general stuff
- TEXT_ENTITY: S++, // & and such.
- OPEN_WAKA: S++, // <
- SGML_DECL: S++, // <!BLARG
- SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
- DOCTYPE: S++, // <!DOCTYPE
- DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
- DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
- DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
- COMMENT_STARTING: S++, // <!-
- COMMENT: S++, // <!--
- COMMENT_ENDING: S++, // <!-- blah -
- COMMENT_ENDED: S++, // <!-- blah --
- CDATA: S++, // <![CDATA[ something
- CDATA_ENDING: S++, // ]
- CDATA_ENDING_2: S++, // ]]
- PROC_INST: S++, // <?hi
- PROC_INST_BODY: S++, // <?hi there
- PROC_INST_ENDING: S++, // <?hi "there" ?
- OPEN_TAG: S++, // <strong
- OPEN_TAG_SLASH: S++, // <strong /
- ATTRIB: S++, // <a
- ATTRIB_NAME: S++, // <a foo
- ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
- ATTRIB_VALUE: S++, // <a foo=
- ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
- ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
- ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
- ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="""
- ATTRIB_VALUE_ENTITY_U: S++, // <foo bar="
- CLOSE_TAG: S++, // </a
- CLOSE_TAG_SAW_WHITE: S++, // </a >
- SCRIPT: S++, // <script> ...
- SCRIPT_ENDING: S++ // <script> ... <
- }
- sax.XML_ENTITIES = {
- 'amp': '&',
- 'gt': '>',
- 'lt': '<',
- 'quot': '"',
- 'apos': "'"
- }
- sax.ENTITIES = {
- 'amp': '&',
- 'gt': '>',
- 'lt': '<',
- 'quot': '"',
- 'apos': "'",
- 'AElig': 198,
- 'Aacute': 193,
- 'Acirc': 194,
- 'Agrave': 192,
- 'Aring': 197,
- 'Atilde': 195,
- 'Auml': 196,
- 'Ccedil': 199,
- 'ETH': 208,
- 'Eacute': 201,
- 'Ecirc': 202,
- 'Egrave': 200,
- 'Euml': 203,
- 'Iacute': 205,
- 'Icirc': 206,
- 'Igrave': 204,
- 'Iuml': 207,
- 'Ntilde': 209,
- 'Oacute': 211,
- 'Ocirc': 212,
- 'Ograve': 210,
- 'Oslash': 216,
- 'Otilde': 213,
- 'Ouml': 214,
- 'THORN': 222,
- 'Uacute': 218,
- 'Ucirc': 219,
- 'Ugrave': 217,
- 'Uuml': 220,
- 'Yacute': 221,
- 'aacute': 225,
- 'acirc': 226,
- 'aelig': 230,
- 'agrave': 224,
- 'aring': 229,
- 'atilde': 227,
- 'auml': 228,
- 'ccedil': 231,
- 'eacute': 233,
- 'ecirc': 234,
- 'egrave': 232,
- 'eth': 240,
- 'euml': 235,
- 'iacute': 237,
- 'icirc': 238,
- 'igrave': 236,
- 'iuml': 239,
- 'ntilde': 241,
- 'oacute': 243,
- 'ocirc': 244,
- 'ograve': 242,
- 'oslash': 248,
- 'otilde': 245,
- 'ouml': 246,
- 'szlig': 223,
- 'thorn': 254,
- 'uacute': 250,
- 'ucirc': 251,
- 'ugrave': 249,
- 'uuml': 252,
- 'yacute': 253,
- 'yuml': 255,
- 'copy': 169,
- 'reg': 174,
- 'nbsp': 160,
- 'iexcl': 161,
- 'cent': 162,
- 'pound': 163,
- 'curren': 164,
- 'yen': 165,
- 'brvbar': 166,
- 'sect': 167,
- 'uml': 168,
- 'ordf': 170,
- 'laquo': 171,
- 'not': 172,
- 'shy': 173,
- 'macr': 175,
- 'deg': 176,
- 'plusmn': 177,
- 'sup1': 185,
- 'sup2': 178,
- 'sup3': 179,
- 'acute': 180,
- 'micro': 181,
- 'para': 182,
- 'middot': 183,
- 'cedil': 184,
- 'ordm': 186,
- 'raquo': 187,
- 'frac14': 188,
- 'frac12': 189,
- 'frac34': 190,
- 'iquest': 191,
- 'times': 215,
- 'divide': 247,
- 'OElig': 338,
- 'oelig': 339,
- 'Scaron': 352,
- 'scaron': 353,
- 'Yuml': 376,
- 'fnof': 402,
- 'circ': 710,
- 'tilde': 732,
- 'Alpha': 913,
- 'Beta': 914,
- 'Gamma': 915,
- 'Delta': 916,
- 'Epsilon': 917,
- 'Zeta': 918,
- 'Eta': 919,
- 'Theta': 920,
- 'Iota': 921,
- 'Kappa': 922,
- 'Lambda': 923,
- 'Mu': 924,
- 'Nu': 925,
- 'Xi': 926,
- 'Omicron': 927,
- 'Pi': 928,
- 'Rho': 929,
- 'Sigma': 931,
- 'Tau': 932,
- 'Upsilon': 933,
- 'Phi': 934,
- 'Chi': 935,
- 'Psi': 936,
- 'Omega': 937,
- 'alpha': 945,
- 'beta': 946,
- 'gamma': 947,
- 'delta': 948,
- 'epsilon': 949,
- 'zeta': 950,
- 'eta': 951,
- 'theta': 952,
- 'iota': 953,
- 'kappa': 954,
- 'lambda': 955,
- 'mu': 956,
- 'nu': 957,
- 'xi': 958,
- 'omicron': 959,
- 'pi': 960,
- 'rho': 961,
- 'sigmaf': 962,
- 'sigma': 963,
- 'tau': 964,
- 'upsilon': 965,
- 'phi': 966,
- 'chi': 967,
- 'psi': 968,
- 'omega': 969,
- 'thetasym': 977,
- 'upsih': 978,
- 'piv': 982,
- 'ensp': 8194,
- 'emsp': 8195,
- 'thinsp': 8201,
- 'zwnj': 8204,
- 'zwj': 8205,
- 'lrm': 8206,
- 'rlm': 8207,
- 'ndash': 8211,
- 'mdash': 8212,
- 'lsquo': 8216,
- 'rsquo': 8217,
- 'sbquo': 8218,
- 'ldquo': 8220,
- 'rdquo': 8221,
- 'bdquo': 8222,
- 'dagger': 8224,
- 'Dagger': 8225,
- 'bull': 8226,
- 'hellip': 8230,
- 'permil': 8240,
- 'prime': 8242,
- 'Prime': 8243,
- 'lsaquo': 8249,
- 'rsaquo': 8250,
- 'oline': 8254,
- 'frasl': 8260,
- 'euro': 8364,
- 'image': 8465,
- 'weierp': 8472,
- 'real': 8476,
- 'trade': 8482,
- 'alefsym': 8501,
- 'larr': 8592,
- 'uarr': 8593,
- 'rarr': 8594,
- 'darr': 8595,
- 'harr': 8596,
- 'crarr': 8629,
- 'lArr': 8656,
- 'uArr': 8657,
- 'rArr': 8658,
- 'dArr': 8659,
- 'hArr': 8660,
- 'forall': 8704,
- 'part': 8706,
- 'exist': 8707,
- 'empty': 8709,
- 'nabla': 8711,
- 'isin': 8712,
- 'notin': 8713,
- 'ni': 8715,
- 'prod': 8719,
- 'sum': 8721,
- 'minus': 8722,
- 'lowast': 8727,
- 'radic': 8730,
- 'prop': 8733,
- 'infin': 8734,
- 'ang': 8736,
- 'and': 8743,
- 'or': 8744,
- 'cap': 8745,
- 'cup': 8746,
- 'int': 8747,
- 'there4': 8756,
- 'sim': 8764,
- 'cong': 8773,
- 'asymp': 8776,
- 'ne': 8800,
- 'equiv': 8801,
- 'le': 8804,
- 'ge': 8805,
- 'sub': 8834,
- 'sup': 8835,
- 'nsub': 8836,
- 'sube': 8838,
- 'supe': 8839,
- 'oplus': 8853,
- 'otimes': 8855,
- 'perp': 8869,
- 'sdot': 8901,
- 'lceil': 8968,
- 'rceil': 8969,
- 'lfloor': 8970,
- 'rfloor': 8971,
- 'lang': 9001,
- 'rang': 9002,
- 'loz': 9674,
- 'spades': 9824,
- 'clubs': 9827,
- 'hearts': 9829,
- 'diams': 9830
- }
- Object.keys(sax.ENTITIES).forEach(function (key) {
- var e = sax.ENTITIES[key]
- var s = typeof e === 'number' ? String.fromCharCode(e) : e
- sax.ENTITIES[key] = s
- })
- for (var s in sax.STATE) {
- sax.STATE[sax.STATE[s]] = s
- }
- // shorthand
- S = sax.STATE
- function emit (parser, event, data) {
- parser[event] && parser[event](data)
- }
- function emitNode (parser, nodeType, data) {
- if (parser.textNode) closeText(parser)
- emit(parser, nodeType, data)
- }
- function closeText (parser) {
- parser.textNode = textopts(parser.opt, parser.textNode)
- if (parser.textNode) emit(parser, 'ontext', parser.textNode)
- parser.textNode = ''
- }
- function textopts (opt, text) {
- if (opt.trim) text = text.trim()
- if (opt.normalize) text = text.replace(/\s+/g, ' ')
- return text
- }
- function error (parser, er) {
- closeText(parser)
- if (parser.trackPosition) {
- er += '\nLine: ' + parser.line +
- '\nColumn: ' + parser.column +
- '\nChar: ' + parser.c
- }
- er = new Error(er)
- parser.error = er
- emit(parser, 'onerror', er)
- return parser
- }
- function end (parser) {
- if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
- if ((parser.state !== S.BEGIN) &&
- (parser.state !== S.BEGIN_WHITESPACE) &&
- (parser.state !== S.TEXT)) {
- error(parser, 'Unexpected end')
- }
- closeText(parser)
- parser.c = ''
- parser.closed = true
- emit(parser, 'onend')
- SAXParser.call(parser, parser.strict, parser.opt)
- return parser
- }
- function strictFail (parser, message) {
- if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
- throw new Error('bad call to strictFail')
- }
- if (parser.strict) {
- error(parser, message)
- }
- }
- function newTag (parser) {
- if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
- var parent = parser.tags[parser.tags.length - 1] || parser
- var tag = parser.tag = { name: parser.tagName, attributes: {} }
- // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
- if (parser.opt.xmlns) {
- tag.ns = parent.ns
- }
- parser.attribList.length = 0
- emitNode(parser, 'onopentagstart', tag)
- }
- function qname (name, attribute) {
- var i = name.indexOf(':')
- var qualName = i < 0 ? [ '', name ] : name.split(':')
- var prefix = qualName[0]
- var local = qualName[1]
- // <x "xmlns"="http://foo">
- if (attribute && name === 'xmlns') {
- prefix = 'xmlns'
- local = ''
- }
- return { prefix: prefix, local: local }
- }
- function attrib (parser) {
- if (!parser.strict) {
- parser.attribName = parser.attribName[parser.looseCase]()
- }
- if (parser.attribList.indexOf(parser.attribName) !== -1 ||
- parser.tag.attributes.hasOwnProperty(parser.attribName)) {
- parser.attribName = parser.attribValue = ''
- return
- }
- if (parser.opt.xmlns) {
- var qn = qname(parser.attribName, true)
- var prefix = qn.prefix
- var local = qn.local
- if (prefix === 'xmlns') {
- // namespace binding attribute. push the binding into scope
- if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
- strictFail(parser,
- 'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
- 'Actual: ' + parser.attribValue)
- } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
- strictFail(parser,
- 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
- 'Actual: ' + parser.attribValue)
- } else {
- var tag = parser.tag
- var parent = parser.tags[parser.tags.length - 1] || parser
- if (tag.ns === parent.ns) {
- tag.ns = Object.create(parent.ns)
- }
- tag.ns[local] = parser.attribValue
- }
- }
- // defer onattribute events until all attributes have been seen
- // so any new bindings can take effect. preserve attribute order
- // so deferred events can be emitted in document order
- parser.attribList.push([parser.attribName, parser.attribValue])
- } else {
- // in non-xmlns mode, we can emit the event right away
- parser.tag.attributes[parser.attribName] = parser.attribValue
- emitNode(parser, 'onattribute', {
- name: parser.attribName,
- value: parser.attribValue
- })
- }
- parser.attribName = parser.attribValue = ''
- }
- function openTag (parser, selfClosing) {
- if (parser.opt.xmlns) {
- // emit namespace binding events
- var tag = parser.tag
- // add namespace info to tag
- var qn = qname(parser.tagName)
- tag.prefix = qn.prefix
- tag.local = qn.local
- tag.uri = tag.ns[qn.prefix] || ''
- if (tag.prefix && !tag.uri) {
- strictFail(parser, 'Unbound namespace prefix: ' +
- JSON.stringify(parser.tagName))
- tag.uri = qn.prefix
- }
- var parent = parser.tags[parser.tags.length - 1] || parser
- if (tag.ns && parent.ns !== tag.ns) {
- Object.keys(tag.ns).forEach(function (p) {
- emitNode(parser, 'onopennamespace', {
- prefix: p,
- uri: tag.ns[p]
- })
- })
- }
- // handle deferred onattribute events
- // Note: do not apply default ns to attributes:
- // http://www.w3.org/TR/REC-xml-names/#defaulting
- for (var i = 0, l = parser.attribList.length; i < l; i++) {
- var nv = parser.attribList[i]
- var name = nv[0]
- var value = nv[1]
- var qualName = qname(name, true)
- var prefix = qualName.prefix
- var local = qualName.local
- var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
- var a = {
- name: name,
- value: value,
- prefix: prefix,
- local: local,
- uri: uri
- }
- // if there's any attributes with an undefined namespace,
- // then fail on them now.
- if (prefix && prefix !== 'xmlns' && !uri) {
- strictFail(parser, 'Unbound namespace prefix: ' +
- JSON.stringify(prefix))
- a.uri = prefix
- }
- parser.tag.attributes[name] = a
- emitNode(parser, 'onattribute', a)
- }
- parser.attribList.length = 0
- }
- parser.tag.isSelfClosing = !!selfClosing
- // process the tag
- parser.sawRoot = true
- parser.tags.push(parser.tag)
- emitNode(parser, 'onopentag', parser.tag)
- if (!selfClosing) {
- // special case for <script> in non-strict mode.
- if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
- parser.state = S.SCRIPT
- } else {
- parser.state = S.TEXT
- }
- parser.tag = null
- parser.tagName = ''
- }
- parser.attribName = parser.attribValue = ''
- parser.attribList.length = 0
- }
- function closeTag (parser) {
- if (!parser.tagName) {
- strictFail(parser, 'Weird empty close tag.')
- parser.textNode += '</>'
- parser.state = S.TEXT
- return
- }
- if (parser.script) {
- if (parser.tagName !== 'script') {
- parser.script += '</' + parser.tagName + '>'
- parser.tagName = ''
- parser.state = S.SCRIPT
- return
- }
- emitNode(parser, 'onscript', parser.script)
- parser.script = ''
- }
- // first make sure that the closing tag actually exists.
- // <a><b></c></b></a> will close everything, otherwise.
- var t = parser.tags.length
- var tagName = parser.tagName
- if (!parser.strict) {
- tagName = tagName[parser.looseCase]()
- }
- var closeTo = tagName
- while (t--) {
- var close = parser.tags[t]
- if (close.name !== closeTo) {
- // fail the first time in strict mode
- strictFail(parser, 'Unexpected close tag')
- } else {
- break
- }
- }
- // didn't find it. we already failed for strict, so just abort.
- if (t < 0) {
- strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
- parser.textNode += '</' + parser.tagName + '>'
- parser.state = S.TEXT
- return
- }
- parser.tagName = tagName
- var s = parser.tags.length
- while (s-- > t) {
- var tag = parser.tag = parser.tags.pop()
- parser.tagName = parser.tag.name
- emitNode(parser, 'onclosetag', parser.tagName)
- var x = {}
- for (var i in tag.ns) {
- x[i] = tag.ns[i]
- }
- var parent = parser.tags[parser.tags.length - 1] || parser
- if (parser.opt.xmlns && tag.ns !== parent.ns) {
- // remove namespace bindings introduced by tag
- Object.keys(tag.ns).forEach(function (p) {
- var n = tag.ns[p]
- emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
- })
- }
- }
- if (t === 0) parser.closedRoot = true
- parser.tagName = parser.attribValue = parser.attribName = ''
- parser.attribList.length = 0
- parser.state = S.TEXT
- }
- function parseEntity (parser) {
- var entity = parser.entity
- var entityLC = entity.toLowerCase()
- var num
- var numStr = ''
- if (parser.ENTITIES[entity]) {
- return parser.ENTITIES[entity]
- }
- if (parser.ENTITIES[entityLC]) {
- return parser.ENTITIES[entityLC]
- }
- entity = entityLC
- if (entity.charAt(0) === '#') {
- if (entity.charAt(1) === 'x') {
- entity = entity.slice(2)
- num = parseInt(entity, 16)
- numStr = num.toString(16)
- } else {
- entity = entity.slice(1)
- num = parseInt(entity, 10)
- numStr = num.toString(10)
- }
- }
- entity = entity.replace(/^0+/, '')
- if (isNaN(num) || numStr.toLowerCase() !== entity) {
- strictFail(parser, 'Invalid character entity')
- return '&' + parser.entity + ';'
- }
- return String.fromCodePoint(num)
- }
- function beginWhiteSpace (parser, c) {
- if (c === '<') {
- parser.state = S.OPEN_WAKA
- parser.startTagPosition = parser.position
- } else if (!isWhitespace(c)) {
- // have to process this as a text node.
- // weird, but happens.
- strictFail(parser, 'Non-whitespace before first tag.')
- parser.textNode = c
- parser.state = S.TEXT
- }
- }
- function charAt (chunk, i) {
- var result = ''
- if (i < chunk.length) {
- result = chunk.charAt(i)
- }
- return result
- }
- function write (chunk) {
- var parser = this
- if (this.error) {
- throw this.error
- }
- if (parser.closed) {
- return error(parser,
- 'Cannot write after close. Assign an onready handler.')
- }
- if (chunk === null) {
- return end(parser)
- }
- if (typeof chunk === 'object') {
- chunk = chunk.toString()
- }
- var i = 0
- var c = ''
- while (true) {
- c = charAt(chunk, i++)
- parser.c = c
- if (!c) {
- break
- }
- if (parser.trackPosition) {
- parser.position++
- if (c === '\n') {
- parser.line++
- parser.column = 0
- } else {
- parser.column++
- }
- }
- switch (parser.state) {
- case S.BEGIN:
- parser.state = S.BEGIN_WHITESPACE
- if (c === '\uFEFF') {
- continue
- }
- beginWhiteSpace(parser, c)
- continue
- case S.BEGIN_WHITESPACE:
- beginWhiteSpace(parser, c)
- continue
- case S.TEXT:
- if (parser.sawRoot && !parser.closedRoot) {
- var starti = i - 1
- while (c && c !== '<' && c !== '&') {
- c = charAt(chunk, i++)
- if (c && parser.trackPosition) {
- parser.position++
- if (c === '\n') {
- parser.line++
- parser.column = 0
- } else {
- parser.column++
- }
- }
- }
- parser.textNode += chunk.substring(starti, i - 1)
- }
- if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
- parser.state = S.OPEN_WAKA
- parser.startTagPosition = parser.position
- } else {
- if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
- strictFail(parser, 'Text data outside of root node.')
- }
- if (c === '&') {
- parser.state = S.TEXT_ENTITY
- } else {
- parser.textNode += c
- }
- }
- continue
- case S.SCRIPT:
- // only non-strict
- if (c === '<') {
- parser.state = S.SCRIPT_ENDING
- } else {
- parser.script += c
- }
- continue
- case S.SCRIPT_ENDING:
- if (c === '/') {
- parser.state = S.CLOSE_TAG
- } else {
- parser.script += '<' + c
- parser.state = S.SCRIPT
- }
- continue
- case S.OPEN_WAKA:
- // either a /, ?, !, or text is coming next.
- if (c === '!') {
- parser.state = S.SGML_DECL
- parser.sgmlDecl = ''
- } else if (isWhitespace(c)) {
- // wait for it...
- } else if (isMatch(nameStart, c)) {
- parser.state = S.OPEN_TAG
- parser.tagName = c
- } else if (c === '/') {
- parser.state = S.CLOSE_TAG
- parser.tagName = ''
- } else if (c === '?') {
- parser.state = S.PROC_INST
- parser.procInstName = parser.procInstBody = ''
- } else {
- strictFail(parser, 'Unencoded <')
- // if there was some whitespace, then add that in.
- if (parser.startTagPosition + 1 < parser.position) {
- var pad = parser.position - parser.startTagPosition
- c = new Array(pad).join(' ') + c
- }
- parser.textNode += '<' + c
- parser.state = S.TEXT
- }
- continue
- case S.SGML_DECL:
- if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
- emitNode(parser, 'onopencdata')
- parser.state = S.CDATA
- parser.sgmlDecl = ''
- parser.cdata = ''
- } else if (parser.sgmlDecl + c === '--') {
- parser.state = S.COMMENT
- parser.comment = ''
- parser.sgmlDecl = ''
- } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
- parser.state = S.DOCTYPE
- if (parser.doctype || parser.sawRoot) {
- strictFail(parser,
- 'Inappropriately located doctype declaration')
- }
- parser.doctype = ''
- parser.sgmlDecl = ''
- } else if (c === '>') {
- emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
- parser.sgmlDecl = ''
- parser.state = S.TEXT
- } else if (isQuote(c)) {
- parser.state = S.SGML_DECL_QUOTED
- parser.sgmlDecl += c
- } else {
- parser.sgmlDecl += c
- }
- continue
- case S.SGML_DECL_QUOTED:
- if (c === parser.q) {
- parser.state = S.SGML_DECL
- parser.q = ''
- }
- parser.sgmlDecl += c
- continue
- case S.DOCTYPE:
- if (c === '>') {
- parser.state = S.TEXT
- emitNode(parser, 'ondoctype', parser.doctype)
- parser.doctype = true // just remember that we saw it.
- } else {
- parser.doctype += c
- if (c === '[') {
- parser.state = S.DOCTYPE_DTD
- } else if (isQuote(c)) {
- parser.state = S.DOCTYPE_QUOTED
- parser.q = c
- }
- }
- continue
- case S.DOCTYPE_QUOTED:
- parser.doctype += c
- if (c === parser.q) {
- parser.q = ''
- parser.state = S.DOCTYPE
- }
- continue
- case S.DOCTYPE_DTD:
- parser.doctype += c
- if (c === ']') {
- parser.state = S.DOCTYPE
- } else if (isQuote(c)) {
- parser.state = S.DOCTYPE_DTD_QUOTED
- parser.q = c
- }
- continue
- case S.DOCTYPE_DTD_QUOTED:
- parser.doctype += c
- if (c === parser.q) {
- parser.state = S.DOCTYPE_DTD
- parser.q = ''
- }
- continue
- case S.COMMENT:
- if (c === '-') {
- parser.state = S.COMMENT_ENDING
- } else {
- parser.comment += c
- }
- continue
- case S.COMMENT_ENDING:
- if (c === '-') {
- parser.state = S.COMMENT_ENDED
- parser.comment = textopts(parser.opt, parser.comment)
- if (parser.comment) {
- emitNode(parser, 'oncomment', parser.comment)
- }
- parser.comment = ''
- } else {
- parser.comment += '-' + c
- parser.state = S.COMMENT
- }
- continue
- case S.COMMENT_ENDED:
- if (c !== '>') {
- strictFail(parser, 'Malformed comment')
- // allow <!-- blah -- bloo --> in non-strict mode,
- // which is a comment of " blah -- bloo "
- parser.comment += '--' + c
- parser.state = S.COMMENT
- } else {
- parser.state = S.TEXT
- }
- continue
- case S.CDATA:
- if (c === ']') {
- parser.state = S.CDATA_ENDING
- } else {
- parser.cdata += c
- }
- continue
- case S.CDATA_ENDING:
- if (c === ']') {
- parser.state = S.CDATA_ENDING_2
- } else {
- parser.cdata += ']' + c
- parser.state = S.CDATA
- }
- continue
- case S.CDATA_ENDING_2:
- if (c === '>') {
- if (parser.cdata) {
- emitNode(parser, 'oncdata', parser.cdata)
- }
- emitNode(parser, 'onclosecdata')
- parser.cdata = ''
- parser.state = S.TEXT
- } else if (c === ']') {
- parser.cdata += ']'
- } else {
- parser.cdata += ']]' + c
- parser.state = S.CDATA
- }
- continue
- case S.PROC_INST:
- if (c === '?') {
- parser.state = S.PROC_INST_ENDING
- } else if (isWhitespace(c)) {
- parser.state = S.PROC_INST_BODY
- } else {
- parser.procInstName += c
- }
- continue
- case S.PROC_INST_BODY:
- if (!parser.procInstBody && isWhitespace(c)) {
- continue
- } else if (c === '?') {
- parser.state = S.PROC_INST_ENDING
- } else {
- parser.procInstBody += c
- }
- continue
- case S.PROC_INST_ENDING:
- if (c === '>') {
- emitNode(parser, 'onprocessinginstruction', {
- name: parser.procInstName,
- body: parser.procInstBody
- })
- parser.procInstName = parser.procInstBody = ''
- parser.state = S.TEXT
- } else {
- parser.procInstBody += '?' + c
- parser.state = S.PROC_INST_BODY
- }
- continue
- case S.OPEN_TAG:
- if (isMatch(nameBody, c)) {
- parser.tagName += c
- } else {
- newTag(parser)
- if (c === '>') {
- openTag(parser)
- } else if (c === '/') {
- parser.state = S.OPEN_TAG_SLASH
- } else {
- if (!isWhitespace(c)) {
- strictFail(parser, 'Invalid character in tag name')
- }
- parser.state = S.ATTRIB
- }
- }
- continue
- case S.OPEN_TAG_SLASH:
- if (c === '>') {
- openTag(parser, true)
- closeTag(parser)
- } else {
- strictFail(parser, 'Forward-slash in opening tag not followed by >')
- parser.state = S.ATTRIB
- }
- continue
- case S.ATTRIB:
- // haven't read the attribute name yet.
- if (isWhitespace(c)) {
- continue
- } else if (c === '>') {
- openTag(parser)
- } else if (c === '/') {
- parser.state = S.OPEN_TAG_SLASH
- } else if (isMatch(nameStart, c)) {
- parser.attribName = c
- parser.attribValue = ''
- parser.state = S.ATTRIB_NAME
- } else {
- strictFail(parser, 'Invalid attribute name')
- }
- continue
- case S.ATTRIB_NAME:
- if (c === '=') {
- parser.state = S.ATTRIB_VALUE
- } else if (c === '>') {
- strictFail(parser, 'Attribute without value')
- parser.attribValue = parser.attribName
- attrib(parser)
- openTag(parser)
- } else if (isWhitespace(c)) {
- parser.state = S.ATTRIB_NAME_SAW_WHITE
- } else if (isMatch(nameBody, c)) {
- parser.attribName += c
- } else {
- strictFail(parser, 'Invalid attribute name')
- }
- continue
- case S.ATTRIB_NAME_SAW_WHITE:
- if (c === '=') {
- parser.state = S.ATTRIB_VALUE
- } else if (isWhitespace(c)) {
- continue
- } else {
- strictFail(parser, 'Attribute without value')
- parser.tag.attributes[parser.attribName] = ''
- parser.attribValue = ''
- emitNode(parser, 'onattribute', {
- name: parser.attribName,
- value: ''
- })
- parser.attribName = ''
- if (c === '>') {
- openTag(parser)
- } else if (isMatch(nameStart, c)) {
- parser.attribName = c
- parser.state = S.ATTRIB_NAME
- } else {
- strictFail(parser, 'Invalid attribute name')
- parser.state = S.ATTRIB
- }
- }
- continue
- case S.ATTRIB_VALUE:
- if (isWhitespace(c)) {
- continue
- } else if (isQuote(c)) {
- parser.q = c
- parser.state = S.ATTRIB_VALUE_QUOTED
- } else {
- strictFail(parser, 'Unquoted attribute value')
- parser.state = S.ATTRIB_VALUE_UNQUOTED
- parser.attribValue = c
- }
- continue
- case S.ATTRIB_VALUE_QUOTED:
- if (c !== parser.q) {
- if (c === '&') {
- parser.state = S.ATTRIB_VALUE_ENTITY_Q
- } else {
- parser.attribValue += c
- }
- continue
- }
- attrib(parser)
- parser.q = ''
- parser.state = S.ATTRIB_VALUE_CLOSED
- continue
- case S.ATTRIB_VALUE_CLOSED:
- if (isWhitespace(c)) {
- parser.state = S.ATTRIB
- } else if (c === '>') {
- openTag(parser)
- } else if (c === '/') {
- parser.state = S.OPEN_TAG_SLASH
- } else if (isMatch(nameStart, c)) {
- strictFail(parser, 'No whitespace between attributes')
- parser.attribName = c
- parser.attribValue = ''
- parser.state = S.ATTRIB_NAME
- } else {
- strictFail(parser, 'Invalid attribute name')
- }
- continue
- case S.ATTRIB_VALUE_UNQUOTED:
- if (!isAttribEnd(c)) {
- if (c === '&') {
- parser.state = S.ATTRIB_VALUE_ENTITY_U
- } else {
- parser.attribValue += c
- }
- continue
- }
- attrib(parser)
- if (c === '>') {
- openTag(parser)
- } else {
- parser.state = S.ATTRIB
- }
- continue
- case S.CLOSE_TAG:
- if (!parser.tagName) {
- if (isWhitespace(c)) {
- continue
- } else if (notMatch(nameStart, c)) {
- if (parser.script) {
- parser.script += '</' + c
- parser.state = S.SCRIPT
- } else {
- strictFail(parser, 'Invalid tagname in closing tag.')
- }
- } else {
- parser.tagName = c
- }
- } else if (c === '>') {
- closeTag(parser)
- } else if (isMatch(nameBody, c)) {
- parser.tagName += c
- } else if (parser.script) {
- parser.script += '</' + parser.tagName
- parser.tagName = ''
- parser.state = S.SCRIPT
- } else {
- if (!isWhitespace(c)) {
- strictFail(parser, 'Invalid tagname in closing tag')
- }
- parser.state = S.CLOSE_TAG_SAW_WHITE
- }
- continue
- case S.CLOSE_TAG_SAW_WHITE:
- if (isWhitespace(c)) {
- continue
- }
- if (c === '>') {
- closeTag(parser)
- } else {
- strictFail(parser, 'Invalid characters in closing tag')
- }
- continue
- case S.TEXT_ENTITY:
- case S.ATTRIB_VALUE_ENTITY_Q:
- case S.ATTRIB_VALUE_ENTITY_U:
- var returnState
- var buffer
- switch (parser.state) {
- case S.TEXT_ENTITY:
- returnState = S.TEXT
- buffer = 'textNode'
- break
- case S.ATTRIB_VALUE_ENTITY_Q:
- returnState = S.ATTRIB_VALUE_QUOTED
- buffer = 'attribValue'
- break
- case S.ATTRIB_VALUE_ENTITY_U:
- returnState = S.ATTRIB_VALUE_UNQUOTED
- buffer = 'attribValue'
- break
- }
- if (c === ';') {
- parser[buffer] += parseEntity(parser)
- parser.entity = ''
- parser.state = returnState
- } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
- parser.entity += c
- } else {
- strictFail(parser, 'Invalid character in entity name')
- parser[buffer] += '&' + parser.entity + c
- parser.entity = ''
- parser.state = returnState
- }
- continue
- default:
- throw new Error(parser, 'Unknown state: ' + parser.state)
- }
- } // while
- if (parser.position >= parser.bufferCheckPosition) {
- checkBufferLength(parser)
- }
- return parser
- }
- /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
- /* istanbul ignore next */
- if (!String.fromCodePoint) {
- (function () {
- var stringFromCharCode = String.fromCharCode
- var floor = Math.floor
- var fromCodePoint = function () {
- var MAX_SIZE = 0x4000
- var codeUnits = []
- var highSurrogate
- var lowSurrogate
- var index = -1
- var length = arguments.length
- if (!length) {
- return ''
- }
- var result = ''
- while (++index < length) {
- var codePoint = Number(arguments[index])
- if (
- !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
- codePoint < 0 || // not a valid Unicode code point
- codePoint > 0x10FFFF || // not a valid Unicode code point
- floor(codePoint) !== codePoint // not an integer
- ) {
- throw RangeError('Invalid code point: ' + codePoint)
- }
- if (codePoint <= 0xFFFF) { // BMP code point
- codeUnits.push(codePoint)
- } else { // Astral code point; split in surrogate halves
- // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
- codePoint -= 0x10000
- highSurrogate = (codePoint >> 10) + 0xD800
- lowSurrogate = (codePoint % 0x400) + 0xDC00
- codeUnits.push(highSurrogate, lowSurrogate)
- }
- if (index + 1 === length || codeUnits.length > MAX_SIZE) {
- result += stringFromCharCode.apply(null, codeUnits)
- codeUnits.length = 0
- }
- }
- return result
- }
- /* istanbul ignore next */
- if (Object.defineProperty) {
- Object.defineProperty(String, 'fromCodePoint', {
- value: fromCodePoint,
- configurable: true,
- writable: true
- })
- } else {
- String.fromCodePoint = fromCodePoint
- }
- }())
- }
- })( false ? undefined : exports)
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(22).Buffer))
- /***/ }),
- /* 81 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- exports.byteLength = byteLength
- exports.toByteArray = toByteArray
- exports.fromByteArray = fromByteArray
- var lookup = []
- var revLookup = []
- var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
- var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
- for (var i = 0, len = code.length; i < len; ++i) {
- lookup[i] = code[i]
- revLookup[code.charCodeAt(i)] = i
- }
- // Support decoding URL-safe base64 strings, as Node.js does.
- // See: https://en.wikipedia.org/wiki/Base64#URL_applications
- revLookup['-'.charCodeAt(0)] = 62
- revLookup['_'.charCodeAt(0)] = 63
- function getLens (b64) {
- var len = b64.length
- if (len % 4 > 0) {
- throw new Error('Invalid string. Length must be a multiple of 4')
- }
- // Trim off extra bytes after placeholder bytes are found
- // See: https://github.com/beatgammit/base64-js/issues/42
- var validLen = b64.indexOf('=')
- if (validLen === -1) validLen = len
- var placeHoldersLen = validLen === len
- ? 0
- : 4 - (validLen % 4)
- return [validLen, placeHoldersLen]
- }
- // base64 is 4/3 + up to two characters of the original data
- function byteLength (b64) {
- var lens = getLens(b64)
- var validLen = lens[0]
- var placeHoldersLen = lens[1]
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
- }
- function _byteLength (b64, validLen, placeHoldersLen) {
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
- }
- function toByteArray (b64) {
- var tmp
- var lens = getLens(b64)
- var validLen = lens[0]
- var placeHoldersLen = lens[1]
- var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
- var curByte = 0
- // if there are placeholders, only get up to the last complete 4 chars
- var len = placeHoldersLen > 0
- ? validLen - 4
- : validLen
- var i
- for (i = 0; i < len; i += 4) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 18) |
- (revLookup[b64.charCodeAt(i + 1)] << 12) |
- (revLookup[b64.charCodeAt(i + 2)] << 6) |
- revLookup[b64.charCodeAt(i + 3)]
- arr[curByte++] = (tmp >> 16) & 0xFF
- arr[curByte++] = (tmp >> 8) & 0xFF
- arr[curByte++] = tmp & 0xFF
- }
- if (placeHoldersLen === 2) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 2) |
- (revLookup[b64.charCodeAt(i + 1)] >> 4)
- arr[curByte++] = tmp & 0xFF
- }
- if (placeHoldersLen === 1) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 10) |
- (revLookup[b64.charCodeAt(i + 1)] << 4) |
- (revLookup[b64.charCodeAt(i + 2)] >> 2)
- arr[curByte++] = (tmp >> 8) & 0xFF
- arr[curByte++] = tmp & 0xFF
- }
- return arr
- }
- function tripletToBase64 (num) {
- return lookup[num >> 18 & 0x3F] +
- lookup[num >> 12 & 0x3F] +
- lookup[num >> 6 & 0x3F] +
- lookup[num & 0x3F]
- }
- function encodeChunk (uint8, start, end) {
- var tmp
- var output = []
- for (var i = start; i < end; i += 3) {
- tmp =
- ((uint8[i] << 16) & 0xFF0000) +
- ((uint8[i + 1] << 8) & 0xFF00) +
- (uint8[i + 2] & 0xFF)
- output.push(tripletToBase64(tmp))
- }
- return output.join('')
- }
- function fromByteArray (uint8) {
- var tmp
- var len = uint8.length
- var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
- var parts = []
- var maxChunkLength = 16383 // must be multiple of 3
- // go through the array every three bytes, we'll deal with trailing stuff later
- for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
- parts.push(encodeChunk(
- uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
- ))
- }
- // pad the end with zeros, but make sure to not forget the extra bytes
- if (extraBytes === 1) {
- tmp = uint8[len - 1]
- parts.push(
- lookup[tmp >> 2] +
- lookup[(tmp << 4) & 0x3F] +
- '=='
- )
- } else if (extraBytes === 2) {
- tmp = (uint8[len - 2] << 8) + uint8[len - 1]
- parts.push(
- lookup[tmp >> 10] +
- lookup[(tmp >> 4) & 0x3F] +
- lookup[(tmp << 2) & 0x3F] +
- '='
- )
- }
- return parts.join('')
- }
- /***/ }),
- /* 82 */
- /***/ (function(module, exports) {
- exports.read = function (buffer, offset, isLE, mLen, nBytes) {
- var e, m
- var eLen = (nBytes * 8) - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var nBits = -7
- var i = isLE ? (nBytes - 1) : 0
- var d = isLE ? -1 : 1
- var s = buffer[offset + i]
- i += d
- e = s & ((1 << (-nBits)) - 1)
- s >>= (-nBits)
- nBits += eLen
- for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
- m = e & ((1 << (-nBits)) - 1)
- e >>= (-nBits)
- nBits += mLen
- for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
- if (e === 0) {
- e = 1 - eBias
- } else if (e === eMax) {
- return m ? NaN : ((s ? -1 : 1) * Infinity)
- } else {
- m = m + Math.pow(2, mLen)
- e = e - eBias
- }
- return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
- }
- exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
- var e, m, c
- var eLen = (nBytes * 8) - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
- var i = isLE ? 0 : (nBytes - 1)
- var d = isLE ? 1 : -1
- var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
- value = Math.abs(value)
- if (isNaN(value) || value === Infinity) {
- m = isNaN(value) ? 1 : 0
- e = eMax
- } else {
- e = Math.floor(Math.log(value) / Math.LN2)
- if (value * (c = Math.pow(2, -e)) < 1) {
- e--
- c *= 2
- }
- if (e + eBias >= 1) {
- value += rt / c
- } else {
- value += rt * Math.pow(2, 1 - eBias)
- }
- if (value * c >= 2) {
- e++
- c /= 2
- }
- if (e + eBias >= eMax) {
- m = 0
- e = eMax
- } else if (e + eBias >= 1) {
- m = ((value * c) - 1) * Math.pow(2, mLen)
- e = e + eBias
- } else {
- m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
- e = 0
- }
- }
- for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
- e = (e << mLen) | m
- eLen += mLen
- for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
- buffer[offset + i - d] |= s * 128
- }
- /***/ }),
- /* 83 */
- /***/ (function(module, exports, __webpack_require__) {
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- module.exports = Stream;
- var EE = __webpack_require__(20).EventEmitter;
- var inherits = __webpack_require__(16);
- inherits(Stream, EE);
- Stream.Readable = __webpack_require__(28);
- Stream.Writable = __webpack_require__(91);
- Stream.Duplex = __webpack_require__(92);
- Stream.Transform = __webpack_require__(93);
- Stream.PassThrough = __webpack_require__(94);
- // Backwards-compat with node 0.4.x
- Stream.Stream = Stream;
- // old-style streams. Note that the pipe method (the only relevant
- // part of this class) is overridden in the Readable class.
- function Stream() {
- EE.call(this);
- }
- Stream.prototype.pipe = function(dest, options) {
- var source = this;
- function ondata(chunk) {
- if (dest.writable) {
- if (false === dest.write(chunk) && source.pause) {
- source.pause();
- }
- }
- }
- source.on('data', ondata);
- function ondrain() {
- if (source.readable && source.resume) {
- source.resume();
- }
- }
- dest.on('drain', ondrain);
- // If the 'end' option is not supplied, dest.end() will be called when
- // source gets the 'end' or 'close' events. Only dest.end() once.
- if (!dest._isStdio && (!options || options.end !== false)) {
- source.on('end', onend);
- source.on('close', onclose);
- }
- var didOnEnd = false;
- function onend() {
- if (didOnEnd) return;
- didOnEnd = true;
- dest.end();
- }
- function onclose() {
- if (didOnEnd) return;
- didOnEnd = true;
- if (typeof dest.destroy === 'function') dest.destroy();
- }
- // don't leave dangling pipes when there are errors.
- function onerror(er) {
- cleanup();
- if (EE.listenerCount(this, 'error') === 0) {
- throw er; // Unhandled stream error in pipe.
- }
- }
- source.on('error', onerror);
- dest.on('error', onerror);
- // remove all the event listeners that were added.
- function cleanup() {
- source.removeListener('data', ondata);
- dest.removeListener('drain', ondrain);
- source.removeListener('end', onend);
- source.removeListener('close', onclose);
- source.removeListener('error', onerror);
- dest.removeListener('error', onerror);
- source.removeListener('end', cleanup);
- source.removeListener('close', cleanup);
- dest.removeListener('close', cleanup);
- }
- source.on('end', cleanup);
- source.on('close', cleanup);
- dest.on('close', cleanup);
- dest.emit('pipe', source);
- // Allow for unix-like usage: A.pipe(B).pipe(C)
- return dest;
- };
- /***/ }),
- /* 84 */
- /***/ (function(module, exports) {
- /* (ignored) */
- /***/ }),
- /* 85 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
- var Buffer = __webpack_require__(25).Buffer;
- var util = __webpack_require__(86);
- function copyBuffer(src, target, offset) {
- src.copy(target, offset);
- }
- module.exports = function () {
- function BufferList() {
- _classCallCheck(this, BufferList);
- this.head = null;
- this.tail = null;
- this.length = 0;
- }
- BufferList.prototype.push = function push(v) {
- var entry = { data: v, next: null };
- if (this.length > 0) this.tail.next = entry;else this.head = entry;
- this.tail = entry;
- ++this.length;
- };
- BufferList.prototype.unshift = function unshift(v) {
- var entry = { data: v, next: this.head };
- if (this.length === 0) this.tail = entry;
- this.head = entry;
- ++this.length;
- };
- BufferList.prototype.shift = function shift() {
- if (this.length === 0) return;
- var ret = this.head.data;
- if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
- --this.length;
- return ret;
- };
- BufferList.prototype.clear = function clear() {
- this.head = this.tail = null;
- this.length = 0;
- };
- BufferList.prototype.join = function join(s) {
- if (this.length === 0) return '';
- var p = this.head;
- var ret = '' + p.data;
- while (p = p.next) {
- ret += s + p.data;
- }return ret;
- };
- BufferList.prototype.concat = function concat(n) {
- if (this.length === 0) return Buffer.alloc(0);
- if (this.length === 1) return this.head.data;
- var ret = Buffer.allocUnsafe(n >>> 0);
- var p = this.head;
- var i = 0;
- while (p) {
- copyBuffer(p.data, ret, i);
- i += p.data.length;
- p = p.next;
- }
- return ret;
- };
- return BufferList;
- }();
- if (util && util.inspect && util.inspect.custom) {
- module.exports.prototype[util.inspect.custom] = function () {
- var obj = util.inspect({ length: this.length });
- return this.constructor.name + ' ' + obj;
- };
- }
- /***/ }),
- /* 86 */
- /***/ (function(module, exports) {
- /* (ignored) */
- /***/ }),
- /* 87 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
- (typeof self !== "undefined" && self) ||
- window;
- var apply = Function.prototype.apply;
- // DOM APIs, for completeness
- exports.setTimeout = function() {
- return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
- };
- exports.setInterval = function() {
- return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
- };
- exports.clearTimeout =
- exports.clearInterval = function(timeout) {
- if (timeout) {
- timeout.close();
- }
- };
- function Timeout(id, clearFn) {
- this._id = id;
- this._clearFn = clearFn;
- }
- Timeout.prototype.unref = Timeout.prototype.ref = function() {};
- Timeout.prototype.close = function() {
- this._clearFn.call(scope, this._id);
- };
- // Does not start the time, just sets up the members needed.
- exports.enroll = function(item, msecs) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = msecs;
- };
- exports.unenroll = function(item) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = -1;
- };
- exports._unrefActive = exports.active = function(item) {
- clearTimeout(item._idleTimeoutId);
- var msecs = item._idleTimeout;
- if (msecs >= 0) {
- item._idleTimeoutId = setTimeout(function onTimeout() {
- if (item._onTimeout)
- item._onTimeout();
- }, msecs);
- }
- };
- // setimmediate attaches itself to the global object
- __webpack_require__(88);
- // On some exotic environments, it's not clear which object `setimmediate` was
- // able to install onto. Search each possibility in the same order as the
- // `setimmediate` library.
- exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
- (typeof global !== "undefined" && global.setImmediate) ||
- (this && this.setImmediate);
- exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
- (typeof global !== "undefined" && global.clearImmediate) ||
- (this && this.clearImmediate);
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 88 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
- "use strict";
- if (global.setImmediate) {
- return;
- }
- var nextHandle = 1; // Spec says greater than zero
- var tasksByHandle = {};
- var currentlyRunningATask = false;
- var doc = global.document;
- var registerImmediate;
- function setImmediate(callback) {
- // Callback can either be a function or a string
- if (typeof callback !== "function") {
- callback = new Function("" + callback);
- }
- // Copy function arguments
- var args = new Array(arguments.length - 1);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i + 1];
- }
- // Store and register the task
- var task = { callback: callback, args: args };
- tasksByHandle[nextHandle] = task;
- registerImmediate(nextHandle);
- return nextHandle++;
- }
- function clearImmediate(handle) {
- delete tasksByHandle[handle];
- }
- function run(task) {
- var callback = task.callback;
- var args = task.args;
- switch (args.length) {
- case 0:
- callback();
- break;
- case 1:
- callback(args[0]);
- break;
- case 2:
- callback(args[0], args[1]);
- break;
- case 3:
- callback(args[0], args[1], args[2]);
- break;
- default:
- callback.apply(undefined, args);
- break;
- }
- }
- function runIfPresent(handle) {
- // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
- // So if we're currently running a task, we'll need to delay this invocation.
- if (currentlyRunningATask) {
- // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
- // "too much recursion" error.
- setTimeout(runIfPresent, 0, handle);
- } else {
- var task = tasksByHandle[handle];
- if (task) {
- currentlyRunningATask = true;
- try {
- run(task);
- } finally {
- clearImmediate(handle);
- currentlyRunningATask = false;
- }
- }
- }
- }
- function installNextTickImplementation() {
- registerImmediate = function(handle) {
- process.nextTick(function () { runIfPresent(handle); });
- };
- }
- function canUsePostMessage() {
- // The test against `importScripts` prevents this implementation from being installed inside a web worker,
- // where `global.postMessage` means something completely different and can't be used for this purpose.
- if (global.postMessage && !global.importScripts) {
- var postMessageIsAsynchronous = true;
- var oldOnMessage = global.onmessage;
- global.onmessage = function() {
- postMessageIsAsynchronous = false;
- };
- global.postMessage("", "*");
- global.onmessage = oldOnMessage;
- return postMessageIsAsynchronous;
- }
- }
- function installPostMessageImplementation() {
- // Installs an event handler on `global` for the `message` event: see
- // * https://developer.mozilla.org/en/DOM/window.postMessage
- // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
- var messagePrefix = "setImmediate$" + Math.random() + "$";
- var onGlobalMessage = function(event) {
- if (event.source === global &&
- typeof event.data === "string" &&
- event.data.indexOf(messagePrefix) === 0) {
- runIfPresent(+event.data.slice(messagePrefix.length));
- }
- };
- if (global.addEventListener) {
- global.addEventListener("message", onGlobalMessage, false);
- } else {
- global.attachEvent("onmessage", onGlobalMessage);
- }
- registerImmediate = function(handle) {
- global.postMessage(messagePrefix + handle, "*");
- };
- }
- function installMessageChannelImplementation() {
- var channel = new MessageChannel();
- channel.port1.onmessage = function(event) {
- var handle = event.data;
- runIfPresent(handle);
- };
- registerImmediate = function(handle) {
- channel.port2.postMessage(handle);
- };
- }
- function installReadyStateChangeImplementation() {
- var html = doc.documentElement;
- registerImmediate = function(handle) {
- // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
- // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
- var script = doc.createElement("script");
- script.onreadystatechange = function () {
- runIfPresent(handle);
- script.onreadystatechange = null;
- html.removeChild(script);
- script = null;
- };
- html.appendChild(script);
- };
- }
- function installSetTimeoutImplementation() {
- registerImmediate = function(handle) {
- setTimeout(runIfPresent, 0, handle);
- };
- }
- // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
- var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
- attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
- // Don't get fooled by e.g. browserify environments.
- if ({}.toString.call(global.process) === "[object process]") {
- // For Node.js before 0.9
- installNextTickImplementation();
- } else if (canUsePostMessage()) {
- // For non-IE10 modern browsers
- installPostMessageImplementation();
- } else if (global.MessageChannel) {
- // For web workers, where supported
- installMessageChannelImplementation();
- } else if (doc && "onreadystatechange" in doc.createElement("script")) {
- // For IE 6–8
- installReadyStateChangeImplementation();
- } else {
- // For older browsers
- installSetTimeoutImplementation();
- }
- attachTo.setImmediate = setImmediate;
- attachTo.clearImmediate = clearImmediate;
- }(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10), __webpack_require__(23)))
- /***/ }),
- /* 89 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {
- /**
- * Module exports.
- */
- module.exports = deprecate;
- /**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
- function deprecate (fn, msg) {
- if (config('noDeprecation')) {
- return fn;
- }
- var warned = false;
- function deprecated() {
- if (!warned) {
- if (config('throwDeprecation')) {
- throw new Error(msg);
- } else if (config('traceDeprecation')) {
- console.trace(msg);
- } else {
- console.warn(msg);
- }
- warned = true;
- }
- return fn.apply(this, arguments);
- }
- return deprecated;
- }
- /**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
- function config (name) {
- // accessing global.localStorage can trigger a DOMException in sandboxed iframes
- try {
- if (!global.localStorage) return false;
- } catch (_) {
- return false;
- }
- var val = global.localStorage[name];
- if (null == val) return false;
- return String(val).toLowerCase() === 'true';
- }
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))
- /***/ }),
- /* 90 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- // a passthrough stream.
- // basically just the most minimal sort of Transform stream.
- // Every written chunk gets output as-is.
- module.exports = PassThrough;
- var Transform = __webpack_require__(48);
- /*<replacement>*/
- var util = __webpack_require__(21);
- util.inherits = __webpack_require__(16);
- /*</replacement>*/
- util.inherits(PassThrough, Transform);
- function PassThrough(options) {
- if (!(this instanceof PassThrough)) return new PassThrough(options);
- Transform.call(this, options);
- }
- PassThrough.prototype._transform = function (chunk, encoding, cb) {
- cb(null, chunk);
- };
- /***/ }),
- /* 91 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(29);
- /***/ }),
- /* 92 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(14);
- /***/ }),
- /* 93 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(28).Transform
- /***/ }),
- /* 94 */
- /***/ (function(module, exports, __webpack_require__) {
- module.exports = __webpack_require__(28).PassThrough
- /***/ }),
- /* 95 */
- /***/ (function(module, exports, __webpack_require__) {
- var helper = __webpack_require__(31);
- var xml2js = __webpack_require__(43);
- function validateOptions (userOptions) {
- var options = helper.copyOptions(userOptions);
- helper.ensureSpacesExists(options);
- return options;
- }
- module.exports = function(xml, userOptions) {
- var options, js, json, parentKey;
- options = validateOptions(userOptions);
- js = xml2js(xml, options);
- parentKey = 'compact' in options && options.compact ? '_parent' : 'parent';
- // parentKey = ptions.compact ? '_parent' : 'parent'; // consider this
- if ('addParent' in options && options.addParent) {
- json = JSON.stringify(js, function (k, v) { return k === parentKey? '_' : v; }, options.spaces);
- } else {
- json = JSON.stringify(js, null, options.spaces);
- }
- return json.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029');
- };
- /***/ }),
- /* 96 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(Buffer) {var js2xml = __webpack_require__(49);
- module.exports = function (json, options) {
- if (json instanceof Buffer) {
- json = json.toString();
- }
- var js = null;
- if (typeof (json) === 'string') {
- try {
- js = JSON.parse(json);
- } catch (e) {
- throw new Error('The JSON structure is invalid');
- }
- } else {
- js = json;
- }
- return js2xml(js, options);
- };
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(22).Buffer))
- /***/ }),
- /* 97 */
- /***/ (function(module, exports, __webpack_require__) {
- !function(t,e){ true?module.exports=e(__webpack_require__(98),__webpack_require__(99)):undefined}(this,function(m,d){"use strict";var t;return m=m&&m.hasOwnProperty("default")?m.default:m,d=d&&d.hasOwnProperty("default")?d.default:d,function(t){var u;t.exports;(u=window).DOMParser=window.DOMParser;function p(){return document.createElement("canvas")}var f,c=function(t,e,i){if(null!=t||null!=e||null!=i){var n=function(s){var A={opts:s,FRAMERATE:30,MAX_VIRTUAL_PIXELS:3e4,rootEmSize:12,emSize:12,log:function(t){}};1==A.opts.log&&"undefined"!=typeof console&&(A.log=function(t){console.log(t)});A.init=function(t){var e=0;A.UniqueId=function(){return"canvg"+ ++e},A.Definitions={},A.Styles={},A.StylesSpecificity={},A.Animations=[],A.Images=[],A.ctx=t,A.ViewPort=new function(){this.viewPorts=[],this.Clear=function(){this.viewPorts=[]},this.SetCurrent=function(t,e){this.viewPorts.push({width:t,height:e})},this.RemoveCurrent=function(){this.viewPorts.pop()},this.Current=function(){return this.viewPorts[this.viewPorts.length-1]},this.width=function(){return this.Current().width},this.height=function(){return this.Current().height},this.ComputeSize=function(t){return null!=t&&"number"==typeof t?t:"x"==t?this.width():"y"==t?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}},A.init(),A.ImagesLoaded=function(){for(var t=0;t<A.Images.length;t++)if(!A.Images[t].loaded)return!1;return!0},A.trim=function(t){return t.replace(/^\s+|\s+$/g,"")},A.compressSpaces=function(t){return t.replace(/(?!\u3000)\s+/gm," ")},A.ajax=function(t){var e;return(e=u.XMLHttpRequest?new u.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"))?(e.open("GET",t,!1),e.send(null),e.responseText):null},A.parseXml=function(e){if("undefined"!=typeof Windows&&void 0!==Windows.Data&&void 0!==Windows.Data.Xml){var t=new Windows.Data.Xml.Dom.XmlDocument,i=new Windows.Data.Xml.Dom.XmlLoadSettings;return i.prohibitDtd=!1,t.loadXml(e,i),t}if(!u.DOMParser){e=e.replace(/<!DOCTYPE svg[^>]*>/,"");var t=new ActiveXObject("Microsoft.XMLDOM");return t.async="false",t.loadXML(e),t}try{var n=s.xmldom?new u.DOMParser(s.xmldom):new u.DOMParser;return n.parseFromString(e,"image/svg+xml")}catch(t){return(n=s.xmldom?new u.DOMParser(s.xmldom):new u.DOMParser).parseFromString(e,"text/xml")}},A.Property=function(t,e){this.name=t,this.value=e},A.Property.prototype.getValue=function(){return this.value},A.Property.prototype.hasValue=function(){return null!=this.value&&""!==this.value},A.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var t=parseFloat(this.value);return(this.value+"").match(/%$/)&&(t/=100),t},A.Property.prototype.valueOrDefault=function(t){return this.hasValue()?this.value:t},A.Property.prototype.numValueOrDefault=function(t){return this.hasValue()?this.numValue():t},A.Property.prototype.addOpacity=function(t){var e=this.value;if(null!=t.value&&""!=t.value&&"string"==typeof this.value){var i=new m(this.value);i.ok&&(e="rgba("+i.r+", "+i.g+", "+i.b+", "+t.numValue()+")")}return new A.Property(this.name,e)},A.Property.prototype.getDefinition=function(){var t=this.value.match(/#([^\)'"]+)/);return t&&(t=t[1]),t||(t=this.value),A.Definitions[t]},A.Property.prototype.isUrlDefinition=function(){return 0==this.value.indexOf("url(")},A.Property.prototype.getFillStyleDefinition=function(t,e){var i=this.getDefinition();if(null!=i&&i.createGradient)return i.createGradient(A.ctx,t,e);if(null!=i&&i.createPattern){if(i.getHrefAttribute().hasValue()){var n=i.attribute("patternTransform");i=i.getHrefAttribute().getDefinition(),n.hasValue()&&(i.attribute("patternTransform",!0).value=n.value)}return i.createPattern(A.ctx,t)}return null},A.Property.prototype.getDPI=function(t){return 96},A.Property.prototype.getREM=function(t){return A.rootEmSize},A.Property.prototype.getEM=function(t){return A.emSize},A.Property.prototype.getUnits=function(){var t=this.value+"";return t.replace(/[0-9\.\-]/g,"")},A.Property.prototype.isPixels=function(){if(!this.hasValue())return!1;var t=this.value+"";return!!t.match(/px$/)||!!t.match(/^[0-9]+$/)},A.Property.prototype.toPixels=function(t,e){if(!this.hasValue())return 0;var i=this.value+"";if(i.match(/rem$/))return this.numValue()*this.getREM(t);if(i.match(/em$/))return this.numValue()*this.getEM(t);if(i.match(/ex$/))return this.numValue()*this.getEM(t)/2;if(i.match(/px$/))return this.numValue();if(i.match(/pt$/))return this.numValue()*this.getDPI(t)*(1/72);if(i.match(/pc$/))return 15*this.numValue();if(i.match(/cm$/))return this.numValue()*this.getDPI(t)/2.54;if(i.match(/mm$/))return this.numValue()*this.getDPI(t)/25.4;if(i.match(/in$/))return this.numValue()*this.getDPI(t);if(i.match(/%$/))return this.numValue()*A.ViewPort.ComputeSize(t);var n=this.numValue();return e&&n<1?n*A.ViewPort.ComputeSize(t):n},A.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var t=this.value+"";return t.match(/s$/)?1e3*this.numValue():(t.match(/ms$/),this.numValue())},A.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var t=this.value+"";return t.match(/deg$/)?this.numValue()*(Math.PI/180):t.match(/grad$/)?this.numValue()*(Math.PI/200):t.match(/rad$/)?this.numValue():this.numValue()*(Math.PI/180)};var t={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};return A.Property.prototype.toTextBaseline=function(){return this.hasValue()?t[this.value]:null},A.Font=new function(){this.Styles="normal|italic|oblique|inherit",this.Variants="normal|small-caps|inherit",this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit",this.CreateFont=function(t,e,i,n,s,a){var r=null!=a?this.Parse(a):this.CreateFont("","","","","",A.ctx.font);return{fontFamily:s=s||r.fontFamily,fontSize:n||r.fontSize,fontStyle:t||r.fontStyle,fontWeight:i||r.fontWeight,fontVariant:e||r.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var r=this;this.Parse=function(t){for(var e={},i=A.trim(A.compressSpaces(t||"")).split(" "),n={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1},s="",a=0;a<i.length;a++)n.fontStyle||-1==r.Styles.indexOf(i[a])?n.fontVariant||-1==r.Variants.indexOf(i[a])?n.fontWeight||-1==r.Weights.indexOf(i[a])?n.fontSize?"inherit"!=i[a]&&(s+=i[a]):("inherit"!=i[a]&&(e.fontSize=i[a].split("/")[0]),n.fontStyle=n.fontVariant=n.fontWeight=n.fontSize=!0):("inherit"!=i[a]&&(e.fontWeight=i[a]),n.fontStyle=n.fontVariant=n.fontWeight=!0):("inherit"!=i[a]&&(e.fontVariant=i[a]),n.fontStyle=n.fontVariant=!0):("inherit"!=i[a]&&(e.fontStyle=i[a]),n.fontStyle=!0);return""!=s&&(e.fontFamily=s),e}},A.ToNumberArray=function(t){for(var e=A.trim(A.compressSpaces((t||"").replace(/,/g," "))).split(" "),i=0;i<e.length;i++)e[i]=parseFloat(e[i]);return e},A.Point=function(t,e){this.x=t,this.y=e},A.Point.prototype.angleTo=function(t){return Math.atan2(t.y-this.y,t.x-this.x)},A.Point.prototype.applyTransform=function(t){var e=this.x*t[0]+this.y*t[2]+t[4],i=this.x*t[1]+this.y*t[3]+t[5];this.x=e,this.y=i},A.CreatePoint=function(t){var e=A.ToNumberArray(t);return new A.Point(e[0],e[1])},A.CreatePath=function(t){for(var e=A.ToNumberArray(t),i=[],n=0;n<e.length;n+=2)i.push(new A.Point(e[n],e[n+1]));return i},A.BoundingBox=function(t,e,i,n){this.x1=Number.NaN,this.y1=Number.NaN,this.x2=Number.NaN,this.y2=Number.NaN,this.x=function(){return this.x1},this.y=function(){return this.y1},this.width=function(){return this.x2-this.x1},this.height=function(){return this.y2-this.y1},this.addPoint=function(t,e){null!=t&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=t,this.x2=t),t<this.x1&&(this.x1=t),t>this.x2&&(this.x2=t)),null!=e&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=e,this.y2=e),e<this.y1&&(this.y1=e),e>this.y2&&(this.y2=e))},this.addX=function(t){this.addPoint(t,null)},this.addY=function(t){this.addPoint(null,t)},this.addBoundingBox=function(t){this.addPoint(t.x1,t.y1),this.addPoint(t.x2,t.y2)},this.addQuadraticCurve=function(t,e,i,n,s,a){var r=t+2/3*(i-t),o=e+2/3*(n-e),l=r+1/3*(s-t),h=o+1/3*(a-e);this.addBezierCurve(t,e,r,l,o,h,s,a)},this.addBezierCurve=function(t,e,i,n,s,a,r,o){var l=[t,e],h=[i,n],u=[s,a],c=[r,o];this.addPoint(l[0],l[1]),this.addPoint(c[0],c[1]);for(var f=0;f<=1;f++){var m=function(t){return Math.pow(1-t,3)*l[f]+3*Math.pow(1-t,2)*t*h[f]+3*(1-t)*Math.pow(t,2)*u[f]+Math.pow(t,3)*c[f]},p=6*l[f]-12*h[f]+6*u[f],d=-3*l[f]+9*h[f]-9*u[f]+3*c[f],y=3*h[f]-3*l[f];if(0!=d){var v=Math.pow(p,2)-4*y*d;if(!(v<0)){var g=(-p+Math.sqrt(v))/(2*d);0<g&&g<1&&(0==f&&this.addX(m(g)),1==f&&this.addY(m(g)));var x=(-p-Math.sqrt(v))/(2*d);0<x&&x<1&&(0==f&&this.addX(m(x)),1==f&&this.addY(m(x)))}}else{if(0==p)continue;var b=-y/p;0<b&&b<1&&(0==f&&this.addX(m(b)),1==f&&this.addY(m(b)))}}},this.isPointInBox=function(t,e){return this.x1<=t&&t<=this.x2&&this.y1<=e&&e<=this.y2},this.addPoint(t,e),this.addPoint(i,n)},A.Transform=function(t){var e=this;this.Type={},this.Type.translate=function(t){this.p=A.CreatePoint(t),this.apply=function(t){t.translate(this.p.x||0,this.p.y||0)},this.unapply=function(t){t.translate(-1*this.p.x||0,-1*this.p.y||0)},this.applyToPoint=function(t){t.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0])}},this.Type.rotate=function(t){var e=A.ToNumberArray(t);this.angle=new A.Property("angle",e[0]),this.cx=e[1]||0,this.cy=e[2]||0,this.apply=function(t){t.translate(this.cx,this.cy),t.rotate(this.angle.toRadians()),t.translate(-this.cx,-this.cy)},this.unapply=function(t){t.translate(this.cx,this.cy),t.rotate(-1*this.angle.toRadians()),t.translate(-this.cx,-this.cy)},this.applyToPoint=function(t){var e=this.angle.toRadians();t.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]),t.applyTransform([Math.cos(e),Math.sin(e),-Math.sin(e),Math.cos(e),0,0]),t.applyTransform([1,0,0,1,-this.p.x||0,-this.p.y||0])}},this.Type.scale=function(t){this.p=A.CreatePoint(t),this.apply=function(t){t.scale(this.p.x||1,this.p.y||this.p.x||1)},this.unapply=function(t){t.scale(1/this.p.x||1,1/this.p.y||this.p.x||1)},this.applyToPoint=function(t){t.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}},this.Type.matrix=function(t){this.m=A.ToNumberArray(t),this.apply=function(t){t.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])},this.unapply=function(t){var e=this.m[0],i=this.m[2],n=this.m[4],s=this.m[1],a=this.m[3],r=this.m[5],o=1/(e*(1*a-0*r)-i*(1*s-0*r)+n*(0*s-0*a));t.transform(o*(1*a-0*r),o*(0*r-1*s),o*(0*n-1*i),o*(1*e-0*n),o*(i*r-n*a),o*(n*s-e*r))},this.applyToPoint=function(t){t.applyTransform(this.m)}},this.Type.SkewBase=function(t){this.base=e.Type.matrix,this.base(t),this.angle=new A.Property("angle",t)},this.Type.SkewBase.prototype=new this.Type.matrix,this.Type.skewX=function(t){this.base=e.Type.SkewBase,this.base(t),this.m=[1,0,Math.tan(this.angle.toRadians()),1,0,0]},this.Type.skewX.prototype=new this.Type.SkewBase,this.Type.skewY=function(t){this.base=e.Type.SkewBase,this.base(t),this.m=[1,Math.tan(this.angle.toRadians()),0,1,0,0]},this.Type.skewY.prototype=new this.Type.SkewBase,this.transforms=[],this.apply=function(t){for(var e=0;e<this.transforms.length;e++)this.transforms[e].apply(t)},this.unapply=function(t){for(var e=this.transforms.length-1;0<=e;e--)this.transforms[e].unapply(t)},this.applyToPoint=function(t){for(var e=0;e<this.transforms.length;e++)this.transforms[e].applyToPoint(t)};for(var i=A.trim(A.compressSpaces(t)).replace(/\)([a-zA-Z])/g,") $1").replace(/\)(\s?,\s?)/g,") ").split(/\s(?=[a-z])/),n=0;n<i.length;n++)if("none"!==i[n]){var s=A.trim(i[n].split("(")[0]),a=i[n].split("(")[1].replace(")",""),r=this.Type[s];if(void 0!==r){var o=new r(a);o.type=s,this.transforms.push(o)}}},A.AspectRatio=function(t,e,i,n,s,a,r,o,l,h){var u=(e=(e=A.compressSpaces(e)).replace(/^defer\s/,"")).split(" ")[0]||"xMidYMid",c=e.split(" ")[1]||"meet",f=i/n,m=s/a,p=Math.min(f,m),d=Math.max(f,m);"meet"==c&&(n*=p,a*=p),"slice"==c&&(n*=d,a*=d),l=new A.Property("refX",l),h=new A.Property("refY",h),l.hasValue()&&h.hasValue()?t.translate(-p*l.toPixels("x"),-p*h.toPixels("y")):(u.match(/^xMid/)&&("meet"==c&&p==m||"slice"==c&&d==m)&&t.translate(i/2-n/2,0),u.match(/YMid$/)&&("meet"==c&&p==f||"slice"==c&&d==f)&&t.translate(0,s/2-a/2),u.match(/^xMax/)&&("meet"==c&&p==m||"slice"==c&&d==m)&&t.translate(i-n,0),u.match(/YMax$/)&&("meet"==c&&p==f||"slice"==c&&d==f)&&t.translate(0,s-a)),"none"==u?t.scale(f,m):"meet"==c?t.scale(p,p):"slice"==c&&t.scale(d,d),t.translate(null==r?0:-r,null==o?0:-o)},A.Element={},A.EmptyProperty=new A.Property("EMPTY",""),A.Element.ElementBase=function(a){this.attributes={},this.styles={},this.stylesSpecificity={},this.children=[],this.attribute=function(t,e){var i=this.attributes[t];return null!=i?i:(1==e&&(i=new A.Property(t,""),this.attributes[t]=i),i||A.EmptyProperty)},this.getHrefAttribute=function(){for(var t in this.attributes)if("href"==t||t.match(/:href$/))return this.attributes[t];return A.EmptyProperty},this.style=function(t,e,i){var n=this.styles[t];if(null!=n)return n;var s=this.attribute(t);if(null!=s&&s.hasValue())return this.styles[t]=s;if(1!=i){var a=this.parent;if(null!=a){var r=a.style(t);if(null!=r&&r.hasValue())return r}}return 1==e&&(n=new A.Property(t,""),this.styles[t]=n),n||A.EmptyProperty},this.render=function(t){if("none"!=this.style("display").value&&"hidden"!=this.style("visibility").value){if(t.save(),this.style("mask").hasValue()){var e=this.style("mask").getDefinition();null!=e&&e.apply(t,this)}else if(this.style("filter").hasValue()){var i=this.style("filter").getDefinition();null!=i&&i.apply(t,this)}else this.setContext(t),this.renderChildren(t),this.clearContext(t);t.restore()}},this.setContext=function(t){},this.clearContext=function(t){},this.renderChildren=function(t){for(var e=0;e<this.children.length;e++)this.children[e].render(t)},this.addChild=function(t,e){var i=t;e&&(i=A.CreateElement(t)),i.parent=this,"title"!=i.type&&this.children.push(i)},this.addStylesFromStyleDefinition=function(){for(var t in A.Styles)if("@"!=t[0]&&f(a,t)){var e=A.Styles[t],i=A.StylesSpecificity[t];if(null!=e)for(var n in e){var s=this.stylesSpecificity[n];void 0===s&&(s="000"),s<i&&(this.styles[n]=e[n],this.stylesSpecificity[n]=i)}}};var t,e=new RegExp("^[A-Z-]+$");if(null!=a&&1==a.nodeType){for(var i=0;i<a.attributes.length;i++){var n=a.attributes[i],s=(t=n.nodeName,e.test(t)?t.toLowerCase():t);this.attributes[s]=new A.Property(s,n.value)}if(this.addStylesFromStyleDefinition(),this.attribute("style").hasValue()){var r=this.attribute("style").value.split(";");for(i=0;i<r.length;i++)if(""!=A.trim(r[i])){var o=r[i].split(":"),l=A.trim(o[0]),h=A.trim(o[1]);this.styles[l]=new A.Property(l,h)}}for(this.attribute("id").hasValue()&&null==A.Definitions[this.attribute("id").value]&&(A.Definitions[this.attribute("id").value]=this),i=0;i<a.childNodes.length;i++){var u=a.childNodes[i];if(1==u.nodeType&&this.addChild(u,!0),this.captureTextNodes&&(3==u.nodeType||4==u.nodeType)){var c=u.value||u.text||u.textContent||"";""!=A.compressSpaces(c)&&this.addChild(new A.Element.tspan(u),!1)}}}},A.Element.RenderedElementBase=function(t){this.base=A.Element.ElementBase,this.base(t),this.calculateOpacity=function(){for(var t=1,e=this;null!=e;){var i=e.style("opacity",!1,!0);i.hasValue()&&(t*=i.numValue()),e=e.parent}return t},this.setContext=function(t,e){if(!e){var i;if(this.style("fill").isUrlDefinition())null!=(i=this.style("fill").getFillStyleDefinition(this,this.style("fill-opacity")))&&(t.fillStyle=i);else if(this.style("fill").hasValue()){var n;"currentColor"==(n=this.style("fill")).value&&(n.value=this.style("color").value),"inherit"!=n.value&&(t.fillStyle="none"==n.value?"rgba(0,0,0,0)":n.value)}if(this.style("fill-opacity").hasValue()&&(n=(n=new A.Property("fill",t.fillStyle)).addOpacity(this.style("fill-opacity")),t.fillStyle=n.value),this.style("stroke").isUrlDefinition())null!=(i=this.style("stroke").getFillStyleDefinition(this,this.style("stroke-opacity")))&&(t.strokeStyle=i);else if(this.style("stroke").hasValue()){var s;"currentColor"==(s=this.style("stroke")).value&&(s.value=this.style("color").value),"inherit"!=s.value&&(t.strokeStyle="none"==s.value?"rgba(0,0,0,0)":s.value)}if(this.style("stroke-opacity").hasValue()&&(s=(s=new A.Property("stroke",t.strokeStyle)).addOpacity(this.style("stroke-opacity")),t.strokeStyle=s.value),this.style("stroke-width").hasValue()){var a=this.style("stroke-width").toPixels();t.lineWidth=0==a?.001:a}if(this.style("stroke-linecap").hasValue()&&(t.lineCap=this.style("stroke-linecap").value),this.style("stroke-linejoin").hasValue()&&(t.lineJoin=this.style("stroke-linejoin").value),this.style("stroke-miterlimit").hasValue()&&(t.miterLimit=this.style("stroke-miterlimit").value),this.style("paint-order").hasValue()&&(t.paintOrder=this.style("paint-order").value),this.style("stroke-dasharray").hasValue()&&"none"!=this.style("stroke-dasharray").value){var r=A.ToNumberArray(this.style("stroke-dasharray").value);void 0!==t.setLineDash?t.setLineDash(r):void 0!==t.webkitLineDash?t.webkitLineDash=r:void 0===t.mozDash||1==r.length&&0==r[0]||(t.mozDash=r);var o=this.style("stroke-dashoffset").toPixels();void 0!==t.lineDashOffset?t.lineDashOffset=o:void 0!==t.webkitLineDashOffset?t.webkitLineDashOffset=o:void 0!==t.mozDashOffset&&(t.mozDashOffset=o)}}if(void 0!==t.font){t.font=A.Font.CreateFont(this.style("font-style").value,this.style("font-variant").value,this.style("font-weight").value,this.style("font-size").hasValue()?this.style("font-size").toPixels()+"px":"",this.style("font-family").value).toString();var l=this.style("font-size",!1,!1);l.isPixels()&&(A.emSize=l.toPixels())}if(this.style("transform",!1,!0).hasValue()&&new A.Transform(this.style("transform",!1,!0).value).apply(t),this.style("clip-path",!1,!0).hasValue()){var h=this.style("clip-path",!1,!0).getDefinition();null!=h&&h.apply(t)}t.globalAlpha=this.calculateOpacity()}},A.Element.RenderedElementBase.prototype=new A.Element.ElementBase,A.Element.PathElementBase=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.path=function(t){return null!=t&&t.beginPath(),new A.BoundingBox},this.renderChildren=function(t){this.path(t),A.Mouse.checkPath(this,t),""!=t.fillStyle&&("inherit"!=this.style("fill-rule").valueOrDefault("inherit")?t.fill(this.style("fill-rule").value):t.fill()),""!=t.strokeStyle&&t.stroke();var e=this.getMarkers();if(null!=e){if(this.style("marker-start").isUrlDefinition()&&(i=this.style("marker-start").getDefinition()).render(t,e[0][0],e[0][1]),this.style("marker-mid").isUrlDefinition())for(var i=this.style("marker-mid").getDefinition(),n=1;n<e.length-1;n++)i.render(t,e[n][0],e[n][1]);this.style("marker-end").isUrlDefinition()&&(i=this.style("marker-end").getDefinition()).render(t,e[e.length-1][0],e[e.length-1][1])}},this.getBoundingBox=function(){return this.path()},this.getMarkers=function(){return null}},A.Element.PathElementBase.prototype=new A.Element.RenderedElementBase,A.Element.svg=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.baseClearContext=this.clearContext,this.clearContext=function(t){this.baseClearContext(t),A.ViewPort.RemoveCurrent()},this.baseSetContext=this.setContext,this.setContext=function(t){if(t.strokeStyle="rgba(0,0,0,0)",t.lineCap="butt",t.lineJoin="miter",t.miterLimit=4,t.canvas.style&&void 0!==t.font&&void 0!==u.getComputedStyle){t.font=u.getComputedStyle(t.canvas).getPropertyValue("font");var e=new A.Property("fontSize",A.Font.Parse(t.font).fontSize);e.hasValue()&&(A.rootEmSize=A.emSize=e.toPixels("y"))}this.baseSetContext(t),this.attribute("x").hasValue()||(this.attribute("x",!0).value=0),this.attribute("y").hasValue()||(this.attribute("y",!0).value=0),t.translate(this.attribute("x").toPixels("x"),this.attribute("y").toPixels("y"));var i=A.ViewPort.width(),n=A.ViewPort.height();if(this.attribute("width").hasValue()||(this.attribute("width",!0).value="100%"),this.attribute("height").hasValue()||(this.attribute("height",!0).value="100%"),void 0===this.root){i=this.attribute("width").toPixels("x"),n=this.attribute("height").toPixels("y");var s=0,a=0;this.attribute("refX").hasValue()&&this.attribute("refY").hasValue()&&(s=-this.attribute("refX").toPixels("x"),a=-this.attribute("refY").toPixels("y")),"visible"!=this.attribute("overflow").valueOrDefault("hidden")&&(t.beginPath(),t.moveTo(s,a),t.lineTo(i,a),t.lineTo(i,n),t.lineTo(s,n),t.closePath(),t.clip())}if(A.ViewPort.SetCurrent(i,n),this.attribute("viewBox").hasValue()){var r=A.ToNumberArray(this.attribute("viewBox").value),o=r[0],l=r[1];i=r[2],n=r[3],A.AspectRatio(t,this.attribute("preserveAspectRatio").value,A.ViewPort.width(),i,A.ViewPort.height(),n,o,l,this.attribute("refX").value,this.attribute("refY").value),A.ViewPort.RemoveCurrent(),A.ViewPort.SetCurrent(r[2],r[3])}}},A.Element.svg.prototype=new A.Element.RenderedElementBase,A.Element.rect=function(t){this.base=A.Element.PathElementBase,this.base(t),this.path=function(t){var e=this.attribute("x").toPixels("x"),i=this.attribute("y").toPixels("y"),n=this.attribute("width").toPixels("x"),s=this.attribute("height").toPixels("y"),a=this.attribute("rx").toPixels("x"),r=this.attribute("ry").toPixels("y");if(this.attribute("rx").hasValue()&&!this.attribute("ry").hasValue()&&(r=a),this.attribute("ry").hasValue()&&!this.attribute("rx").hasValue()&&(a=r),a=Math.min(a,n/2),r=Math.min(r,s/2),null!=t){var o=(Math.sqrt(2)-1)/3*4;t.beginPath(),t.moveTo(e+a,i),t.lineTo(e+n-a,i),t.bezierCurveTo(e+n-a+o*a,i,e+n,i+r-o*r,e+n,i+r),t.lineTo(e+n,i+s-r),t.bezierCurveTo(e+n,i+s-r+o*r,e+n-a+o*a,i+s,e+n-a,i+s),t.lineTo(e+a,i+s),t.bezierCurveTo(e+a-o*a,i+s,e,i+s-r+o*r,e,i+s-r),t.lineTo(e,i+r),t.bezierCurveTo(e,i+r-o*r,e+a-o*a,i,e+a,i),t.closePath()}return new A.BoundingBox(e,i,e+n,i+s)}},A.Element.rect.prototype=new A.Element.PathElementBase,A.Element.circle=function(t){this.base=A.Element.PathElementBase,this.base(t),this.path=function(t){var e=this.attribute("cx").toPixels("x"),i=this.attribute("cy").toPixels("y"),n=this.attribute("r").toPixels();return null!=t&&(t.beginPath(),t.arc(e,i,n,0,2*Math.PI,!1),t.closePath()),new A.BoundingBox(e-n,i-n,e+n,i+n)}},A.Element.circle.prototype=new A.Element.PathElementBase,A.Element.ellipse=function(t){this.base=A.Element.PathElementBase,this.base(t),this.path=function(t){var e=(Math.sqrt(2)-1)/3*4,i=this.attribute("rx").toPixels("x"),n=this.attribute("ry").toPixels("y"),s=this.attribute("cx").toPixels("x"),a=this.attribute("cy").toPixels("y");return null!=t&&(t.beginPath(),t.moveTo(s+i,a),t.bezierCurveTo(s+i,a+e*n,s+e*i,a+n,s,a+n),t.bezierCurveTo(s-e*i,a+n,s-i,a+e*n,s-i,a),t.bezierCurveTo(s-i,a-e*n,s-e*i,a-n,s,a-n),t.bezierCurveTo(s+e*i,a-n,s+i,a-e*n,s+i,a),t.closePath()),new A.BoundingBox(s-i,a-n,s+i,a+n)}},A.Element.ellipse.prototype=new A.Element.PathElementBase,A.Element.line=function(t){this.base=A.Element.PathElementBase,this.base(t),this.getPoints=function(){return[new A.Point(this.attribute("x1").toPixels("x"),this.attribute("y1").toPixels("y")),new A.Point(this.attribute("x2").toPixels("x"),this.attribute("y2").toPixels("y"))]},this.path=function(t){var e=this.getPoints();return null!=t&&(t.beginPath(),t.moveTo(e[0].x,e[0].y),t.lineTo(e[1].x,e[1].y)),new A.BoundingBox(e[0].x,e[0].y,e[1].x,e[1].y)},this.getMarkers=function(){var t=this.getPoints(),e=t[0].angleTo(t[1]);return[[t[0],e],[t[1],e]]}},A.Element.line.prototype=new A.Element.PathElementBase,A.Element.polyline=function(t){this.base=A.Element.PathElementBase,this.base(t),this.points=A.CreatePath(this.attribute("points").value),this.path=function(t){var e=new A.BoundingBox(this.points[0].x,this.points[0].y);null!=t&&(t.beginPath(),t.moveTo(this.points[0].x,this.points[0].y));for(var i=1;i<this.points.length;i++)e.addPoint(this.points[i].x,this.points[i].y),null!=t&&t.lineTo(this.points[i].x,this.points[i].y);return e},this.getMarkers=function(){for(var t=[],e=0;e<this.points.length-1;e++)t.push([this.points[e],this.points[e].angleTo(this.points[e+1])]);return 0<t.length&&t.push([this.points[this.points.length-1],t[t.length-1][1]]),t}},A.Element.polyline.prototype=new A.Element.PathElementBase,A.Element.polygon=function(t){this.base=A.Element.polyline,this.base(t),this.basePath=this.path,this.path=function(t){var e=this.basePath(t);return null!=t&&(t.lineTo(this.points[0].x,this.points[0].y),t.closePath()),e}},A.Element.polygon.prototype=new A.Element.polyline,A.Element.path=function(t){this.base=A.Element.PathElementBase,this.base(t);var e=this.attribute("d").value;e=e.replace(/,/gm," ");for(var i=0;i<2;i++)e=e.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2");for(e=(e=e.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2")).replace(/([0-9])([+\-])/gm,"$1 $2"),i=0;i<2;i++)e=e.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");e=e.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 "),e=A.compressSpaces(e),e=A.trim(e),this.PathParser=new function(t){this.tokens=t.split(" "),this.reset=function(){this.i=-1,this.command="",this.previousCommand="",this.start=new A.Point(0,0),this.control=new A.Point(0,0),this.current=new A.Point(0,0),this.points=[],this.angles=[]},this.isEnd=function(){return this.i>=this.tokens.length-1},this.isCommandOrEnd=function(){return!!this.isEnd()||null!=this.tokens[this.i+1].match(/^[A-Za-z]$/)},this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return!0}return!1},this.getToken=function(){return this.i++,this.tokens[this.i]},this.getScalar=function(){return parseFloat(this.getToken())},this.nextCommand=function(){this.previousCommand=this.command,this.command=this.getToken()},this.getPoint=function(){var t=new A.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)},this.getAsControlPoint=function(){var t=this.getPoint();return this.control=t},this.getAsCurrentPoint=function(){var t=this.getPoint();return this.current=t},this.getReflectedControlPoint=function(){return"c"!=this.previousCommand.toLowerCase()&&"s"!=this.previousCommand.toLowerCase()&&"q"!=this.previousCommand.toLowerCase()&&"t"!=this.previousCommand.toLowerCase()?this.current:new A.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)},this.makeAbsolute=function(t){return this.isRelativeCommand()&&(t.x+=this.current.x,t.y+=this.current.y),t},this.addMarker=function(t,e,i){null!=i&&0<this.angles.length&&null==this.angles[this.angles.length-1]&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(i)),this.addMarkerAngle(t,null==e?null:e.angleTo(t))},this.addMarkerAngle=function(t,e){this.points.push(t),this.angles.push(e)},this.getMarkerPoints=function(){return this.points},this.getMarkerAngles=function(){for(var t=0;t<this.angles.length;t++)if(null==this.angles[t])for(var e=t+1;e<this.angles.length;e++)if(null!=this.angles[e]){this.angles[t]=this.angles[e];break}return this.angles}}(e),this.path=function(t){var e=this.PathParser;e.reset();var i=new A.BoundingBox;for(null!=t&&t.beginPath();!e.isEnd();)switch(e.nextCommand(),e.command){case"M":case"m":var n=e.getAsCurrentPoint();for(e.addMarker(n),i.addPoint(n.x,n.y),null!=t&&t.moveTo(n.x,n.y),e.start=e.current;!e.isCommandOrEnd();)n=e.getAsCurrentPoint(),e.addMarker(n,e.start),i.addPoint(n.x,n.y),null!=t&&t.lineTo(n.x,n.y);break;case"L":case"l":for(;!e.isCommandOrEnd();){var s=e.current;n=e.getAsCurrentPoint(),e.addMarker(n,s),i.addPoint(n.x,n.y),null!=t&&t.lineTo(n.x,n.y)}break;case"H":case"h":for(;!e.isCommandOrEnd();){var a=new A.Point((e.isRelativeCommand()?e.current.x:0)+e.getScalar(),e.current.y);e.addMarker(a,e.current),e.current=a,i.addPoint(e.current.x,e.current.y),null!=t&&t.lineTo(e.current.x,e.current.y)}break;case"V":case"v":for(;!e.isCommandOrEnd();)a=new A.Point(e.current.x,(e.isRelativeCommand()?e.current.y:0)+e.getScalar()),e.addMarker(a,e.current),e.current=a,i.addPoint(e.current.x,e.current.y),null!=t&&t.lineTo(e.current.x,e.current.y);break;case"C":case"c":for(;!e.isCommandOrEnd();){var r=e.current,o=e.getPoint(),l=e.getAsControlPoint(),h=e.getAsCurrentPoint();e.addMarker(h,l,o),i.addBezierCurve(r.x,r.y,o.x,o.y,l.x,l.y,h.x,h.y),null!=t&&t.bezierCurveTo(o.x,o.y,l.x,l.y,h.x,h.y)}break;case"S":case"s":for(;!e.isCommandOrEnd();)r=e.current,o=e.getReflectedControlPoint(),l=e.getAsControlPoint(),h=e.getAsCurrentPoint(),e.addMarker(h,l,o),i.addBezierCurve(r.x,r.y,o.x,o.y,l.x,l.y,h.x,h.y),null!=t&&t.bezierCurveTo(o.x,o.y,l.x,l.y,h.x,h.y);break;case"Q":case"q":for(;!e.isCommandOrEnd();)r=e.current,l=e.getAsControlPoint(),h=e.getAsCurrentPoint(),e.addMarker(h,l,l),i.addQuadraticCurve(r.x,r.y,l.x,l.y,h.x,h.y),null!=t&&t.quadraticCurveTo(l.x,l.y,h.x,h.y);break;case"T":case"t":for(;!e.isCommandOrEnd();)r=e.current,l=e.getReflectedControlPoint(),e.control=l,h=e.getAsCurrentPoint(),e.addMarker(h,l,l),i.addQuadraticCurve(r.x,r.y,l.x,l.y,h.x,h.y),null!=t&&t.quadraticCurveTo(l.x,l.y,h.x,h.y);break;case"A":case"a":for(;!e.isCommandOrEnd();){r=e.current;var u=e.getScalar(),c=e.getScalar(),f=e.getScalar()*(Math.PI/180),m=e.getScalar(),p=e.getScalar(),d=(h=e.getAsCurrentPoint(),new A.Point(Math.cos(f)*(r.x-h.x)/2+Math.sin(f)*(r.y-h.y)/2,-Math.sin(f)*(r.x-h.x)/2+Math.cos(f)*(r.y-h.y)/2)),y=Math.pow(d.x,2)/Math.pow(u,2)+Math.pow(d.y,2)/Math.pow(c,2);1<y&&(u*=Math.sqrt(y),c*=Math.sqrt(y));var v=(m==p?-1:1)*Math.sqrt((Math.pow(u,2)*Math.pow(c,2)-Math.pow(u,2)*Math.pow(d.y,2)-Math.pow(c,2)*Math.pow(d.x,2))/(Math.pow(u,2)*Math.pow(d.y,2)+Math.pow(c,2)*Math.pow(d.x,2)));isNaN(v)&&(v=0);var g=new A.Point(v*u*d.y/c,v*-c*d.x/u),x=new A.Point((r.x+h.x)/2+Math.cos(f)*g.x-Math.sin(f)*g.y,(r.y+h.y)/2+Math.sin(f)*g.x+Math.cos(f)*g.y),b=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2))},P=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(b(t)*b(e))},E=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(P(t,e))},w=E([1,0],[(d.x-g.x)/u,(d.y-g.y)/c]),B=[(d.x-g.x)/u,(d.y-g.y)/c],C=[(-d.x-g.x)/u,(-d.y-g.y)/c],T=E(B,C);P(B,C)<=-1&&(T=Math.PI),1<=P(B,C)&&(T=0);var V=1-p?1:-1,M=w+V*(T/2),S=new A.Point(x.x+u*Math.cos(M),x.y+c*Math.sin(M));if(e.addMarkerAngle(S,M-V*Math.PI/2),e.addMarkerAngle(h,M-V*Math.PI),i.addPoint(h.x,h.y),null!=t){P=c<u?u:c;var k=c<u?1:u/c,D=c<u?c/u:1;t.translate(x.x,x.y),t.rotate(f),t.scale(k,D),t.arc(0,0,P,w,w+T,1-p),t.scale(1/k,1/D),t.rotate(-f),t.translate(-x.x,-x.y)}}break;case"Z":case"z":null!=t&&i.x1!==i.x2&&i.y1!==i.y2&&t.closePath(),e.current=e.start}return i},this.getMarkers=function(){for(var t=this.PathParser.getMarkerPoints(),e=this.PathParser.getMarkerAngles(),i=[],n=0;n<t.length;n++)i.push([t[n],e[n]]);return i}},A.Element.path.prototype=new A.Element.PathElementBase,A.Element.pattern=function(t){this.base=A.Element.ElementBase,this.base(t),this.createPattern=function(t,e){var i=this.attribute("width").toPixels("x",!0),n=this.attribute("height").toPixels("y",!0),s=new A.Element.svg;s.attributes.viewBox=new A.Property("viewBox",this.attribute("viewBox").value),s.attributes.width=new A.Property("width",i+"px"),s.attributes.height=new A.Property("height",n+"px"),s.attributes.transform=new A.Property("transform",this.attribute("patternTransform").value),s.children=this.children;var a=p();a.width=i,a.height=n;var r=a.getContext("2d");this.attribute("x").hasValue()&&this.attribute("y").hasValue()&&r.translate(this.attribute("x").toPixels("x",!0),this.attribute("y").toPixels("y",!0));for(var o=-1;o<=1;o++)for(var l=-1;l<=1;l++)r.save(),s.attributes.x=new A.Property("x",o*a.width),s.attributes.y=new A.Property("y",l*a.height),s.render(r),r.restore();return t.createPattern(a,"repeat")}},A.Element.pattern.prototype=new A.Element.ElementBase,A.Element.marker=function(t){this.base=A.Element.ElementBase,this.base(t),this.baseRender=this.render,this.render=function(t,e,i){if(e){t.translate(e.x,e.y),"auto"==this.attribute("orient").valueOrDefault("auto")&&t.rotate(i),"strokeWidth"==this.attribute("markerUnits").valueOrDefault("strokeWidth")&&t.scale(t.lineWidth,t.lineWidth),t.save();var n=new A.Element.svg;n.attributes.viewBox=new A.Property("viewBox",this.attribute("viewBox").value),n.attributes.refX=new A.Property("refX",this.attribute("refX").value),n.attributes.refY=new A.Property("refY",this.attribute("refY").value),n.attributes.width=new A.Property("width",this.attribute("markerWidth").value),n.attributes.height=new A.Property("height",this.attribute("markerHeight").value),n.attributes.fill=new A.Property("fill",this.attribute("fill").valueOrDefault("black")),n.attributes.stroke=new A.Property("stroke",this.attribute("stroke").valueOrDefault("none")),n.children=this.children,n.render(t),t.restore(),"strokeWidth"==this.attribute("markerUnits").valueOrDefault("strokeWidth")&&t.scale(1/t.lineWidth,1/t.lineWidth),"auto"==this.attribute("orient").valueOrDefault("auto")&&t.rotate(-i),t.translate(-e.x,-e.y)}}},A.Element.marker.prototype=new A.Element.ElementBase,A.Element.defs=function(t){this.base=A.Element.ElementBase,this.base(t),this.render=function(t){}},A.Element.defs.prototype=new A.Element.ElementBase,A.Element.GradientBase=function(t){this.base=A.Element.ElementBase,this.base(t),this.stops=[];for(var e=0;e<this.children.length;e++){var i=this.children[e];"stop"==i.type&&this.stops.push(i)}this.getGradient=function(){},this.gradientUnits=function(){return this.attribute("gradientUnits").valueOrDefault("objectBoundingBox")},this.attributesToInherit=["gradientUnits"],this.inheritStopContainer=function(t){for(var e=0;e<this.attributesToInherit.length;e++){var i=this.attributesToInherit[e];!this.attribute(i).hasValue()&&t.attribute(i).hasValue()&&(this.attribute(i,!0).value=t.attribute(i).value)}},this.createGradient=function(t,e,i){var n=this;this.getHrefAttribute().hasValue()&&(n=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(n));var s=function(t){return i.hasValue()?new A.Property("color",t).addOpacity(i).value:t},a=this.getGradient(t,e);if(null==a)return s(n.stops[n.stops.length-1].color);for(var r=0;r<n.stops.length;r++)a.addColorStop(n.stops[r].offset,s(n.stops[r].color));if(this.attribute("gradientTransform").hasValue()){var o=A.ViewPort.viewPorts[0],l=new A.Element.rect;l.attributes.x=new A.Property("x",-A.MAX_VIRTUAL_PIXELS/3),l.attributes.y=new A.Property("y",-A.MAX_VIRTUAL_PIXELS/3),l.attributes.width=new A.Property("width",A.MAX_VIRTUAL_PIXELS),l.attributes.height=new A.Property("height",A.MAX_VIRTUAL_PIXELS);var h=new A.Element.g;h.attributes.transform=new A.Property("transform",this.attribute("gradientTransform").value),h.children=[l];var u=new A.Element.svg;u.attributes.x=new A.Property("x",0),u.attributes.y=new A.Property("y",0),u.attributes.width=new A.Property("width",o.width),u.attributes.height=new A.Property("height",o.height),u.children=[h];var c=p();c.width=o.width,c.height=o.height;var f=c.getContext("2d");return f.fillStyle=a,u.render(f),f.createPattern(c,"no-repeat")}return a}},A.Element.GradientBase.prototype=new A.Element.ElementBase,A.Element.linearGradient=function(t){this.base=A.Element.GradientBase,this.base(t),this.attributesToInherit.push("x1"),this.attributesToInherit.push("y1"),this.attributesToInherit.push("x2"),this.attributesToInherit.push("y2"),this.getGradient=function(t,e){var i="objectBoundingBox"==this.gradientUnits()?e.getBoundingBox(t):null;this.attribute("x1").hasValue()||this.attribute("y1").hasValue()||this.attribute("x2").hasValue()||this.attribute("y2").hasValue()||(this.attribute("x1",!0).value=0,this.attribute("y1",!0).value=0,this.attribute("x2",!0).value=1,this.attribute("y2",!0).value=0);var n="objectBoundingBox"==this.gradientUnits()?i.x()+i.width()*this.attribute("x1").numValue():this.attribute("x1").toPixels("x"),s="objectBoundingBox"==this.gradientUnits()?i.y()+i.height()*this.attribute("y1").numValue():this.attribute("y1").toPixels("y"),a="objectBoundingBox"==this.gradientUnits()?i.x()+i.width()*this.attribute("x2").numValue():this.attribute("x2").toPixels("x"),r="objectBoundingBox"==this.gradientUnits()?i.y()+i.height()*this.attribute("y2").numValue():this.attribute("y2").toPixels("y");return n==a&&s==r?null:t.createLinearGradient(n,s,a,r)}},A.Element.linearGradient.prototype=new A.Element.GradientBase,A.Element.radialGradient=function(t){this.base=A.Element.GradientBase,this.base(t),this.attributesToInherit.push("cx"),this.attributesToInherit.push("cy"),this.attributesToInherit.push("r"),this.attributesToInherit.push("fx"),this.attributesToInherit.push("fy"),this.getGradient=function(t,e){var i=e.getBoundingBox(t);this.attribute("cx").hasValue()||(this.attribute("cx",!0).value="50%"),this.attribute("cy").hasValue()||(this.attribute("cy",!0).value="50%"),this.attribute("r").hasValue()||(this.attribute("r",!0).value="50%");var n="objectBoundingBox"==this.gradientUnits()?i.x()+i.width()*this.attribute("cx").numValue():this.attribute("cx").toPixels("x"),s="objectBoundingBox"==this.gradientUnits()?i.y()+i.height()*this.attribute("cy").numValue():this.attribute("cy").toPixels("y"),a=n,r=s;this.attribute("fx").hasValue()&&(a="objectBoundingBox"==this.gradientUnits()?i.x()+i.width()*this.attribute("fx").numValue():this.attribute("fx").toPixels("x")),this.attribute("fy").hasValue()&&(r="objectBoundingBox"==this.gradientUnits()?i.y()+i.height()*this.attribute("fy").numValue():this.attribute("fy").toPixels("y"));var o="objectBoundingBox"==this.gradientUnits()?(i.width()+i.height())/2*this.attribute("r").numValue():this.attribute("r").toPixels();return t.createRadialGradient(a,r,0,n,s,o)}},A.Element.radialGradient.prototype=new A.Element.GradientBase,A.Element.stop=function(t){this.base=A.Element.ElementBase,this.base(t),this.offset=this.attribute("offset").numValue(),this.offset<0&&(this.offset=0),1<this.offset&&(this.offset=1);var e=this.style("stop-color",!0);""===e.value&&(e.value="#000"),this.style("stop-opacity").hasValue()&&(e=e.addOpacity(this.style("stop-opacity"))),this.color=e.value},A.Element.stop.prototype=new A.Element.ElementBase,A.Element.AnimateBase=function(t){this.base=A.Element.ElementBase,this.base(t),A.Animations.push(this),this.duration=0,this.begin=this.attribute("begin").toMilliseconds(),this.maxDuration=this.begin+this.attribute("dur").toMilliseconds(),this.getProperty=function(){var t=this.attribute("attributeType").value,e=this.attribute("attributeName").value;return"CSS"==t?this.parent.style(e,!0):this.parent.attribute(e,!0)},this.initialValue=null,this.initialUnits="",this.removed=!1,this.calcValue=function(){return""},this.update=function(t){if(null==this.initialValue&&(this.initialValue=this.getProperty().value,this.initialUnits=this.getProperty().getUnits()),this.duration>this.maxDuration){if("indefinite"==this.attribute("repeatCount").value||"indefinite"==this.attribute("repeatDur").value)this.duration=0;else if("freeze"!=this.attribute("fill").valueOrDefault("remove")||this.frozen){if("remove"==this.attribute("fill").valueOrDefault("remove")&&!this.removed)return this.removed=!0,this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue,!0}else this.frozen=!0,this.parent.animationFrozen=!0,this.parent.animationFrozenValue=this.getProperty().value;return!1}this.duration=this.duration+t;var e=!1;if(this.begin<this.duration){var i=this.calcValue();this.attribute("type").hasValue()&&(i=this.attribute("type").value+"("+i+")"),this.getProperty().value=i,e=!0}return e},this.from=this.attribute("from"),this.to=this.attribute("to"),this.values=this.attribute("values"),this.values.hasValue()&&(this.values.value=this.values.value.split(";")),this.progress=function(){var t={progress:(this.duration-this.begin)/(this.maxDuration-this.begin)};if(this.values.hasValue()){var e=t.progress*(this.values.value.length-1),i=Math.floor(e),n=Math.ceil(e);t.from=new A.Property("from",parseFloat(this.values.value[i])),t.to=new A.Property("to",parseFloat(this.values.value[n])),t.progress=(e-i)/(n-i)}else t.from=this.from,t.to=this.to;return t}},A.Element.AnimateBase.prototype=new A.Element.ElementBase,A.Element.animate=function(t){this.base=A.Element.AnimateBase,this.base(t),this.calcValue=function(){var t=this.progress();return t.from.numValue()+(t.to.numValue()-t.from.numValue())*t.progress+this.initialUnits}},A.Element.animate.prototype=new A.Element.AnimateBase,A.Element.animateColor=function(t){this.base=A.Element.AnimateBase,this.base(t),this.calcValue=function(){var t=this.progress(),e=new m(t.from.value),i=new m(t.to.value);if(e.ok&&i.ok){var n=e.r+(i.r-e.r)*t.progress,s=e.g+(i.g-e.g)*t.progress,a=e.b+(i.b-e.b)*t.progress;return"rgb("+parseInt(n,10)+","+parseInt(s,10)+","+parseInt(a,10)+")"}return this.attribute("from").value}},A.Element.animateColor.prototype=new A.Element.AnimateBase,A.Element.animateTransform=function(t){this.base=A.Element.AnimateBase,this.base(t),this.calcValue=function(){for(var t=this.progress(),e=A.ToNumberArray(t.from.value),i=A.ToNumberArray(t.to.value),n="",s=0;s<e.length;s++)n+=e[s]+(i[s]-e[s])*t.progress+" ";return n}},A.Element.animateTransform.prototype=new A.Element.animate,A.Element.font=function(t){this.base=A.Element.ElementBase,this.base(t),this.horizAdvX=this.attribute("horiz-adv-x").numValue(),this.isRTL=!1,this.isArabic=!1,this.fontFace=null,this.missingGlyph=null,this.glyphs=[];for(var e=0;e<this.children.length;e++){var i=this.children[e];"font-face"==i.type?(this.fontFace=i).style("font-family").hasValue()&&(A.Definitions[i.style("font-family").value]=this):"missing-glyph"==i.type?this.missingGlyph=i:"glyph"==i.type&&(""!=i.arabicForm?(this.isRTL=!0,this.isArabic=!0,void 0===this.glyphs[i.unicode]&&(this.glyphs[i.unicode]=[]),this.glyphs[i.unicode][i.arabicForm]=i):this.glyphs[i.unicode]=i)}},A.Element.font.prototype=new A.Element.ElementBase,A.Element.fontface=function(t){this.base=A.Element.ElementBase,this.base(t),this.ascent=this.attribute("ascent").value,this.descent=this.attribute("descent").value,this.unitsPerEm=this.attribute("units-per-em").numValue()},A.Element.fontface.prototype=new A.Element.ElementBase,A.Element.missingglyph=function(t){this.base=A.Element.path,this.base(t),this.horizAdvX=0},A.Element.missingglyph.prototype=new A.Element.path,A.Element.glyph=function(t){this.base=A.Element.path,this.base(t),this.horizAdvX=this.attribute("horiz-adv-x").numValue(),this.unicode=this.attribute("unicode").value,this.arabicForm=this.attribute("arabic-form").value},A.Element.glyph.prototype=new A.Element.path,A.Element.text=function(t){this.captureTextNodes=!0,this.base=A.Element.RenderedElementBase,this.base(t),this.baseSetContext=this.setContext,this.setContext=function(t){this.baseSetContext(t);var e=this.style("dominant-baseline").toTextBaseline();null==e&&(e=this.style("alignment-baseline").toTextBaseline()),null!=e&&(t.textBaseline=e)},this.initializeCoordinates=function(t){this.x=this.attribute("x").toPixels("x"),this.y=this.attribute("y").toPixels("y"),this.attribute("dx").hasValue()&&(this.x+=this.attribute("dx").toPixels("x")),this.attribute("dy").hasValue()&&(this.y+=this.attribute("dy").toPixels("y")),this.x+=this.getAnchorDelta(t,this,0)},this.getBoundingBox=function(t){this.initializeCoordinates(t);for(var e=null,i=0;i<this.children.length;i++){var n=this.getChildBoundingBox(t,this,this,i);null==e?e=n:e.addBoundingBox(n)}return e},this.renderChildren=function(t){this.initializeCoordinates(t);for(var e=0;e<this.children.length;e++)this.renderChild(t,this,this,e)},this.getAnchorDelta=function(t,e,i){var n=this.style("text-anchor").valueOrDefault("start");if("start"!=n){for(var s=0,a=i;a<e.children.length;a++){var r=e.children[a];if(i<a&&r.attribute("x").hasValue())break;s+=r.measureTextRecursive(t)}return-1*("end"==n?s:s/2)}return 0},this.adjustChildCoordinates=function(t,e,i,n){var s=i.children[n];return s.attribute("x").hasValue()?(s.x=s.attribute("x").toPixels("x")+e.getAnchorDelta(t,i,n),s.attribute("dx").hasValue()&&(s.x+=s.attribute("dx").toPixels("x"))):(s.attribute("dx").hasValue()&&(e.x+=s.attribute("dx").toPixels("x")),s.x=e.x),e.x=s.x+s.measureText(t),s.attribute("y").hasValue()?(s.y=s.attribute("y").toPixels("y"),s.attribute("dy").hasValue()&&(s.y+=s.attribute("dy").toPixels("y"))):(s.attribute("dy").hasValue()&&(e.y+=s.attribute("dy").toPixels("y")),s.y=e.y),e.y=s.y,s},this.getChildBoundingBox=function(t,e,i,n){var s=this.adjustChildCoordinates(t,e,i,n),a=s.getBoundingBox(t);for(n=0;n<s.children.length;n++){var r=e.getChildBoundingBox(t,e,s,n);a.addBoundingBox(r)}return a},this.renderChild=function(t,e,i,n){var s=this.adjustChildCoordinates(t,e,i,n);for(s.render(t),n=0;n<s.children.length;n++)e.renderChild(t,e,s,n)}},A.Element.text.prototype=new A.Element.RenderedElementBase,A.Element.TextElementBase=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.getGlyph=function(t,e,i){var n=e[i],s=null;if(t.isArabic){var a="isolated";(0==i||" "==e[i-1])&&i<e.length-2&&" "!=e[i+1]&&(a="terminal"),0<i&&" "!=e[i-1]&&i<e.length-2&&" "!=e[i+1]&&(a="medial"),0<i&&" "!=e[i-1]&&(i==e.length-1||" "==e[i+1])&&(a="initial"),void 0!==t.glyphs[n]&&null==(s=t.glyphs[n][a])&&"glyph"==t.glyphs[n].type&&(s=t.glyphs[n])}else s=t.glyphs[n];return null==s&&(s=t.missingGlyph),s},this.renderChildren=function(t){var e=this.parent.style("font-family").getDefinition();if(null==e)"stroke"==t.paintOrder?(""!=t.strokeStyle&&t.strokeText(A.compressSpaces(this.getText()),this.x,this.y),""!=t.fillStyle&&t.fillText(A.compressSpaces(this.getText()),this.x,this.y)):(""!=t.fillStyle&&t.fillText(A.compressSpaces(this.getText()),this.x,this.y),""!=t.strokeStyle&&t.strokeText(A.compressSpaces(this.getText()),this.x,this.y));else{var i=this.parent.style("font-size").numValueOrDefault(A.Font.Parse(A.ctx.font).fontSize),n=this.parent.style("font-style").valueOrDefault(A.Font.Parse(A.ctx.font).fontStyle),s=this.getText();e.isRTL&&(s=s.split("").reverse().join(""));for(var a=A.ToNumberArray(this.parent.attribute("dx").value),r=0;r<s.length;r++){var o=this.getGlyph(e,s,r),l=i/e.fontFace.unitsPerEm;t.translate(this.x,this.y),t.scale(l,-l);var h=t.lineWidth;t.lineWidth=t.lineWidth*e.fontFace.unitsPerEm/i,"italic"==n&&t.transform(1,0,.4,1,0,0),o.render(t),"italic"==n&&t.transform(1,0,-.4,1,0,0),t.lineWidth=h,t.scale(1/l,-1/l),t.translate(-this.x,-this.y),this.x+=i*(o.horizAdvX||e.horizAdvX)/e.fontFace.unitsPerEm,void 0===a[r]||isNaN(a[r])||(this.x+=a[r])}}},this.getText=function(){},this.measureTextRecursive=function(t){for(var e=this.measureText(t),i=0;i<this.children.length;i++)e+=this.children[i].measureTextRecursive(t);return e},this.measureText=function(t){var e=this.parent.style("font-family").getDefinition();if(null!=e){var i=this.parent.style("font-size").numValueOrDefault(A.Font.Parse(A.ctx.font).fontSize),n=0,s=this.getText();e.isRTL&&(s=s.split("").reverse().join(""));for(var a=A.ToNumberArray(this.parent.attribute("dx").value),r=0;r<s.length;r++)n+=(this.getGlyph(e,s,r).horizAdvX||e.horizAdvX)*i/e.fontFace.unitsPerEm,void 0===a[r]||isNaN(a[r])||(n+=a[r]);return n}var o=A.compressSpaces(this.getText());if(!t.measureText)return 10*o.length;t.save(),this.setContext(t,!0);var l=t.measureText(o).width;return t.restore(),l},this.getBoundingBox=function(t){var e=this.parent.style("font-size").numValueOrDefault(A.Font.Parse(A.ctx.font).fontSize);return new A.BoundingBox(this.x,this.y-e,this.x+this.measureText(t),this.y)}},A.Element.TextElementBase.prototype=new A.Element.RenderedElementBase,A.Element.tspan=function(t){this.captureTextNodes=!0,this.base=A.Element.TextElementBase,this.base(t),this.text=A.compressSpaces(t.value||t.text||t.textContent||""),this.getText=function(){return 0<this.children.length?"":this.text}},A.Element.tspan.prototype=new A.Element.TextElementBase,A.Element.tref=function(t){this.base=A.Element.TextElementBase,this.base(t),this.getText=function(){var t=this.getHrefAttribute().getDefinition();if(null!=t)return t.children[0].getText()}},A.Element.tref.prototype=new A.Element.TextElementBase,A.Element.a=function(t){this.base=A.Element.TextElementBase,this.base(t),this.hasText=0<t.childNodes.length;for(var e=0;e<t.childNodes.length;e++)3!=t.childNodes[e].nodeType&&(this.hasText=!1);this.text=this.hasText?t.childNodes[0].value||t.childNodes[0].data:"",this.getText=function(){return this.text},this.baseRenderChildren=this.renderChildren,this.renderChildren=function(t){if(this.hasText){this.baseRenderChildren(t);var e=new A.Property("fontSize",A.Font.Parse(A.ctx.font).fontSize);A.Mouse.checkBoundingBox(this,new A.BoundingBox(this.x,this.y-e.toPixels("y"),this.x+this.measureText(t),this.y))}else if(0<this.children.length){var i=new A.Element.g;i.children=this.children,i.parent=this,i.render(t)}},this.onclick=function(){u.open(this.getHrefAttribute().value)},this.onmousemove=function(){A.ctx.canvas.style.cursor="pointer"}},A.Element.a.prototype=new A.Element.TextElementBase,A.Element.image=function(t){this.base=A.Element.RenderedElementBase,this.base(t);var e=this.getHrefAttribute().value;if(""!=e){var a=e.match(/\.svg$/);if(A.Images.push(this),this.loaded=!1,a)this.img=A.ajax(e),this.loaded=!0;else{this.img=document.createElement("img"),1==A.opts.useCORS&&(this.img.crossOrigin="Anonymous");var r=this;this.img.onload=function(){r.loaded=!0},this.img.onerror=function(){A.log('ERROR: image "'+e+'" not found'),r.loaded=!0},this.img.src=e}this.renderChildren=function(t){var e=this.attribute("x").toPixels("x"),i=this.attribute("y").toPixels("y"),n=this.attribute("width").toPixels("x"),s=this.attribute("height").toPixels("y");0!=n&&0!=s&&(t.save(),a?t.drawSvg(this.img,e,i,n,s):(t.translate(e,i),A.AspectRatio(t,this.attribute("preserveAspectRatio").value,n,this.img.width,s,this.img.height,0,0),r.loaded&&(void 0===this.img.complete||this.img.complete)&&t.drawImage(this.img,0,0)),t.restore())},this.getBoundingBox=function(){var t=this.attribute("x").toPixels("x"),e=this.attribute("y").toPixels("y"),i=this.attribute("width").toPixels("x"),n=this.attribute("height").toPixels("y");return new A.BoundingBox(t,e,t+i,e+n)}}},A.Element.image.prototype=new A.Element.RenderedElementBase,A.Element.g=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.getBoundingBox=function(t){for(var e=new A.BoundingBox,i=0;i<this.children.length;i++)e.addBoundingBox(this.children[i].getBoundingBox(t));return e}},A.Element.g.prototype=new A.Element.RenderedElementBase,A.Element.symbol=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.render=function(t){}},A.Element.symbol.prototype=new A.Element.RenderedElementBase,A.Element.style=function(t){this.base=A.Element.ElementBase,this.base(t);for(var e="",i=0;i<t.childNodes.length;i++)e+=t.childNodes[i].data;e=e.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,"");var n=(e=A.compressSpaces(e)).split("}");for(i=0;i<n.length;i++)if(""!=A.trim(n[i]))for(var s=n[i].split("{"),a=s[0].split(","),r=s[1].split(";"),o=0;o<a.length;o++){var l=A.trim(a[o]);if(""!=l){for(var h=A.Styles[l]||{},u=0;u<r.length;u++){var c=r[u].indexOf(":"),f=r[u].substr(0,c),m=r[u].substr(c+1,r[u].length-c);null!=f&&null!=m&&(h[A.trim(f)]=new A.Property(A.trim(f),A.trim(m)))}if(A.Styles[l]=h,A.StylesSpecificity[l]=w(l),"@font-face"==l)for(var p=h["font-family"].value.replace(/"/g,""),d=h.src.value.split(","),y=0;y<d.length;y++)if(0<d[y].indexOf('format("svg")'))for(var v=d[y].indexOf("url"),g=d[y].indexOf(")",v),x=d[y].substr(v+5,g-v-6),b=A.parseXml(A.ajax(x)).getElementsByTagName("font"),P=0;P<b.length;P++){var E=A.CreateElement(b[P]);A.Definitions[p]=E}}}},A.Element.style.prototype=new A.Element.ElementBase,A.Element.use=function(t){this.base=A.Element.RenderedElementBase,this.base(t),this.baseSetContext=this.setContext,this.setContext=function(t){this.baseSetContext(t),this.attribute("x").hasValue()&&t.translate(this.attribute("x").toPixels("x"),0),this.attribute("y").hasValue()&&t.translate(0,this.attribute("y").toPixels("y"))};var n=this.getHrefAttribute().getDefinition();this.path=function(t){null!=n&&n.path(t)},this.elementTransform=function(){if(null!=n&&n.style("transform",!1,!0).hasValue())return new A.Transform(n.style("transform",!1,!0).value)},this.getBoundingBox=function(t){if(null!=n)return n.getBoundingBox(t)},this.renderChildren=function(t){if(null!=n){var e=n;"symbol"==n.type&&((e=new A.Element.svg).type="svg",e.attributes.viewBox=new A.Property("viewBox",n.attribute("viewBox").value),e.attributes.preserveAspectRatio=new A.Property("preserveAspectRatio",n.attribute("preserveAspectRatio").value),e.attributes.overflow=new A.Property("overflow",n.attribute("overflow").value),e.children=n.children),"svg"==e.type&&(this.attribute("width").hasValue()&&(e.attributes.width=new A.Property("width",this.attribute("width").value)),this.attribute("height").hasValue()&&(e.attributes.height=new A.Property("height",this.attribute("height").value)));var i=e.parent;e.parent=null,e.render(t),e.parent=i}}},A.Element.use.prototype=new A.Element.RenderedElementBase,A.Element.mask=function(t){this.base=A.Element.ElementBase,this.base(t),this.apply=function(t,e){var i=this.attribute("x").toPixels("x"),n=this.attribute("y").toPixels("y"),s=this.attribute("width").toPixels("x"),a=this.attribute("height").toPixels("y");if(0==s&&0==a){for(var r=new A.BoundingBox,o=0;o<this.children.length;o++)r.addBoundingBox(this.children[o].getBoundingBox(t));i=Math.floor(r.x1),n=Math.floor(r.y1),s=Math.floor(r.width()),a=Math.floor(r.height())}var l=e.attribute("mask").value;e.attribute("mask").value="";var h=p();h.width=i+s,h.height=n+a;var u=h.getContext("2d");this.renderChildren(u);var c=p();c.width=i+s,c.height=n+a;var f=c.getContext("2d");e.render(f),f.globalCompositeOperation="destination-in",f.fillStyle=u.createPattern(h,"no-repeat"),f.fillRect(0,0,i+s,n+a),t.fillStyle=f.createPattern(c,"no-repeat"),t.fillRect(0,0,i+s,n+a),e.attribute("mask").value=l},this.render=function(t){}},A.Element.mask.prototype=new A.Element.ElementBase,A.Element.clipPath=function(t){this.base=A.Element.ElementBase,this.base(t),this.apply=function(t){var e="undefined"!=typeof CanvasRenderingContext2D,i=t.beginPath,n=t.closePath;e&&(CanvasRenderingContext2D.prototype.beginPath=function(){},CanvasRenderingContext2D.prototype.closePath=function(){}),i.call(t);for(var s=0;s<this.children.length;s++){var a=this.children[s];if(void 0!==a.path){var r=void 0!==a.elementTransform&&a.elementTransform();!r&&a.style("transform",!1,!0).hasValue()&&(r=new A.Transform(a.style("transform",!1,!0).value)),r&&r.apply(t),a.path(t),e&&(CanvasRenderingContext2D.prototype.closePath=n),r&&r.unapply(t)}}n.call(t),t.clip(),e&&(CanvasRenderingContext2D.prototype.beginPath=i,CanvasRenderingContext2D.prototype.closePath=n)},this.render=function(t){}},A.Element.clipPath.prototype=new A.Element.ElementBase,A.Element.filter=function(t){this.base=A.Element.ElementBase,this.base(t),this.apply=function(t,e){var i=e.getBoundingBox(t),n=Math.floor(i.x1),s=Math.floor(i.y1),a=Math.floor(i.width()),r=Math.floor(i.height()),o=e.style("filter").value;e.style("filter").value="";for(var l=0,h=0,u=0;u<this.children.length;u++){var c=this.children[u].extraFilterDistance||0;l=Math.max(l,c),h=Math.max(h,c)}var f=p();f.width=a+2*l,f.height=r+2*h;var m=f.getContext("2d");for(m.translate(-n+l,-s+h),e.render(m),u=0;u<this.children.length;u++)"function"==typeof this.children[u].apply&&this.children[u].apply(m,0,0,a+2*l,r+2*h);t.drawImage(f,0,0,a+2*l,r+2*h,n-l,s-h,a+2*l,r+2*h),e.style("filter",!0).value=o},this.render=function(t){}},A.Element.filter.prototype=new A.Element.ElementBase,A.Element.feMorphology=function(t){this.base=A.Element.ElementBase,this.base(t),this.apply=function(t,e,i,n,s){}},A.Element.feMorphology.prototype=new A.Element.ElementBase,A.Element.feComposite=function(t){this.base=A.Element.ElementBase,this.base(t),this.apply=function(t,e,i,n,s){}},A.Element.feComposite.prototype=new A.Element.ElementBase,A.Element.feColorMatrix=function(t){this.base=A.Element.ElementBase,this.base(t);var n=A.ToNumberArray(this.attribute("values").value);switch(this.attribute("type").valueOrDefault("matrix")){case"saturate":var e=n[0];n=[.213+.787*e,.715-.715*e,.072-.072*e,0,0,.213-.213*e,.715+.285*e,.072-.072*e,0,0,.213-.213*e,.715-.715*e,.072+.928*e,0,0,0,0,0,1,0,0,0,0,0,1];break;case"hueRotate":var s=n[0]*Math.PI/180,i=function(t,e,i){return t+Math.cos(s)*e+Math.sin(s)*i};n=[i(.213,.787,-.213),i(.715,-.715,-.715),i(.072,-.072,.928),0,0,i(.213,-.213,.143),i(.715,.285,.14),i(.072,-.072,-.283),0,0,i(.213,-.213,-.787),i(.715,-.715,.715),i(.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break;case"luminanceToAlpha":n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1]}function u(t,e,i,n,s,a){return t[i*n*4+4*e+a]}function c(t,e,i,n,s,a,r){t[i*n*4+4*e+a]=r}function f(t,e){var i=n[t];return i*(i<0?e-255:e)}this.apply=function(t,e,i,n,s){var a=t.getImageData(0,0,n,s);for(i=0;i<s;i++)for(e=0;e<n;e++){var r=u(a.data,e,i,n,0,0),o=u(a.data,e,i,n,0,1),l=u(a.data,e,i,n,0,2),h=u(a.data,e,i,n,0,3);c(a.data,e,i,n,0,0,f(0,r)+f(1,o)+f(2,l)+f(3,h)+f(4,1)),c(a.data,e,i,n,0,1,f(5,r)+f(6,o)+f(7,l)+f(8,h)+f(9,1)),c(a.data,e,i,n,0,2,f(10,r)+f(11,o)+f(12,l)+f(13,h)+f(14,1)),c(a.data,e,i,n,0,3,f(15,r)+f(16,o)+f(17,l)+f(18,h)+f(19,1))}t.clearRect(0,0,n,s),t.putImageData(a,0,0)}},A.Element.feColorMatrix.prototype=new A.Element.ElementBase,A.Element.feGaussianBlur=function(t){this.base=A.Element.ElementBase,this.base(t),this.blurRadius=Math.floor(this.attribute("stdDeviation").numValue()),this.extraFilterDistance=this.blurRadius,this.apply=function(t,e,i,n,s){d&&void 0!==d.canvasRGBA?(t.canvas.id=A.UniqueId(),t.canvas.style.display="none",document.body.appendChild(t.canvas),d.canvasRGBA(t.canvas,e,i,n,s,this.blurRadius),document.body.removeChild(t.canvas)):A.log("ERROR: StackBlur.js must be included for blur to work")}},A.Element.feGaussianBlur.prototype=new A.Element.ElementBase,A.Element.title=function(t){},A.Element.title.prototype=new A.Element.ElementBase,A.Element.desc=function(t){},A.Element.desc.prototype=new A.Element.ElementBase,A.Element.MISSING=function(t){A.log("ERROR: Element '"+t.nodeName+"' not yet implemented.")},A.Element.MISSING.prototype=new A.Element.ElementBase,A.CreateElement=function(t){var e=t.nodeName.replace(/^[^:]+:/,"");e=e.replace(/\-/g,"");var i=null;return(i=void 0!==A.Element[e]?new A.Element[e](t):new A.Element.MISSING(t)).type=t.nodeName,i},A.load=function(t,e){A.loadXml(t,A.ajax(e))},A.loadXml=function(t,e){A.loadXmlDoc(t,A.parseXml(e))},A.loadXmlDoc=function(a,r){A.init(a);var i=function(t){for(var e=a.canvas;e;)t.x-=e.offsetLeft,t.y-=e.offsetTop,e=e.offsetParent;return u.scrollX&&(t.x+=u.scrollX),u.scrollY&&(t.y+=u.scrollY),t};1!=A.opts.ignoreMouse&&(a.canvas.onclick=function(t){var e=i(new A.Point(null!=t?t.clientX:event.clientX,null!=t?t.clientY:event.clientY));A.Mouse.onclick(e.x,e.y)},a.canvas.onmousemove=function(t){var e=i(new A.Point(null!=t?t.clientX:event.clientX,null!=t?t.clientY:event.clientY));A.Mouse.onmousemove(e.x,e.y)});var o=A.CreateElement(r.documentElement);o.root=!0,o.addStylesFromStyleDefinition();var l=!0,n=function(){A.ViewPort.Clear(),a.canvas.parentNode?A.ViewPort.SetCurrent(a.canvas.parentNode.clientWidth,a.canvas.parentNode.clientHeight):A.ViewPort.SetCurrent(800,600),1!=A.opts.ignoreDimensions&&(o.style("width").hasValue()&&(a.canvas.width=o.style("width").toPixels("x"),a.canvas.style&&(a.canvas.style.width=a.canvas.width+"px")),o.style("height").hasValue()&&(a.canvas.height=o.style("height").toPixels("y"),a.canvas.style&&(a.canvas.style.height=a.canvas.height+"px")));var t=a.canvas.clientWidth||a.canvas.width,e=a.canvas.clientHeight||a.canvas.height;if(1==A.opts.ignoreDimensions&&o.style("width").hasValue()&&o.style("height").hasValue()&&(t=o.style("width").toPixels("x"),e=o.style("height").toPixels("y")),A.ViewPort.SetCurrent(t,e),null!=A.opts.offsetX&&(o.attribute("x",!0).value=A.opts.offsetX),null!=A.opts.offsetY&&(o.attribute("y",!0).value=A.opts.offsetY),null!=A.opts.scaleWidth||null!=A.opts.scaleHeight){var i=null,n=null,s=A.ToNumberArray(o.attribute("viewBox").value);null!=A.opts.scaleWidth&&(o.attribute("width").hasValue()?i=o.attribute("width").toPixels("x")/A.opts.scaleWidth:isNaN(s[2])||(i=s[2]/A.opts.scaleWidth)),null!=A.opts.scaleHeight&&(o.attribute("height").hasValue()?n=o.attribute("height").toPixels("y")/A.opts.scaleHeight:isNaN(s[3])||(n=s[3]/A.opts.scaleHeight)),null==i&&(i=n),null==n&&(n=i),o.attribute("width",!0).value=A.opts.scaleWidth,o.attribute("height",!0).value=A.opts.scaleHeight,o.style("transform",!0,!0).value+=" scale("+1/i+","+1/n+")"}1!=A.opts.ignoreClear&&a.clearRect(0,0,t,e),o.render(a),l&&(l=!1,"function"==typeof A.opts.renderCallback&&A.opts.renderCallback(r))},s=!0;A.ImagesLoaded()&&(s=!1,n()),A.intervalID=setInterval(function(){var t=!1;if(s&&A.ImagesLoaded()&&(t=!(s=!1)),1!=A.opts.ignoreMouse&&(t|=A.Mouse.hasEvents()),1!=A.opts.ignoreAnimation)for(var e=0;e<A.Animations.length;e++)t|=A.Animations[e].update(1e3/A.FRAMERATE);"function"==typeof A.opts.forceRedraw&&1==A.opts.forceRedraw()&&(t=!0),t&&(n(),A.Mouse.runEvents())},1e3/A.FRAMERATE)},A.stop=function(){A.intervalID&&clearInterval(A.intervalID)},A.Mouse=new function(){this.events=[],this.hasEvents=function(){return 0!=this.events.length},this.onclick=function(t,e){this.events.push({type:"onclick",x:t,y:e,run:function(t){t.onclick&&t.onclick()}})},this.onmousemove=function(t,e){this.events.push({type:"onmousemove",x:t,y:e,run:function(t){t.onmousemove&&t.onmousemove()}})},this.eventElements=[],this.checkPath=function(t,e){for(var i=0;i<this.events.length;i++){var n=this.events[i];e.isPointInPath&&e.isPointInPath(n.x,n.y)&&(this.eventElements[i]=t)}},this.checkBoundingBox=function(t,e){for(var i=0;i<this.events.length;i++){var n=this.events[i];e.isPointInBox(n.x,n.y)&&(this.eventElements[i]=t)}},this.runEvents=function(){A.ctx.canvas.style.cursor="";for(var t=0;t<this.events.length;t++)for(var e=this.events[t],i=this.eventElements[t];i;)e.run(i),i=i.parent;this.events=[],this.eventElements=[]}},A}(i||{});"string"==typeof t&&(t=document.getElementById(t)),null!=t.svg&&t.svg.stop(),t.childNodes&&1==t.childNodes.length&&"OBJECT"==t.childNodes[0].nodeName||(t.svg=n);var s=t.getContext("2d");void 0!==e.documentElement?n.loadXmlDoc(s,e):"<"==e.substr(0,1)?n.loadXml(s,e):n.load(s,e)}else for(var a=document.querySelectorAll("svg"),r=0;r<a.length;r++){var o=a[r],l=document.createElement("canvas");l.width=o.clientWidth,l.height=o.clientHeight,o.parentNode.insertBefore(l,o),o.parentNode.removeChild(o);var h=document.createElement("div");h.appendChild(o),c(l,h.innerHTML)}};"undefined"==typeof Element||(void 0!==Element.prototype.matches?f=function(t,e){return t.matches(e)}:void 0!==Element.prototype.webkitMatchesSelector?f=function(t,e){return t.webkitMatchesSelector(e)}:void 0!==Element.prototype.mozMatchesSelector?f=function(t,e){return t.mozMatchesSelector(e)}:void 0!==Element.prototype.msMatchesSelector?f=function(t,e){return t.msMatchesSelector(e)}:void 0!==Element.prototype.oMatchesSelector?f=function(t,e){return t.oMatchesSelector(e)}:("function"!=typeof jQuery&&"function"!=typeof Zepto||(f=function(t,e){return $(t).is(e)}),void 0===f&&"undefined"!=typeof Sizzle&&(f=Sizzle.matchesSelector)));var e=/(\[[^\]]+\])/g,i=/(#[^\s\+>~\.\[:]+)/g,a=/(\.[^\s\+>~\.\[:]+)/g,r=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi,o=/(:[\w-]+\([^\)]*\))/gi,l=/(:[^\s\+>~\.\[:]+)/g,h=/([^\s\+>~\.\[:]+)/g;function w(n){var s=[0,0,0],t=function(t,e){var i=n.match(t);null!=i&&(s[e]+=i.length,n=n.replace(t," "))};return n=(n=n.replace(/:not\(([^\)]*)\)/g," $1 ")).replace(/{[\s\S]*/gm," "),t(e,1),t(i,0),t(a,1),t(r,2),t(o,1),t(l,1),n=(n=n.replace(/[\*\s\+>~]/g," ")).replace(/[#\.]/g," "),t(h,2),s.join("")}"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.drawSvg=function(t,e,i,n,s,a){var r={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:e,offsetY:i,scaleWidth:n,scaleHeight:s};for(var o in a)a.hasOwnProperty(o)&&(r[o]=a[o]);c(this.canvas,t,r)}),t.exports=c}(t={exports:{}},t.exports),t.exports});
- /***/ }),
- /* 98 */
- /***/ (function(module, exports) {
- /*
- Based on rgbcolor.js by Stoyan Stefanov <sstoo@gmail.com>
- http://www.phpied.com/rgb-color-parser-in-javascript/
- */
- module.exports = function(color_string) {
- this.ok = false;
- this.alpha = 1.0;
- // strip any leading #
- if (color_string.charAt(0) == '#') { // remove # if any
- color_string = color_string.substr(1,6);
- }
- color_string = color_string.replace(/ /g,'');
- color_string = color_string.toLowerCase();
- // before getting into regexps, try simple matches
- // and overwrite the input
- var simple_colors = {
- aliceblue: 'f0f8ff',
- antiquewhite: 'faebd7',
- aqua: '00ffff',
- aquamarine: '7fffd4',
- azure: 'f0ffff',
- beige: 'f5f5dc',
- bisque: 'ffe4c4',
- black: '000000',
- blanchedalmond: 'ffebcd',
- blue: '0000ff',
- blueviolet: '8a2be2',
- brown: 'a52a2a',
- burlywood: 'deb887',
- cadetblue: '5f9ea0',
- chartreuse: '7fff00',
- chocolate: 'd2691e',
- coral: 'ff7f50',
- cornflowerblue: '6495ed',
- cornsilk: 'fff8dc',
- crimson: 'dc143c',
- cyan: '00ffff',
- darkblue: '00008b',
- darkcyan: '008b8b',
- darkgoldenrod: 'b8860b',
- darkgray: 'a9a9a9',
- darkgreen: '006400',
- darkkhaki: 'bdb76b',
- darkmagenta: '8b008b',
- darkolivegreen: '556b2f',
- darkorange: 'ff8c00',
- darkorchid: '9932cc',
- darkred: '8b0000',
- darksalmon: 'e9967a',
- darkseagreen: '8fbc8f',
- darkslateblue: '483d8b',
- darkslategray: '2f4f4f',
- darkturquoise: '00ced1',
- darkviolet: '9400d3',
- deeppink: 'ff1493',
- deepskyblue: '00bfff',
- dimgray: '696969',
- dodgerblue: '1e90ff',
- feldspar: 'd19275',
- firebrick: 'b22222',
- floralwhite: 'fffaf0',
- forestgreen: '228b22',
- fuchsia: 'ff00ff',
- gainsboro: 'dcdcdc',
- ghostwhite: 'f8f8ff',
- gold: 'ffd700',
- goldenrod: 'daa520',
- gray: '808080',
- green: '008000',
- greenyellow: 'adff2f',
- honeydew: 'f0fff0',
- hotpink: 'ff69b4',
- indianred : 'cd5c5c',
- indigo : '4b0082',
- ivory: 'fffff0',
- khaki: 'f0e68c',
- lavender: 'e6e6fa',
- lavenderblush: 'fff0f5',
- lawngreen: '7cfc00',
- lemonchiffon: 'fffacd',
- lightblue: 'add8e6',
- lightcoral: 'f08080',
- lightcyan: 'e0ffff',
- lightgoldenrodyellow: 'fafad2',
- lightgrey: 'd3d3d3',
- lightgreen: '90ee90',
- lightpink: 'ffb6c1',
- lightsalmon: 'ffa07a',
- lightseagreen: '20b2aa',
- lightskyblue: '87cefa',
- lightslateblue: '8470ff',
- lightslategray: '778899',
- lightsteelblue: 'b0c4de',
- lightyellow: 'ffffe0',
- lime: '00ff00',
- limegreen: '32cd32',
- linen: 'faf0e6',
- magenta: 'ff00ff',
- maroon: '800000',
- mediumaquamarine: '66cdaa',
- mediumblue: '0000cd',
- mediumorchid: 'ba55d3',
- mediumpurple: '9370d8',
- mediumseagreen: '3cb371',
- mediumslateblue: '7b68ee',
- mediumspringgreen: '00fa9a',
- mediumturquoise: '48d1cc',
- mediumvioletred: 'c71585',
- midnightblue: '191970',
- mintcream: 'f5fffa',
- mistyrose: 'ffe4e1',
- moccasin: 'ffe4b5',
- navajowhite: 'ffdead',
- navy: '000080',
- oldlace: 'fdf5e6',
- olive: '808000',
- olivedrab: '6b8e23',
- orange: 'ffa500',
- orangered: 'ff4500',
- orchid: 'da70d6',
- palegoldenrod: 'eee8aa',
- palegreen: '98fb98',
- paleturquoise: 'afeeee',
- palevioletred: 'd87093',
- papayawhip: 'ffefd5',
- peachpuff: 'ffdab9',
- peru: 'cd853f',
- pink: 'ffc0cb',
- plum: 'dda0dd',
- powderblue: 'b0e0e6',
- purple: '800080',
- rebeccapurple: '663399',
- red: 'ff0000',
- rosybrown: 'bc8f8f',
- royalblue: '4169e1',
- saddlebrown: '8b4513',
- salmon: 'fa8072',
- sandybrown: 'f4a460',
- seagreen: '2e8b57',
- seashell: 'fff5ee',
- sienna: 'a0522d',
- silver: 'c0c0c0',
- skyblue: '87ceeb',
- slateblue: '6a5acd',
- slategray: '708090',
- snow: 'fffafa',
- springgreen: '00ff7f',
- steelblue: '4682b4',
- tan: 'd2b48c',
- teal: '008080',
- thistle: 'd8bfd8',
- tomato: 'ff6347',
- turquoise: '40e0d0',
- violet: 'ee82ee',
- violetred: 'd02090',
- wheat: 'f5deb3',
- white: 'ffffff',
- whitesmoke: 'f5f5f5',
- yellow: 'ffff00',
- yellowgreen: '9acd32'
- };
- color_string = simple_colors[color_string] || color_string;
- // emd of simple type-in colors
- // array of color definition objects
- var color_defs = [
- {
- re: /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,
- example: ['rgba(123, 234, 45, 0.8)', 'rgba(255,234,245,1.0)'],
- process: function (bits){
- return [
- parseInt(bits[1]),
- parseInt(bits[2]),
- parseInt(bits[3]),
- parseFloat(bits[4])
- ];
- }
- },
- {
- re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
- example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
- process: function (bits){
- return [
- parseInt(bits[1]),
- parseInt(bits[2]),
- parseInt(bits[3])
- ];
- }
- },
- {
- re: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
- example: ['#00ff00', '336699'],
- process: function (bits){
- return [
- parseInt(bits[1], 16),
- parseInt(bits[2], 16),
- parseInt(bits[3], 16)
- ];
- }
- },
- {
- re: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- example: ['#fb0', 'f0f'],
- process: function (bits){
- return [
- parseInt(bits[1] + bits[1], 16),
- parseInt(bits[2] + bits[2], 16),
- parseInt(bits[3] + bits[3], 16)
- ];
- }
- }
- ];
- // search through the definitions to find a match
- for (var i = 0; i < color_defs.length; i++) {
- var re = color_defs[i].re;
- var processor = color_defs[i].process;
- var bits = re.exec(color_string);
- if (bits) {
- var channels = processor(bits);
- this.r = channels[0];
- this.g = channels[1];
- this.b = channels[2];
- if (channels.length > 3) {
- this.alpha = channels[3];
- }
- this.ok = true;
- }
- }
- // validate/cleanup values
- this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
- this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
- this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
- this.alpha = (this.alpha < 0) ? 0 : ((this.alpha > 1.0 || isNaN(this.alpha)) ? 1.0 : this.alpha);
- // some getters
- this.toRGB = function () {
- return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
- }
- this.toRGBA = function () {
- return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.alpha + ')';
- }
- this.toHex = function () {
- var r = this.r.toString(16);
- var g = this.g.toString(16);
- var b = this.b.toString(16);
- if (r.length == 1) r = '0' + r;
- if (g.length == 1) g = '0' + g;
- if (b.length == 1) b = '0' + b;
- return '#' + r + g + b;
- }
- // help
- this.getHelpXML = function () {
- var examples = new Array();
- // add regexps
- for (var i = 0; i < color_defs.length; i++) {
- var example = color_defs[i].example;
- for (var j = 0; j < example.length; j++) {
- examples[examples.length] = example[j];
- }
- }
- // add type-in colors
- for (var sc in simple_colors) {
- examples[examples.length] = sc;
- }
- var xml = document.createElement('ul');
- xml.setAttribute('id', 'rgbcolor-examples');
- for (var i = 0; i < examples.length; i++) {
- try {
- var list_item = document.createElement('li');
- var list_color = new RGBColor(examples[i]);
- var example_div = document.createElement('div');
- example_div.style.cssText =
- 'margin: 3px; '
- + 'border: 1px solid black; '
- + 'background:' + list_color.toHex() + '; '
- + 'color:' + list_color.toHex()
- ;
- example_div.appendChild(document.createTextNode('test'));
- var list_item_value = document.createTextNode(
- ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
- );
- list_item.appendChild(example_div);
- list_item.appendChild(list_item_value);
- xml.appendChild(list_item);
- } catch(e){}
- }
- return xml;
- }
- }
- /***/ }),
- /* 99 */
- /***/ (function(module, exports) {
- /*
- StackBlur - a fast almost Gaussian Blur For Canvas
- Version: 0.5
- Author: Mario Klingemann
- Contact: mario@quasimondo.com
- Website: http://www.quasimondo.com/StackBlurForCanvas
- Twitter: @quasimondo
- In case you find this class useful - especially in commercial projects -
- I am not totally unhappy for a small donation to my PayPal account
- mario@quasimondo.de
- Or support me on flattr:
- https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
- Copyright (c) 2010 Mario Klingemann
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- */
- var mul_table = [
- 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,
- 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,
- 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,
- 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,
- 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,
- 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,
- 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,
- 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,
- 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,
- 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,
- 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,
- 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,
- 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,
- 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,
- 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,
- 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];
- var shg_table = [
- 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
- 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ];
- function processImage(img, canvas, radius, blurAlphaChannel)
- {
- if (typeof(img) == 'string') {
- var img = document.getElementById(img);
- }
- else if (typeof HTMLImageElement !== 'undefined' && !img instanceof HTMLImageElement) {
- return;
- }
- var w = img.naturalWidth;
- var h = img.naturalHeight;
- if (typeof(canvas) == 'string') {
- var canvas = document.getElementById(canvas);
- }
- else if (typeof HTMLCanvasElement !== 'undefined' && !canvas instanceof HTMLCanvasElement) {
- return;
- }
- canvas.style.width = w + 'px';
- canvas.style.height = h + 'px';
- canvas.width = w;
- canvas.height = h;
- var context = canvas.getContext('2d');
- context.clearRect(0, 0, w, h);
- context.drawImage(img, 0, 0);
- if (isNaN(radius) || radius < 1) return;
- if (blurAlphaChannel)
- processCanvasRGBA(canvas, 0, 0, w, h, radius);
- else
- processCanvasRGB(canvas, 0, 0, w, h, radius);
- }
- function getImageDataFromCanvas(canvas, top_x, top_y, width, height)
- {
- if (typeof(canvas) == 'string')
- var canvas = document.getElementById(canvas);
- else if (typeof HTMLCanvasElement !== 'undefined' && !canvas instanceof HTMLCanvasElement)
- return;
- var context = canvas.getContext('2d');
- var imageData;
- try {
- try {
- imageData = context.getImageData(top_x, top_y, width, height);
- } catch(e) {
- throw new Error("unable to access local image data: " + e);
- return;
- }
- } catch(e) {
- throw new Error("unable to access image data: " + e);
- }
- return imageData;
- }
- function processCanvasRGBA(canvas, top_x, top_y, width, height, radius)
- {
- if (isNaN(radius) || radius < 1) return;
- radius |= 0;
- var imageData = getImageDataFromCanvas(canvas, top_x, top_y, width, height);
- imageData = processImageDataRGBA(imageData, top_x, top_y, width, height, radius);
- canvas.getContext('2d').putImageData(imageData, top_x, top_y);
- }
- function processImageDataRGBA(imageData, top_x, top_y, width, height, radius)
- {
- var pixels = imageData.data;
- var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum,
- r_out_sum, g_out_sum, b_out_sum, a_out_sum,
- r_in_sum, g_in_sum, b_in_sum, a_in_sum,
- pr, pg, pb, pa, rbs;
- var div = radius + radius + 1;
- var w4 = width << 2;
- var widthMinus1 = width - 1;
- var heightMinus1 = height - 1;
- var radiusPlus1 = radius + 1;
- var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
- var stackStart = new BlurStack();
- var stack = stackStart;
- for (i = 1; i < div; i++)
- {
- stack = stack.next = new BlurStack();
- if (i == radiusPlus1) var stackEnd = stack;
- }
- stack.next = stackStart;
- var stackIn = null;
- var stackOut = null;
- yw = yi = 0;
- var mul_sum = mul_table[radius];
- var shg_sum = shg_table[radius];
- for (y = 0; y < height; y++)
- {
- r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi+1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi+2]);
- a_out_sum = radiusPlus1 * (pa = pixels[yi+3]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- a_sum += sumFactor * pa;
- stack = stackStart;
- for (i = 0; i < radiusPlus1; i++)
- {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack.a = pa;
- stack = stack.next;
- }
- for (i = 1; i < radiusPlus1; i++)
- {
- p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
- r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[p+1])) * rbs;
- b_sum += (stack.b = (pb = pixels[p+2])) * rbs;
- a_sum += (stack.a = (pa = pixels[p+3])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- a_in_sum += pa;
- stack = stack.next;
- }
- stackIn = stackStart;
- stackOut = stackEnd;
- for (x = 0; x < width; x++)
- {
- pixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum;
- if (pa != 0)
- {
- pa = 255 / pa;
- pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
- pixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa;
- pixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa;
- } else {
- pixels[yi] = pixels[yi+1] = pixels[yi+2] = 0;
- }
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- a_sum -= a_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- a_out_sum -= stackIn.a;
- p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
- r_in_sum += (stackIn.r = pixels[p]);
- g_in_sum += (stackIn.g = pixels[p+1]);
- b_in_sum += (stackIn.b = pixels[p+2]);
- a_in_sum += (stackIn.a = pixels[p+3]);
- r_sum += r_in_sum;
- g_sum += g_in_sum;
- b_sum += b_in_sum;
- a_sum += a_in_sum;
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- a_out_sum += (pa = stackOut.a);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- a_in_sum -= pa;
- stackOut = stackOut.next;
- yi += 4;
- }
- yw += width;
- }
- for (x = 0; x < width; x++)
- {
- g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
- yi = x << 2;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi+1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi+2]);
- a_out_sum = radiusPlus1 * (pa = pixels[yi+3]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- a_sum += sumFactor * pa;
- stack = stackStart;
- for (i = 0; i < radiusPlus1; i++)
- {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack.a = pa;
- stack = stack.next;
- }
- yp = width;
- for (i = 1; i <= radius; i++)
- {
- yi = (yp + x) << 2;
- r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[yi+1])) * rbs;
- b_sum += (stack.b = (pb = pixels[yi+2])) * rbs;
- a_sum += (stack.a = (pa = pixels[yi+3])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- a_in_sum += pa;
- stack = stack.next;
- if(i < heightMinus1)
- {
- yp += width;
- }
- }
- yi = x;
- stackIn = stackStart;
- stackOut = stackEnd;
- for (y = 0; y < height; y++)
- {
- p = yi << 2;
- pixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum;
- if (pa > 0)
- {
- pa = 255 / pa;
- pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;
- pixels[p+1] = ((g_sum * mul_sum) >> shg_sum) * pa;
- pixels[p+2] = ((b_sum * mul_sum) >> shg_sum) * pa;
- } else {
- pixels[p] = pixels[p+1] = pixels[p+2] = 0;
- }
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- a_sum -= a_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- a_out_sum -= stackIn.a;
- p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
- r_sum += (r_in_sum += (stackIn.r = pixels[p]));
- g_sum += (g_in_sum += (stackIn.g = pixels[p+1]));
- b_sum += (b_in_sum += (stackIn.b = pixels[p+2]));
- a_sum += (a_in_sum += (stackIn.a = pixels[p+3]));
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- a_out_sum += (pa = stackOut.a);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- a_in_sum -= pa;
- stackOut = stackOut.next;
- yi += width;
- }
- }
- return imageData;
- }
- function processCanvasRGB(canvas, top_x, top_y, width, height, radius)
- {
- if (isNaN(radius) || radius < 1) return;
- radius |= 0;
- var imageData = getImageDataFromCanvas(canvas, top_x, top_y, width, height);
- imageData = processImageDataRGB(imageData, top_x, top_y, width, height, radius);
- canvas.getContext('2d').putImageData(imageData, top_x, top_y);
- }
- function processImageDataRGB(imageData, top_x, top_y, width, height, radius)
- {
- var pixels = imageData.data;
- var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum,
- r_out_sum, g_out_sum, b_out_sum,
- r_in_sum, g_in_sum, b_in_sum,
- pr, pg, pb, rbs;
- var div = radius + radius + 1;
- var w4 = width << 2;
- var widthMinus1 = width - 1;
- var heightMinus1 = height - 1;
- var radiusPlus1 = radius + 1;
- var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
- var stackStart = new BlurStack();
- var stack = stackStart;
- for (i = 1; i < div; i++)
- {
- stack = stack.next = new BlurStack();
- if (i == radiusPlus1) var stackEnd = stack;
- }
- stack.next = stackStart;
- var stackIn = null;
- var stackOut = null;
- yw = yi = 0;
- var mul_sum = mul_table[radius];
- var shg_sum = shg_table[radius];
- for (y = 0; y < height; y++)
- {
- r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi+1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi+2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = 0; i < radiusPlus1; i++)
- {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- for (i = 1; i < radiusPlus1; i++)
- {
- p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
- r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[p+1])) * rbs;
- b_sum += (stack.b = (pb = pixels[p+2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- }
- stackIn = stackStart;
- stackOut = stackEnd;
- for (x = 0; x < width; x++)
- {
- pixels[yi] = (r_sum * mul_sum) >> shg_sum;
- pixels[yi+1] = (g_sum * mul_sum) >> shg_sum;
- pixels[yi+2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
- r_in_sum += (stackIn.r = pixels[p]);
- g_in_sum += (stackIn.g = pixels[p+1]);
- b_in_sum += (stackIn.b = pixels[p+2]);
- r_sum += r_in_sum;
- g_sum += g_in_sum;
- b_sum += b_in_sum;
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += 4;
- }
- yw += width;
- }
- for (x = 0; x < width; x++)
- {
- g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0;
- yi = x << 2;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi+1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi+2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = 0; i < radiusPlus1; i++)
- {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- yp = width;
- for (i = 1; i <= radius; i++)
- {
- yi = (yp + x) << 2;
- r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[yi+1])) * rbs;
- b_sum += (stack.b = (pb = pixels[yi+2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- if(i < heightMinus1)
- {
- yp += width;
- }
- }
- yi = x;
- stackIn = stackStart;
- stackOut = stackEnd;
- for (y = 0; y < height; y++)
- {
- p = yi << 2;
- pixels[p] = (r_sum * mul_sum) >> shg_sum;
- pixels[p+1] = (g_sum * mul_sum) >> shg_sum;
- pixels[p+2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
- r_sum += (r_in_sum += (stackIn.r = pixels[p]));
- g_sum += (g_in_sum += (stackIn.g = pixels[p+1]));
- b_sum += (b_in_sum += (stackIn.b = pixels[p+2]));
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += width;
- }
- }
- return imageData;
- }
- function BlurStack()
- {
- this.r = 0;
- this.g = 0;
- this.b = 0;
- this.a = 0;
- this.next = null;
- }
- module.exports = {
- image: processImage,
- canvasRGBA: processCanvasRGBA,
- canvasRGB: processCanvasRGB,
- imageDataRGBA: processImageDataRGBA,
- imageDataRGB: processImageDataRGB
- };
- /***/ }),
- /* 100 */
- /***/ (function(module) {
- module.exports = JSON.parse("[{\"name\":\"黑龙江省\",\"coord\":[127.64559817675396,48.48668098449708]},{\"name\":\"内蒙古自治区\",\"coord\":[118.34519572208615,45.370218276977525]},{\"name\":\"新疆维吾尔自治区\",\"coord\":[87.13479065593184,41.75497055053711]},{\"name\":\"吉林省\",\"coord\":[126.12985278813787,43.57983207702637]},{\"name\":\"辽宁省\",\"coord\":[124.02494773936439,41.105743408203125]},{\"name\":\"甘肃省\",\"coord\":[102.87785725633012,37.69582366943361]},{\"name\":\"河北省\",\"coord\":[115.66327227481898,39.33383178710938]},{\"name\":\"北京市\",\"coord\":[116.62199343603638,40.25053787231445]},{\"name\":\"山西省\",\"coord\":[112.45180235808988,37.666561126708984]},{\"name\":\"天津市\",\"coord\":[117.35711842642581,39.406789779663086]},{\"name\":\"陕西省\",\"coord\":[109.56294003056632,35.64754199981689]},{\"name\":\"宁夏回族自治区\",\"coord\":[105.96110877640074,37.3081169128418]},{\"name\":\"青海省\",\"coord\":[96.07301048277901,35.44417190551758]},{\"name\":\"山东省\",\"coord\":[118.03833752951093,36.29800605773925]},{\"name\":\"西藏自治区\",\"coord\":[87.47361520439412,31.6703872680664]},{\"name\":\"河南省\",\"coord\":[113.07832397097275,33.87751102447509]},{\"name\":\"江苏省\",\"coord\":[119.93926538201052,32.945452690124505]},{\"name\":\"安徽省\",\"coord\":[117.15146765881019,32.024482727050774]},{\"name\":\"四川省\",\"coord\":[102.28998890142759,30.182161331176758]},{\"name\":\"湖北省\",\"coord\":[112.87798261431585,31.157071113586426]},{\"name\":\"重庆市\",\"coord\":[107.870126637831,30.188085556030266]},{\"name\":\"上海市\",\"coord\":[121.42561166015514,31.276043891906745]},{\"name\":\"浙江省\",\"coord\":[119.75337092707514,29.175934791564945]},{\"name\":\"湖南省\",\"coord\":[111.52770282777405,27.38110256195069]},{\"name\":\"江西省\",\"coord\":[115.51091280655628,27.283511161804206]},{\"name\":\"云南省\",\"coord\":[101.27053825991308,25.19783210754396]},{\"name\":\"贵州省\",\"coord\":[106.49672346773299,26.92267990112305]},{\"name\":\"福建省\",\"coord\":[117.9976766946587,25.939599990844727]},{\"name\":\"广西壮族自治区\",\"coord\":[108.98706831086302,23.891559600830078]},{\"name\":\"台湾省\",\"coord\":[120.82468432537434,23.602651596069336]},{\"name\":\"香港特别行政区\",\"coord\":[114.21036850371561,22.374858856201172]},{\"name\":\"海南省\",\"coord\":[109.62792940960824,19.163116455078125]},{\"name\":\"广东省\",\"coord\":[113.32127888266032,22.873867034912106]},{\"name\":\"澳门特别行政区\",\"coord\":[113.56819996291901,22.160347992976]}]");
- /***/ }),
- /* 101 */
- /***/ (function(module) {
- module.exports = JSON.parse("[{\"name\":\"克拉玛依市\",\"coord\":[85.01486759299489,45.406422237230046]},{\"name\":\"昌吉回族自治州\",\"coord\":[88.7154624754753,44.26991024636568]},{\"name\":\"石河子市\",\"coord\":[86.0208600035924,44.239045558096805]},{\"name\":\"霍林郭勒市\",\"coord\":[114.73479243733115,44.16058374713977]},{\"name\":\"本溪市\",\"coord\":[124.64357865201586,41.177197783134275]},{\"name\":\"嘉峪关市\",\"coord\":[98.16891560537093,39.76279786284264]},{\"name\":\"莱芜市\",\"coord\":[117.65723565456207,36.27916499211527]},{\"name\":\"神农架林区\",\"coord\":[110.48296222218153,31.581260143666697]},{\"name\":\"天门市\",\"coord\":[113.00615321481195,30.64105781887143]},{\"name\":\"鄂州市\",\"coord\":[114.94764081970385,30.325634953844585]},{\"name\":\"潜江市\",\"coord\":[112.70703817700621,30.349210666019893]},{\"name\":\"仙桃市\",\"coord\":[113.34688900729822,30.315951161935402]},{\"name\":\"萍乡市\",\"coord\":[113.88072263074415,27.47193090553213]},{\"name\":\"台湾省\",\"coord\":[120.14338943402045,23.596002465926095]},{\"name\":\"东莞市\",\"coord\":[113.89443658529342,22.897826158636448]},{\"name\":\"中山市\",\"coord\":[113.37118387764659,22.501478858616522]},{\"name\":\"珠海市\",\"coord\":[113.21799258934986,22.23782602992192]},{\"name\":\"北海市\",\"coord\":[109.18248083043899,21.695773689750148]},{\"name\":\"香港\",\"coord\":[114.20689279508653,22.36016760139811]},{\"name\":\"舟山市\",\"coord\":[122.22514712841459,30.338633120695956]},{\"name\":\"克孜勒苏柯尔克孜\",\"coord\":[74.62910472637343,39.59886016069875]},{\"name\":\"喀什地区\",\"coord\":[77.19899922143753,37.85462871211595]},{\"name\":\"阿克苏地区\",\"coord\":[81.43930290016381,41.067304799230456]},{\"name\":\"和田地区\",\"coord\":[80.69780509160952,36.95287032287055]},{\"name\":\"阿里地区\",\"coord\":[82.536487505389,32.69566569631762]},{\"name\":\"日喀则地区\",\"coord\":[86.5996831353606,29.54861754814263]},{\"name\":\"那曲地区\",\"coord\":[88.32523292667608,33.20600450932715]},{\"name\":\"玉树藏族自治州\",\"coord\":[95.2107128446203,33.90320387919257]},{\"name\":\"迪庆藏族自治州\",\"coord\":[99.42465312188943,28.052797714348895]},{\"name\":\"怒江傈傈族自治州\",\"coord\":[98.85737910439825,26.98345757528851]},{\"name\":\"大理白族自治州\",\"coord\":[99.93934374816013,25.684737357453045]},{\"name\":\"德宏傣族景颇族自\",\"coord\":[98.13830877778075,24.593421919561205]},{\"name\":\"保山市\",\"coord\":[99.19031013453166,24.979380341662]},{\"name\":\"临沧市\",\"coord\":[99.62483778975081,24.058807858948214]},{\"name\":\"普洱市\",\"coord\":[100.94440267992684,23.44121660743221]},{\"name\":\"西双版纳傣族自治\",\"coord\":[100.86105801845994,21.882475641324206]},{\"name\":\"拉萨市\",\"coord\":[91.3684790613129,30.14176592960237]},{\"name\":\"山南地区\",\"coord\":[92.11665242621062,28.33000201578789]},{\"name\":\"林芝地区\",\"coord\":[94.9307847458166,29.125110156601963]},{\"name\":\"昌都地区\",\"coord\":[97.33912235873476,30.48520825551814]},{\"name\":\"丽江市\",\"coord\":[100.65713436205135,26.96190318191959]},{\"name\":\"攀枝花市\",\"coord\":[101.73355913301131,26.714486678752795]},{\"name\":\"凉山彝族自治州\",\"coord\":[102.08678551422615,27.683020519860396]},{\"name\":\"楚雄彝族自治州\",\"coord\":[101.68264761198458,25.369603845264024]},{\"name\":\"红河哈尼族彝族自\",\"coord\":[102.95101719613119,23.624860095239875]},{\"name\":\"文山壮族苗族自治\",\"coord\":[104.8708359910614,23.579587266862504]},{\"name\":\"百色市\",\"coord\":[106.69546907589859,23.98220841166522]},{\"name\":\"崇左市\",\"coord\":[107.3277087317123,22.49769755349952]},{\"name\":\"防城港市\",\"coord\":[107.88939931155171,21.94550204069006]},{\"name\":\"南宁市\",\"coord\":[108.67078983716917,23.12207641861882]},{\"name\":\"钦州市\",\"coord\":[108.8532307305186,22.157690108421384]},{\"name\":\"玉林市\",\"coord\":[110.26918466489103,22.391823643610415]},{\"name\":\"湛江市\",\"coord\":[109.93033457863683,21.086751055633457]},{\"name\":\"茂名市\",\"coord\":[110.80336192333934,22.069184739040775]},{\"name\":\"阳江市\",\"coord\":[111.70471342186183,22.108751366417575]},{\"name\":\"江门市\",\"coord\":[112.53715618649149,22.297368082806777]},{\"name\":\"广州市\",\"coord\":[113.4949302208309,23.28359314707863]},{\"name\":\"清远市\",\"coord\":[113.10957368131268,24.334444053233856]},{\"name\":\"肇庆市\",\"coord\":[112.11117530204233,23.60241158796112]},{\"name\":\"梧州市\",\"coord\":[111.01709510772797,23.518132876753846]},{\"name\":\"贺州市\",\"coord\":[111.50423061842756,24.4095096817199]},{\"name\":\"桂林市\",\"coord\":[110.44046163393094,25.353966673735407]},{\"name\":\"柳州市\",\"coord\":[109.34854449214147,24.972408051485047]},{\"name\":\"河池市\",\"coord\":[107.81191841865586,24.649291651298164]},{\"name\":\"黔东南苗族侗族自\",\"coord\":[108.39952601614591,26.429286420465576]},{\"name\":\"贵阳市\",\"coord\":[106.59784062851153,26.797907456479816]},{\"name\":\"安顺市\",\"coord\":[105.76161265300635,25.988644902171018]},{\"name\":\"黔西南布依族苗族\",\"coord\":[105.5954078788574,25.404850939549405]},{\"name\":\"曲靖市\",\"coord\":[103.9164335632742,25.697243690315265]},{\"name\":\"六盘水市\",\"coord\":[104.77723228072432,26.15402255629164]},{\"name\":\"毕节地区\",\"coord\":[105.03867422931839,27.077913968069666]},{\"name\":\"昭通市\",\"coord\":[104.29730513046874,27.62418247971078]},{\"name\":\"宜宾市\",\"coord\":[104.76748901448207,28.553501804266475]},{\"name\":\"乐山市\",\"coord\":[103.56027669102787,29.160754519210577]},{\"name\":\"自贡市\",\"coord\":[104.63272827056402,29.273152614922402]},{\"name\":\"内江市\",\"coord\":[104.82644562304716,29.61272653799929]},{\"name\":\"遵义市\",\"coord\":[106.82413636302059,28.191847588570702]},{\"name\":\"达州市\",\"coord\":[107.59704170009518,31.32138258839703]},{\"name\":\"遂宁市\",\"coord\":[105.48979445433736,30.677687821242678]},{\"name\":\"广安市\",\"coord\":[106.56708164098042,30.43500706741521]},{\"name\":\"泸州市\",\"coord\":[105.42591761727707,28.50277238478137]},{\"name\":\"资阳市\",\"coord\":[104.97995126874034,30.154251886139654]},{\"name\":\"雅安市\",\"coord\":[102.69931299964517,29.892630706195035]},{\"name\":\"眉山市\",\"coord\":[104.07052881858888,29.894202166560405]},{\"name\":\"甘孜藏族自治州\",\"coord\":[100.50721042614238,30.975216556269658]},{\"name\":\"果洛藏族自治州\",\"coord\":[99.30775565051923,34.03539865224808]},{\"name\":\"海南藏族自治州\",\"coord\":[100.39969108016373,35.90048272566899]},{\"name\":\"黄南藏族自治州\",\"coord\":[101.5360706381689,35.10286360841902]},{\"name\":\"赣南藏族自治州\",\"coord\":[102.97083885806067,34.326752803339026]},{\"name\":\"陇南市\",\"coord\":[105.24780098912132,33.57031117443431]},{\"name\":\"天水市\",\"coord\":[105.53503634660417,34.62320421368087]},{\"name\":\"定西市\",\"coord\":[104.58787768541339,35.08900966621695]},{\"name\":\"临夏回族自治州\",\"coord\":[103.2612870434902,35.591577124455235]},{\"name\":\"西宁市\",\"coord\":[101.57680657999033,36.84800271717157]},{\"name\":\"海东地区\",\"coord\":[102.30909850729282,36.287400615025646]},{\"name\":\"海北藏族自治州\",\"coord\":[100.27122484450717,37.892557516083826]},{\"name\":\"金昌市\",\"coord\":[102.02244049169511,38.497330414886164]},{\"name\":\"酒泉市\",\"coord\":[95.94486678270127,40.56891536586272]},{\"name\":\"海西蒙古族藏族自\",\"coord\":[94.67143298050689,36.022725148503724]},{\"name\":\"巴音郭楞蒙古自治\",\"coord\":[88.18116214759745,39.556478810319916]},{\"name\":\"哈密地区\",\"coord\":[93.84302392518026,42.95015211178875]},{\"name\":\"叶鲁番地区\",\"coord\":[89.82035217277885,42.399368632283505]},{\"name\":\"乌鲁木齐市\",\"coord\":[88.00048109561487,43.549986370786]},{\"name\":\"阿勒泰地区\",\"coord\":[88.11213933257655,47.05593413019629]},{\"name\":\"博尔塔拉蒙古自治\",\"coord\":[82.26402238163408,44.671135542630864]},{\"name\":\"伊犁哈萨克自治州\",\"coord\":[82.80778717477179,43.53783381365267]},{\"name\":\"阿拉善盟\",\"coord\":[103.29923966842289,40.10955801781495]},{\"name\":\"武威市\",\"coord\":[102.73362058791429,37.94211141321436]},{\"name\":\"兰州市\",\"coord\":[103.73793563506032,36.27379827886003]},{\"name\":\"中卫市\",\"coord\":[105.6943786030716,37.20654236148948]},{\"name\":\"银川市\",\"coord\":[106.20022174140034,38.52103167597483]},{\"name\":\"石嘴山市\",\"coord\":[106.41544011793628,38.84054137571417]},{\"name\":\"乌海市\",\"coord\":[106.8984175998405,39.54616572239788]},{\"name\":\"鄂尔多斯市\",\"coord\":[108.43285571424619,39.24036799350715]},{\"name\":\"巴彦淖尔市\",\"coord\":[107.45840392808307,41.30159860424196]},{\"name\":\"包头市\",\"coord\":[110.46472193224272,41.48017783644221]},{\"name\":\"呼和浩特市\",\"coord\":[111.48365173603975,40.498363056149884]},{\"name\":\"乌兰察布市\",\"coord\":[112.61568977597707,41.75789561273154]},{\"name\":\"大同市\",\"coord\":[113.7107192749083,39.898956799744184]},{\"name\":\"朔州市\",\"coord\":[112.65428748167508,39.681772914701924]},{\"name\":\"忻州市\",\"coord\":[112.36127575589583,38.88990233614568]},{\"name\":\"榆林市\",\"coord\":[109.68473112169593,38.19921027134876]},{\"name\":\"延安市\",\"coord\":[109.52425222161318,36.406522726136814]},{\"name\":\"庆阳市\",\"coord\":[107.73052193155061,36.183821532624464]},{\"name\":\"固原市\",\"coord\":[106.20191575442442,36.11634909496382]},{\"name\":\"白银市\",\"coord\":[104.68634478137065,36.51582865625868]},{\"name\":\"宝鸡市\",\"coord\":[107.33534779230747,34.3387216485855]},{\"name\":\"汉中市\",\"coord\":[107.03534754266246,33.00142998064871]},{\"name\":\"广元市\",\"coord\":[105.92928137563939,32.21872447205537]},{\"name\":\"巴中市\",\"coord\":[107.03422410306194,31.99874720836291]},{\"name\":\"南充市\",\"coord\":[106.32964805032347,31.156657700184095]},{\"name\":\"绵阳市\",\"coord\":[104.58949560201106,31.88628780630976]},{\"name\":\"德阳市\",\"coord\":[104.41542984932845,31.110558133718676]},{\"name\":\"成都市\",\"coord\":[103.8852290010473,30.777258040348634]},{\"name\":\"阿坝藏族羌族自治\",\"coord\":[102.26209319552814,32.45725845387284]},{\"name\":\"安康市\",\"coord\":[109.14236501848015,32.77467694678074]},{\"name\":\"十堰市\",\"coord\":[110.39934083416314,32.376209039347906]},{\"name\":\"襄阳市\",\"coord\":[111.97539147094662,31.93399822417465]},{\"name\":\"宜昌市\",\"coord\":[111.22204852395754,30.772457669035354]},{\"name\":\"恩施市\",\"coord\":[109.42158366502872,30.260366574390105]},{\"name\":\"张家界市\",\"coord\":[110.59760006538717,29.330107409240718]},{\"name\":\"吉首市\",\"coord\":[109.72176899848378,28.681903937242495]},{\"name\":\"铜仁地区\",\"coord\":[108.54247523485463,28.11736237519646]},{\"name\":\"重庆市\",\"coord\":[107.86007108564992,30.186253395053196]},{\"name\":\"怀化市\",\"coord\":[109.94325166787243,27.43919084801186]},{\"name\":\"益阳市\",\"coord\":[112.43060358108062,28.75127294553697]},{\"name\":\"娄底市\",\"coord\":[111.41891416951897,27.696312460064604]},{\"name\":\"常德市\",\"coord\":[111.72571610131646,29.27189463838195]},{\"name\":\"荆州市\",\"coord\":[112.65896596965268,30.05161542755362]},{\"name\":\"荆门市\",\"coord\":[112.6586855902184,31.01267124474617]},{\"name\":\"岳阳市\",\"coord\":[113.2595036144316,29.106247116930163]},{\"name\":\"长沙市\",\"coord\":[113.15415586456598,28.222934680488425]},{\"name\":\"湘潭市\",\"coord\":[112.51092596317824,27.69881544105668]},{\"name\":\"株州市\",\"coord\":[113.49665538546823,27.03993794610501]},{\"name\":\"衡阳市\",\"coord\":[112.48849636578527,26.783613569970782]},{\"name\":\"邵阳市\",\"coord\":[110.6723832117475,26.81652287086792]},{\"name\":\"永州市\",\"coord\":[111.8565364154186,25.768488267811968]},{\"name\":\"韶关市\",\"coord\":[113.53420325850979,24.69848878771937]},{\"name\":\"惠州市\",\"coord\":[114.32029589634925,23.25504544231892]},{\"name\":\"佛山市\",\"coord\":[112.95925897403649,23.10116677189257]},{\"name\":\"云浮市\",\"coord\":[111.78042514904234,22.840400494105687]},{\"name\":\"深圳市\",\"coord\":[114.13138648919008,22.649563063468342]},{\"name\":\"汕尾市\",\"coord\":[115.57412892884373,23.06989642104901]},{\"name\":\"河源市\",\"coord\":[114.89746229844398,23.97971937124767]},{\"name\":\"揭阳市\",\"coord\":[116.04290004239446,23.304802704715357]},{\"name\":\"汕头市\",\"coord\":[116.7008461897183,23.35898625947344]},{\"name\":\"潮州市\",\"coord\":[116.75405548481658,23.854381508863064]},{\"name\":\"梅州市\",\"coord\":[116.13719397345734,24.15633544812716]},{\"name\":\"漳州市\",\"coord\":[117.38279760543345,24.41111215459575]},{\"name\":\"厦门市\",\"coord\":[118.04275971554665,24.675908246507944]},{\"name\":\"龙岩市\",\"coord\":[116.69341144552507,25.20284542644492]},{\"name\":\"泉州市\",\"coord\":[118.12035864630246,25.22984144365049]},{\"name\":\"莆田市\",\"coord\":[118.82439690138142,25.439653480972687]},{\"name\":\"福州市\",\"coord\":[119.1608285845262,25.99117532466728]},{\"name\":\"三明市\",\"coord\":[117.51188176216434,26.318292906961602]},{\"name\":\"南平市\",\"coord\":[118.16153136678187,27.306303151805437]},{\"name\":\"抚州市\",\"coord\":[116.3455359885574,27.487043655935366]},{\"name\":\"鹰潭市\",\"coord\":[117.01082360702333,28.241253742969946]},{\"name\":\"吉安市\",\"coord\":[114.91377151807418,26.957486660664525]},{\"name\":\"赣州市\",\"coord\":[115.046455717572,25.81565075681663]},{\"name\":\"郴州市\",\"coord\":[113.1544526703492,25.871927095452524]},{\"name\":\"新余市\",\"coord\":[114.94161795877827,27.79044654578371]},{\"name\":\"宜春市\",\"coord\":[115.04574494880995,28.306428044943356]},{\"name\":\"南昌市\",\"coord\":[115.9963824234495,28.664803351584705]},{\"name\":\"九江市\",\"coord\":[115.53225905704193,29.362905920276297]},{\"name\":\"上饶市\",\"coord\":[117.8595355766598,28.765755150094634]},{\"name\":\"景德镇市\",\"coord\":[117.25387030721845,29.33426823662448]},{\"name\":\"黄山市\",\"coord\":[117.85476357809696,29.969632034273722]},{\"name\":\"池州市\",\"coord\":[117.34517113140791,30.208089337922335]},{\"name\":\"铜陵市\",\"coord\":[117.93160431300694,30.926442655001676]},{\"name\":\"安庆市\",\"coord\":[116.54307680610799,30.524265461641296]},{\"name\":\"黄石市\",\"coord\":[115.02354597728443,29.924060229331015]},{\"name\":\"咸宁市\",\"coord\":[114.26967602231792,29.652174021136048]},{\"name\":\"黄冈市\",\"coord\":[115.2859016705373,30.65856897065683]},{\"name\":\"武汉市\",\"coord\":[114.34552076948799,30.68836237966767]},{\"name\":\"随州市\",\"coord\":[113.3850627838818,31.87891659924412]},{\"name\":\"信阳市\",\"coord\":[114.81374730587638,32.0309685135914]},{\"name\":\"驻马店市\",\"coord\":[114.07756451509235,32.896720987266114]},{\"name\":\"商洛市\",\"coord\":[109.82044421310393,33.77403373563189]},{\"name\":\"西安市\",\"coord\":[109.11839808451401,34.225257215515896]},{\"name\":\"渭南市\",\"coord\":[109.75732444226935,35.025913644359306]},{\"name\":\"铜川市\",\"coord\":[108.98695328111377,35.19235092947735]},{\"name\":\"咸阳市\",\"coord\":[108.36398776446165,34.84311348287181]},{\"name\":\"三门峡市\",\"coord\":[110.80049688104964,34.31818709571671]},{\"name\":\"运城市\",\"coord\":[111.1736679525165,35.19010372283576]},{\"name\":\"洛阳市\",\"coord\":[111.87577573098216,34.33379926109848]},{\"name\":\"平顶山市\",\"coord\":[112.80931281928427,33.759895800153096]},{\"name\":\"漯河市\",\"coord\":[113.83505724178012,33.70034266174508]},{\"name\":\"许昌市\",\"coord\":[113.78762484088509,34.051835688452435]},{\"name\":\"郑州市\",\"coord\":[113.49619951867594,34.61181797865449]},{\"name\":\"焦作市\",\"coord\":[113.13404280173008,35.134167097471625]},{\"name\":\"晋城市\",\"coord\":[112.7495732073233,35.63186423091449]},{\"name\":\"长治市\",\"coord\":[112.85900842873183,36.45872910742828]},{\"name\":\"临汾市\",\"coord\":[111.49379787924448,36.22810800777857]},{\"name\":\"太原市\",\"coord\":[112.15628804033796,37.91704444063036]},{\"name\":\"吕梁市\",\"coord\":[111.31901105774872,37.712740463356496]},{\"name\":\"晋中市\",\"coord\":[113.08199599739676,37.36532613794343]},{\"name\":\"邯郸市\",\"coord\":[114.41824047234618,36.530119932543315]},{\"name\":\"安阳市\",\"coord\":[113.88883283163116,35.7797611183252]},{\"name\":\"鹤壁市\",\"coord\":[114.3654094911545,35.75770487428472]},{\"name\":\"新乡市\",\"coord\":[113.9184107718167,35.348471214026716]},{\"name\":\"开封市\",\"coord\":[114.52801677500626,34.61371216679872]},{\"name\":\"周口市\",\"coord\":[114.88509782391864,33.69999759722657]},{\"name\":\"阜阳市\",\"coord\":[115.44595951398213,32.98060371610532]},{\"name\":\"淮南市\",\"coord\":[116.68941991880993,32.79972275772595]},{\"name\":\"蚌埠市\",\"coord\":[117.38594715783302,33.106729536033896]},{\"name\":\"淮北市\",\"coord\":[116.69651711889378,33.69527529383458]},{\"name\":\"宿州市\",\"coord\":[117.30175405886838,33.943330421260015]},{\"name\":\"亳州市\",\"coord\":[116.12410804185097,33.46769392946132]},{\"name\":\"商丘市\",\"coord\":[115.59575176872548,34.28339840831147]},{\"name\":\"菏泽市\",\"coord\":[115.53631974831816,35.197319393220624]},{\"name\":\"濮阳市\",\"coord\":[115.3070485514902,35.775883510964334]},{\"name\":\"聊城市\",\"coord\":[115.8870069012884,36.40529594548765]},{\"name\":\"邢台市\",\"coord\":[114.74259008644859,37.251396750084155]},{\"name\":\"石家庄市\",\"coord\":[114.56923838363613,38.13141710980106]},{\"name\":\"阳泉市\",\"coord\":[113.39216149668508,38.09075470547468]},{\"name\":\"保定市\",\"coord\":[115.261524468934,39.09118520781398]},{\"name\":\"衡水市\",\"coord\":[115.8182936677897,37.715661598187154]},{\"name\":\"德州市\",\"coord\":[116.4582273790399,37.19372347888644]},{\"name\":\"沧州市\",\"coord\":[116.76192710911863,38.20240042039232]},{\"name\":\"廊坊市\",\"coord\":[116.50410772133856,39.27896741763884]},{\"name\":\"天津市\",\"coord\":[117.31988934444873,39.37154482470619]},{\"name\":\"北京市\",\"coord\":[116.59734730757869,40.237112944270976]},{\"name\":\"张家口市\",\"coord\":[115.1823606483226,40.83732566607167]},{\"name\":\"唐山市\",\"coord\":[117.8693184261954,39.71862889477249]},{\"name\":\"秦皇岛市\",\"coord\":[119.30467355367742,39.990574652162564]},{\"name\":\"承德市\",\"coord\":[117.16275671911026,41.36623845548547]},{\"name\":\"葫芦岛市\",\"coord\":[119.9342336210531,40.5628822626519]},{\"name\":\"朝阳市\",\"coord\":[120.11853493535794,41.471852354885755]},{\"name\":\"赤峰市\",\"coord\":[118.50943546234379,43.25452976059767]},{\"name\":\"锦州市\",\"coord\":[121.5167549323861,41.45933087433065]},{\"name\":\"营口市\",\"coord\":[122.58571915054674,40.42093503997384]},{\"name\":\"丹东市\",\"coord\":[124.33549382902183,40.46369290272115]},{\"name\":\"辽阳市\",\"coord\":[123.34064798039414,41.152331397771356]},{\"name\":\"盘锦市\",\"coord\":[122.06718005354679,41.05573599862555]},{\"name\":\"阜新市\",\"coord\":[121.93889757908204,42.27641773244204]},{\"name\":\"鞍山市\",\"coord\":[122.78904432242356,40.77781183142038]},{\"name\":\"沈阳市\",\"coord\":[122.99508899709724,42.1162195010079]},{\"name\":\"铁岭市\",\"coord\":[124.23100515588399,42.72666083611828]},{\"name\":\"扶顺市\",\"coord\":[124.46027188217573,41.82955407638859]},{\"name\":\"通辽市\",\"coord\":[122.0729370657937,43.90889130864869]},{\"name\":\"兴安盟\",\"coord\":[120.79456431092532,45.92003249442161]},{\"name\":\"白城市\",\"coord\":[123.10619907715235,45.25475749267784]},{\"name\":\"齐齐哈尔市\",\"coord\":[124.5462214659102,47.55395009317394]},{\"name\":\"大兴安岭地区\",\"coord\":[124.50992855161529,52.18438447846694]},{\"name\":\"黑河市\",\"coord\":[127.14721400335922,49.25080134026901]},{\"name\":\"大庆市\",\"coord\":[124.40329830095243,46.401048760966745]},{\"name\":\"绥化市\",\"coord\":[126.5214484055605,46.76992452194825]},{\"name\":\"松原市\",\"coord\":[124.21244334807682,44.75779381338502]},{\"name\":\"四平市\",\"coord\":[124.27839350328821,43.52139065090318]},{\"name\":\"通化市\",\"coord\":[125.67392830706305,41.91771808663852]},{\"name\":\"辽源市\",\"coord\":[125.33529527643432,42.758340204944986]},{\"name\":\"吉林市\",\"coord\":[126.83350281902375,43.60730120049175]},{\"name\":\"长春市\",\"coord\":[125.53597875970374,44.24624314701737]},{\"name\":\"白山市\",\"coord\":[127.16780160322108,42.093893880305075]},{\"name\":\"哈尔滨市\",\"coord\":[127.39125008786029,45.36200668820575]},{\"name\":\"鹤岗市\",\"coord\":[130.4703811258197,47.66520688940109]},{\"name\":\"伊春市\",\"coord\":[128.91240831703635,47.93833794565277]},{\"name\":\"七台河市\",\"coord\":[131.2677920224311,45.945099776108584]},{\"name\":\"鸡西市\",\"coord\":[132.38059153660274,45.722934218318535]},{\"name\":\"双鸭山市\",\"coord\":[132.3184817002743,46.65813679030265]},{\"name\":\"佳木斯市\",\"coord\":[132.26174446608726,47.17569713691394]},{\"name\":\"呼伦贝尔市\",\"coord\":[122.3210739998419,50.18176996070858]},{\"name\":\"孝感市\",\"coord\":[113.83749892135485,31.11757234692128]},{\"name\":\"贵港市\",\"coord\":[110.07354588052804,23.380735604767374]},{\"name\":\"黔南布依族苗族自\",\"coord\":[107.30931767543106,26.2976919432269]},{\"name\":\"宁德市\",\"coord\":[119.52482556634342,27.013151692716413]},{\"name\":\"温州市\",\"coord\":[120.30037042732202,27.8699145504001]},{\"name\":\"台州市\",\"coord\":[120.88886782713843,28.670799172772313]},{\"name\":\"丽水市\",\"coord\":[119.56796851966463,28.170268394477755]},{\"name\":\"衢州市\",\"coord\":[118.79479802644406,28.865874397158763]},{\"name\":\"金华市\",\"coord\":[119.99381920686633,29.093455548185744]},{\"name\":\"绍兴市\",\"coord\":[120.46546691682343,29.69382513836818]},{\"name\":\"宁波市\",\"coord\":[121.42142987830871,29.70001162878972]},{\"name\":\"杭州市\",\"coord\":[119.4405685790891,29.87218307296989]},{\"name\":\"宣城市\",\"coord\":[118.68748382914703,30.628143499626418]},{\"name\":\"湖州市\",\"coord\":[119.98261306633574,30.7945175862809]},{\"name\":\"嘉兴市\",\"coord\":[120.83889215988998,30.67538495499343]},{\"name\":\"上海市\",\"coord\":[121.37534147322967,31.25628247908459]},{\"name\":\"苏州市\",\"coord\":[120.6906182622391,31.381280695137775]},{\"name\":\"无锡市\",\"coord\":[120.32182300914366,31.54113306724517]},{\"name\":\"常州市\",\"coord\":[119.61953292830165,31.611878565375576]},{\"name\":\"南京市\",\"coord\":[118.71890548838064,31.910863187910323]},{\"name\":\"镇江市\",\"coord\":[119.42349332902813,31.97942313430778]},{\"name\":\"合肥市\",\"coord\":[117.30651975617157,31.79407863049138]},{\"name\":\"六安市\",\"coord\":[116.24668220575353,31.820846193819513]},{\"name\":\"滁州市\",\"coord\":[117.88422385307969,32.51792621904418]},{\"name\":\"泰州市\",\"coord\":[120.03124303305091,32.56503102346783]},{\"name\":\"南通市\",\"coord\":[120.85599446760912,32.18496706099728]},{\"name\":\"盐城市\",\"coord\":[120.01812490612667,33.54219948734023]},{\"name\":\"淮安市\",\"coord\":[119.0749424205415,33.39203631772854]},{\"name\":\"宿迁市\",\"coord\":[118.45404943216346,33.666258719120265]},{\"name\":\"徐州市\",\"coord\":[117.77482249295966,34.30847766157078]},{\"name\":\"济宁市\",\"coord\":[116.74147276546373,35.27488504351119]},{\"name\":\"枣庄市\",\"coord\":[117.43359942491492,34.884162021736]},{\"name\":\"连云港市\",\"coord\":[119.01553213785074,34.54316517587849]},{\"name\":\"临沂市\",\"coord\":[118.31478835349617,35.28173079028279]},{\"name\":\"日照市\",\"coord\":[119.14265350444272,35.54479073199592]},{\"name\":\"青岛市\",\"coord\":[120.27779044405756,36.3464117375903]},{\"name\":\"威海市\",\"coord\":[122.12963327195605,37.13879077904251]},{\"name\":\"烟台市\",\"coord\":[120.7689567423966,37.19772002195597]},{\"name\":\"潍坊市\",\"coord\":[119.02178548592039,36.49292234053931]},{\"name\":\"淄博市\",\"coord\":[117.92936024367185,36.60871347163638]},{\"name\":\"泰安市\",\"coord\":[116.93810893944303,36.0423330118612]},{\"name\":\"济南市\",\"coord\":[117.34560282551296,36.769574973846304]},{\"name\":\"东营市\",\"coord\":[118.4915054457184,37.52194690335787]},{\"name\":\"滨州市\",\"coord\":[117.67610299757533,37.4439597758601]},{\"name\":\"昆明市\",\"coord\":[102.93100245594789,25.481300763922075]},{\"name\":\"玉溪市\",\"coord\":[102.23080854291823,24.156168324611663]},{\"name\":\"塔城地区\",\"coord\":[83.60908162840168,45.3721852373893]},{\"name\":\"张掖市\",\"coord\":[100.47710030600572,38.704239320458385]},{\"name\":\"南阳市\",\"coord\":[112.1400670951149,33.03033276715801]},{\"name\":\"扬州市\",\"coord\":[119.48949608990988,32.80956776339646]},{\"name\":\"延边朝鲜族自治州\",\"coord\":[129.3577692895626,43.24968794080283]},{\"name\":\"牡丹江市\",\"coord\":[129.87240796405672,44.7073040108322]},{\"name\":\"澳门\",\"coord\":[113.56289691515346,22.14602596262204]},{\"name\":\"吴忠市\",\"coord\":[106.76894508116403,37.72566765880316]},{\"name\":\"来宾市\",\"coord\":[109.25592217010114,23.86346274681084]},{\"name\":\"平凉市\",\"coord\":[107.0708132782897,35.30329631658711]},{\"name\":\"马鞍山市\",\"coord\":[118.27245878467022,31.657727937739004]},{\"name\":\"芜湖市\",\"coord\":[118.32992684415504,31.081688223101658]},{\"name\":\"澄迈县\",\"coord\":[110.04198076060266,19.694955078668105]},{\"name\":\"保亭黎族苗族自治\",\"coord\":[109.6055304964257,18.6101488675304]},{\"name\":\"乐东黎族自治县\",\"coord\":[109.04051999525574,18.643137437909203]},{\"name\":\"儋州市\",\"coord\":[109.3431358337404,19.550974957403195]},{\"name\":\"定安县\",\"coord\":[110.38744429685676,19.47557074114284]},{\"name\":\"屯昌县\",\"coord\":[110.00574767630334,19.367175093044388]},{\"name\":\"白沙黎族自治县\",\"coord\":[109.36860737761768,19.214416393082217]},{\"name\":\"琼中黎族苗族自治\",\"coord\":[109.86691465937548,19.073671135862682]},{\"name\":\"东方市\",\"coord\":[108.86903802405428,19.017352815445214]},{\"name\":\"昌江黎族自治县\",\"coord\":[108.9686431884767,19.182594167127824]},{\"name\":\"海口市\",\"coord\":[110.420654296875,19.806565564640795]},{\"name\":\"济源市\",\"coord\":[112.38051465474433,35.07958362422394]},{\"name\":\"五指山市\",\"coord\":[109.53595187364496,18.832908264613966]},{\"name\":\"大连市\",\"coord\":[121.96662235866603,39.444150542439914]},{\"name\":\"文昌市三沙市\",\"coord\":[110.81828537536748,19.756501444162936]},{\"name\":\"三亚市\",\"coord\":[109.38424600793707,18.39186315877128]},{\"name\":\"万宁市\",\"coord\":[110.28485046979574,18.860240588635115]},{\"name\":\"陵水黎族自治县\",\"coord\":[109.95577603229562,18.594712684620465]},{\"name\":\"临高县\",\"coord\":[109.71915395436967,19.79420403032508]},{\"name\":\"琼海市\",\"coord\":[110.41650700703043,19.22315873149372]}]");
- /***/ }),
- /* 102 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireWildcard=__webpack_require__(19);var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(18));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _react=_interopRequireWildcard(__webpack_require__(5));var _interface=__webpack_require__(54);var _MapViewModal=_interopRequireDefault(__webpack_require__(103));var _lodash=_interopRequireDefault(__webpack_require__(34));var _lodash2=_interopRequireDefault(__webpack_require__(26));var _lodash3=_interopRequireDefault(__webpack_require__(35));var _lodash4=_interopRequireDefault(__webpack_require__(37));var _lodash5=_interopRequireDefault(__webpack_require__(13));var _resizeDetector=__webpack_require__(33);var _mapEvent=_interopRequireDefault(__webpack_require__(27));var _util=__webpack_require__(11);var Map=/*#__PURE__*/function(_Component){(0,_inherits2.default)(Map,_Component);var _super=(0,_createSuper2.default)(Map);function Map(props){var _this;(0,_classCallCheck2.default)(this,Map);_this=_super.call(this,props);_this.selfRef=void 0;_this.viewModel=void 0;_this.map=void 0;_this.viewModelProps=['mapOptions.center','mapOptions.zoom','mapOptions.crs','mapOptions.minZoom','mapOptions.maxZoom','mapOptions.maxBounds','mapOptions.renderWorldCopies','mapOptions.bearing','mapOptions.pitch'];_this.initializeWebMap=function(){var _this$props=_this.props,target=_this$props.target,tiandituKey=_this$props.tiandituKey,mapOptions=_this$props.mapOptions,autoresize=_this$props.autoresize;_this.viewModel=new _MapViewModal.default({target:target,tiandituKey:tiandituKey},mapOptions);if(autoresize){(0,_resizeDetector.addListener)(_this.selfRef.current,_this.__resizeHandler);}};_this.registerEvents=function(){var _this$props2=_this.props,target=_this$props2.target,onLoad=_this$props2.onLoad;_this.viewModel.on('addlayerssucceeded',function(e){_this.setState({spinning:false});_mapEvent.default.setMap(target,e.map);_this.viewModel&&_mapEvent.default.setWebMap(target,_this.viewModel);_mapEvent.default.emit('load-map',e.map,target);e.map.resize();_this.map=e.map;if(false){}// 绑定map event
- _this.bindMapEvents();/**
- * @event load
- * @desc webmap 加载完成之后触发。
- * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
- */(0,_util.isFunction)(onLoad)&&onLoad((0,_objectSpread2.default)((0,_objectSpread2.default)({},e),{},{component:(0,_assertThisInitialized2.default)(_this)}));});};_this.mapEventCallback=function(event){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_this.emitMapEvent(event.type,(0,_objectSpread2.default)({mapboxEvent:event},data));};_this.state={spinning:true};_this.selfRef=_react.default.createRef();_this.__resizeHandler=(0,_lodash.default)(_this.__resizeHandler.bind((0,_assertThisInitialized2.default)(_this)),100,{leading:true});return _this;}(0,_createClass2.default)(Map,[{key:"componentDidMount",value:function componentDidMount(){this.initializeWebMap();this.registerEvents();}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;this.viewModel&&this.viewModelProps.forEach(function(prop){var name=prop.includes('.')?prop.split('.')[1]:prop;var funcName="set".concat((0,_lodash3.default)(name));var propsValue=(0,_lodash4.default)(_this2.props,prop);var prevPropsValue=(0,_lodash4.default)(prevProps,prop);if(propsValue&&!(0,_lodash5.default)(propsValue,prevPropsValue)){_this2.viewModel[funcName](propsValue);}});var _this$props3=this.props,sprites=_this$props3.sprites,glyphs=_this$props3.glyphs;for(var id in sprites){if(prevProps.sprites[id]!==sprites[id]){this.viewModel.addSprites(id,sprites[id]);}}for(var _id in glyphs){if(prevProps.glyphs[_id]!==glyphs[_id]){this.viewModel.addGlyphs(_id,glyphs[_id]);}}}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this$props4=this.props,target=_this$props4.target,autoresize=_this$props4.autoresize;_mapEvent.default.deleteMap(target);_mapEvent.default.deleteWebMap(target);if(autoresize&&this.selfRef.current){(0,_resizeDetector.removeListener)(this.selfRef.current,this.__resizeHandler);}}},{key:"bindMapEvents",value:function bindMapEvents(){var _this3=this;Object.keys(this.props).forEach(function(eventName){if(_interface.MAP_EVENT_NAMES.includes(eventName)){var name=eventName.replace('on','');_this3.bindMapEvent(name.toLowerCase(),_this3.mapEventCallback);}});}},{key:"bindMapEvent",value:function bindMapEvent(eventName,eventCallback){this.map.on(eventName,eventCallback);}},{key:"emitMapEvent",value:function emitMapEvent(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(this.props[originEventName])){this.props[originEventName]((0,_objectSpread2.default)({map:this.map,component:this},data));}}},{key:"__resizeHandler",value:function __resizeHandler(){this.resize();}},{key:"resize",value:function resize(){if(this.viewModel&&this.viewModel.resize){this.viewModel.resize();}}},{key:"render",value:function render(){var spinning=this.state.spinning;var _this$props5=this.props,target=_this$props5.target,children=_this$props5.children;return/*#__PURE__*/_react.default.createElement("div",{id:target,className:"sm-component-map",ref:this.selfRef},!spinning&&children);}}]);return Map;}(_react.Component);Map.defaultProps={target:'map',autoresize:true};var _default=Map;exports.default=_default;
- /***/ }),
- /* 103 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var MapViewModal=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(MapViewModal,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(MapViewModal);function MapViewModal(options){var _this;var mapOptions=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{style:{version:8,sources:{},layers:[]}};(0,_classCallCheck2.default)(this,MapViewModal);_this=_super.call(this);_this.map=void 0;_this.mapOptions=void 0;_this.tiandituKey=void 0;_this.target=void 0;_this.center=void 0;_this.zoom=void 0;_this.mapOptions=Object.assign({style:{version:8,sources:{},layers:[]}},mapOptions);_this.tiandituKey=options.tiandituKey||'';_this.target=options.target||'map';_this.center=mapOptions.center||[];_this.zoom=mapOptions.zoom;_this._createMap();return _this;}(0,_createClass2.default)(MapViewModal,[{key:"_createMap",value:function _createMap(){var _this2=this;if(this.map){this.map.remove();this.center=[];this.zoom=null;}this.mapOptions.container=this.target;setTimeout(function(){_this2.map=new _mapboxGlEnhance.default.Map(_this2.mapOptions);_this2.map.on('load',function(){_this2.fire('addlayerssucceeded',{map:_this2.map});});},0);return;}/**
- * @function WebMapViewModel.prototype.resize
- * @description Map 更新大小。
- */},{key:"resize",value:function resize(){this.map&&this.map.resize();}/**
- * @function WebMapViewModel.prototype.setCRS
- * @description 设置地图的投影。
- * @param {Number} crs - 地图投影。
- */},{key:"setCrs",value:function setCrs(crs){if(this.map){this.mapOptions.crs=crs;//@ts-ignore
- crs&&this.map.setCRS(_mapboxGlEnhance.default.CRS.get(crs));}}/**
- * @function WebMapViewModel.prototype.setZoom
- * @description 设置地图的缩放级别。
- * @param {Number} zoom - 地图缩放级别。
- */},{key:"setZoom",value:function setZoom(zoom){if(this.map){this.mapOptions.zoom=zoom;(zoom||zoom===0)&&this.map.setZoom(zoom);}}/**
- * @function WebMapViewModel.prototype.setCenter
- * @description 设置地图的中心点。
- * @param {Array} center - 地图中心点。
- */},{key:"setCenter",value:function setCenter(center){if(this.map){this.mapOptions.center=center;center&¢er.length>0&&this.map.setCenter(center);}}/**
- * @function WebMapViewModel.prototype.setMaxBounds
- * @description 设置地图的最大范围。
- * @param {Array} maxBounds - 地图最大范围。
- */},{key:"setMaxBounds",value:function setMaxBounds(maxBounds){if(this.map){this.mapOptions.maxBounds=maxBounds;maxBounds&&maxBounds.length>0&&this.map.setMaxBounds(maxBounds);}}/**
- * @function WebMapViewModel.prototype.setMinZoom
- * @description 设置地图的最小级别。
- * @param {Number} minZoom - 地图最小级别。
- */},{key:"setMinZoom",value:function setMinZoom(minZoom){if(this.map){this.mapOptions.minZoom=minZoom;(minZoom||minZoom===0)&&this.map.setMinZoom(minZoom);}}/**
- * @function WebMapViewModel.prototype.setMaxZoom
- * @description 设置地图的最大级别。
- * @param {Number} maxZoom - 地图最大级别。
- */},{key:"setMaxZoom",value:function setMaxZoom(maxZoom){if(this.map){this.mapOptions.maxZoom=maxZoom;(maxZoom||maxZoom===0)&&this.map.setMinZoom(maxZoom);}}/**
- * @function WebMapViewModel.prototype.setRenderWorldCopies
- * @description 设置地图的平铺。
- * @param {Boolean} renderWorldCopies - 地图是否平铺。
- */},{key:"setRenderWorldCopies",value:function setRenderWorldCopies(renderWorldCopies){if(this.map){this.mapOptions.renderWorldCopies=renderWorldCopies;renderWorldCopies&&this.map.setRenderWorldCopies(renderWorldCopies);}}/**
- * @function WebMapViewModel.prototype.setBearing
- * @description 设置地图的方位。
- * @param {Number} bearing - 地图的初始方位。
- */},{key:"setBearing",value:function setBearing(bearing){if(this.map){this.mapOptions.bearing=bearing;(bearing||bearing===0)&&this.map.setBearing(bearing);}}/**
- * @function WebMapViewModel.prototype.setPitch
- * @description 设置地图的俯仰。
- * @param {Number} pitch - 地图的初始俯仰。
- */},{key:"setPitch",value:function setPitch(pitch){if(this.map){this.mapOptions.pitch=pitch;(pitch||pitch===0)&&this.map.setPitch(pitch);}}},{key:"addSprites",value:function addSprites(sourceId,sprite){var _this$map;if((_this$map=this.map)===null||_this$map===void 0?void 0:_this$map.style){this.map.style.addSprite(sourceId,sprite);}}},{key:"addGlyphs",value:function addGlyphs(sourceId,glyph){var _this$map2;if((_this$map2=this.map)===null||_this$map2===void 0?void 0:_this$map2.style){this.map.style.addGlyphs(sourceId,glyph);}}}]);return MapViewModal;}(_mapboxGlEnhance.default.Evented);var _default=MapViewModal;exports.default=_default;
- /***/ }),
- /* 104 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectWithoutProperties2=_interopRequireDefault(__webpack_require__(158));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _dec,_class,_temp;var Source=(_dec=(0,_compose2.default)(_mapGetter.default),_dec(_class=(_temp=/*#__PURE__*/function(_React$PureComponent){(0,_inherits2.default)(Source,_React$PureComponent);var _super=(0,_createSuper2.default)(Source);function Source(props){var _this;(0,_classCallCheck2.default)(this,Source);_this=_super.call(this,props);_this._map=void 0;_this._map=null;return _this;}(0,_createClass2.default)(Source,[{key:"componentDidUpdate",value:function componentDidUpdate(){console.log("source \"".concat(this.props.id,"\" updated"));}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this2=this;setTimeout(function(){_this2._map.removeSource(_this2.props.id);console.log('source "'.concat(_this2.props.id,'" removed'));},100);}},{key:"loaded",value:function loaded(map){this._map=map;var _this$props=this.props,id=_this$props.id,mapNotLoadedTip=_this$props.mapNotLoadedTip,sourceOption=(0,_objectWithoutProperties2.default)(_this$props,["id","mapNotLoadedTip"]);if(this._map.getSource(id)){console.log("There is already a source with the id \"".concat(id,"\""));return;}this._map.addSource(id,sourceOption);}},{key:"render",value:function render(){return null;}}]);return Source;}(_react.default.PureComponent),_temp))||_class);exports.default=Source;
- /***/ }),
- /* 105 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- exports.__esModule = true;
- exports.default = void 0;
- var getDisplayName = function getDisplayName(Component) {
- if (typeof Component === 'string') {
- return Component;
- }
- if (!Component) {
- return undefined;
- }
- return Component.displayName || Component.name || 'Component';
- };
- var _default = getDisplayName;
- exports.default = _default;
- /***/ }),
- /* 106 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- if (true) {
- module.exports = __webpack_require__(107);
- } else {}
- /***/ }),
- /* 107 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /** @license React v16.11.0
- * react-is.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- Object.defineProperty(exports,"__esModule",{value:!0});
- var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?Symbol.for("react.suspense_list"):
- 60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.fundamental"):60117,w=b?Symbol.for("react.responder"):60118,x=b?Symbol.for("react.scope"):60119;function y(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case h:return a;default:return u}}case t:case r:case d:return u}}}function z(a){return y(a)===m}
- exports.typeOf=y;exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;
- exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===v||a.$$typeof===w||a.$$typeof===x)};exports.isAsyncMode=function(a){return z(a)||y(a)===l};exports.isConcurrentMode=z;exports.isContextConsumer=function(a){return y(a)===k};exports.isContextProvider=function(a){return y(a)===h};
- exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return y(a)===n};exports.isFragment=function(a){return y(a)===e};exports.isLazy=function(a){return y(a)===t};exports.isMemo=function(a){return y(a)===r};exports.isPortal=function(a){return y(a)===d};exports.isProfiler=function(a){return y(a)===g};exports.isStrictMode=function(a){return y(a)===f};exports.isSuspense=function(a){return y(a)===p};
- /***/ }),
- /* 108 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _dec,_class;var Layer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(Layer,_React$Component);var _super=(0,_createSuper2.default)(Layer);function Layer(){(0,_classCallCheck2.default)(this,Layer);return _super.apply(this,arguments);}(0,_createClass2.default)(Layer,[{key:"loaded",value:function loaded(map){var _this$props=this.props,type=_this$props.type,source=_this$props.source,layerId=_this$props.layerId,minzoom=_this$props.minzoom,maxzoom=_this$props.maxzoom,filter=_this$props.filter,layout=_this$props.layout,paint=_this$props.paint,metadata=_this$props.metadata,before=_this$props.before;if(map.getLayer(layerId)){console.error("There is already a layer with the id \"".concat(layerId,"\""));return;}if(typeof source==='string'&&!map.getSource(source)){console.error("Source \"".concat(source,"\" is not loaded"));return;}if(type!=='background'&&!source){console.error("Source is required unless type is background");return;}var layerOption={id:layerId,type:type};source&&(layerOption.source=source);minzoom!==undefined&&(layerOption.minzoom=minzoom);maxzoom!==undefined&&(layerOption.maxzoom=maxzoom);filter&&(layerOption.filter=filter);layout&&(layerOption.layout=layout);paint&&(layerOption.paint=paint);metadata&&(layerOption.metadata=metadata);this.props['source-layer']&&(layerOption['source-layer']=this.props['source-layer']);map.addLayer(layerOption,before);}},{key:"removed",value:function removed(){}},{key:"render",value:function render(){return null;}}]);return Layer;}(_react.default.Component))||_class);exports.default=Layer;
- /***/ }),
- /* 109 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=__webpack_require__(5);var _GeojsonLayerViewModel=_interopRequireDefault(__webpack_require__(110));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _dec,_class,_temp;var GeojsonLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=/*#__PURE__*/function(_Component){(0,_inherits2.default)(GeojsonLayer,_Component);var _super=(0,_createSuper2.default)(GeojsonLayer);function GeojsonLayer(){var _this;(0,_classCallCheck2.default)(this,GeojsonLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(GeojsonLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(prevProps.layerStyle!==this.props.layerStyle){this.viewModel&&this.viewModel.setLayerStyle(this.props.layerStyle);}if(!(0,_lodash.default)(this.props.data,prevProps.data)&&this.viewModel){this.viewModel.setData(this.props.data);}}},{key:"loaded",value:function loaded(map){this.viewModel=new _GeojsonLayerViewModel.default(map,this.props);}},{key:"render",value:function render(){return null;}}]);return GeojsonLayer;}(_react.Component),_temp))||_class);exports.default=GeojsonLayer;
- /***/ }),
- /* 110 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var GeojsonLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(GeojsonLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(GeojsonLayerViewModel);function GeojsonLayerViewModel(map,GeojsonLayerOptions){var _this;(0,_classCallCheck2.default)(this,GeojsonLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}_this.map=map;var layerStyle=GeojsonLayerOptions.layerStyle,data=GeojsonLayerOptions.data,layerId=GeojsonLayerOptions.layerId;_this.data=data;_this.layerStyle=layerStyle;_this.layerId=layerId;_this.data&&_this._addLayer();return _this;}(0,_createClass2.default)(GeojsonLayerViewModel,[{key:"setData",value:function setData(data){if(!data||!this.map.getSource(this.layerId)){return;}this.data=data;if(this.layerId&&!this.map.getSource(this.layerId)){this._addLayer();}else{this.map.getSource(this.layerId).setData(data);}}},{key:"setLayerStyle",value:function setLayerStyle(layerStyle){if(!layerStyle||!this.map.getSource(this.layerId)){return;}var paint=layerStyle.paint,layout=layerStyle.layout;for(var _i=0,_Object$keys=Object.keys(paint);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];this.map.setPaintProperty(this.layerId,prop,paint[prop]);}for(var _i2=0,_Object$keys2=Object.keys(layout);_i2<_Object$keys2.length;_i2++){var _prop=_Object$keys2[_i2];this.map.setLayoutProperty(this.layerId,_prop,layout[_prop]);}this.layerStyle=layerStyle;}},{key:"_addLayer",value:function _addLayer(){if(!(this.layerStyle instanceof Object))throw new Error('layerStyle 不能为空');var _this$layerStyle=this.layerStyle,paint=_this$layerStyle.paint,layout=_this$layerStyle.layout;this.map.addLayer({id:this.layerId,type:this._getLayerType(paint),source:{type:'geojson',data:this.data},layout:layout||{},paint:paint||{}});}},{key:"_getLayerType",value:function _getLayerType(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var keys=Object.keys(paint).join(' ');var reg=/circle-|line-|fill-extrusion-|fill-+/i;var matchType=keys.match(reg);var type=matchType?matchType[0]:'';return type.substr(0,type.length-1);}}]);return GeojsonLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=GeojsonLayerViewModel;
- /***/ }),
- /* 111 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _RasterTileLayerViewModel=_interopRequireDefault(__webpack_require__(112));var _dec,_class,_class2,_temp;var RasterTileLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(RasterTileLayer,_React$Component);var _super=(0,_createSuper2.default)(RasterTileLayer);function RasterTileLayer(){var _this;(0,_classCallCheck2.default)(this,RasterTileLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(RasterTileLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _RasterTileLayerViewModel.default(map,this.props);}},{key:"removed",value:function removed(){this.viewModel=null;}},{key:"render",value:function render(){return null;}}]);return RasterTileLayer;}(_react.default.Component),_class2.defaultProps={scheme:'xyz',visible:true,opacity:1},_temp))||_class);exports.default=RasterTileLayer;
- /***/ }),
- /* 112 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var RasterTileLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RasterTileLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RasterTileLayerViewModel);function RasterTileLayerViewModel(map,rasterLayerOptions){var _this;(0,_classCallCheck2.default)(this,RasterTileLayerViewModel);_this=_super.call(this);_this.map=map;var layerId=rasterLayerOptions.layerId,tileSize=rasterLayerOptions.tileSize,mapUrl=rasterLayerOptions.mapUrl,tiles=rasterLayerOptions.tiles,bounds=rasterLayerOptions.bounds,_rasterLayerOptions$m=rasterLayerOptions.minZoom,minZoom=_rasterLayerOptions$m===void 0?0:_rasterLayerOptions$m,_rasterLayerOptions$m2=rasterLayerOptions.maxZoom,maxZoom=_rasterLayerOptions$m2===void 0?22:_rasterLayerOptions$m2,attribution=rasterLayerOptions.attribution,_rasterLayerOptions$s=rasterLayerOptions.scheme,scheme=_rasterLayerOptions$s===void 0?'xyz':_rasterLayerOptions$s,_rasterLayerOptions$v=rasterLayerOptions.visible,visible=_rasterLayerOptions$v===void 0?true:_rasterLayerOptions$v,_rasterLayerOptions$o=rasterLayerOptions.opacity,opacity=_rasterLayerOptions$o===void 0?1:_rasterLayerOptions$o,before=rasterLayerOptions.before;_this.layerId=layerId;_this.tileSize=tileSize;_this.mapUrl=mapUrl;_this.tiles=tiles;_this.bounds=bounds;_this.minZoom=minZoom;_this.maxZoom=maxZoom;_this.attribution=attribution;_this.scheme=scheme;_this.opacity=opacity;_this.visibility=visible?'visible':'none';_this.before=before;// enhance扩展,传iserver标识是iserver rest map
- _this.rasterSource='';_this._init();return _this;}(0,_createClass2.default)(RasterTileLayerViewModel,[{key:"_init",value:function _init(){if(this.mapUrl){this._addRestMapLayer();}else{this._addLayer();}}},{key:"_addRestMapLayer",value:function _addRestMapLayer(){var _this2=this;var service=new _mapboxGlEnhance.default.supermap.MapService(this.mapUrl);service.getMapInfo(function(mapObj){if(!_this2.layerId){_this2.layerId=mapObj.name;}if(!_this2.tileSize&&mapObj.viewer){_this2.tileSize=mapObj.viewer.width;}var bounds=mapObj.bounds;if(!_this2.bounds&&bounds){_this2.bounds=[bounds.left,bounds.bottom,bounds.right,bounds.top];}_this2.rasterSource='iserver';_this2.tiles=[_this2.mapUrl];_this2._addLayer(mapObj);});}},{key:"_addLayer",value:function _addLayer(){this.map.addLayer({id:this.layerId||"raster-layer-".concat(new Date().getTime()),type:'raster',layout:{visibility:this.visibility},paint:{'raster-opacity':this.opacity},source:{bounds:this.bounds||[-180,-85.051129,180,85.051129],type:'raster',tileSize:this.tileSize||256,tiles:this.tiles,rasterSource:this.rasterSource,minzoom:this.minZoom,maxzoom:this.maxZoom,scheme:this.scheme}},this.before);}}]);return RasterTileLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=RasterTileLayerViewModel;
- /***/ }),
- /* 113 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _dec,_class;var VectorTileLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(VectorTileLayer,_React$Component);var _super=(0,_createSuper2.default)(VectorTileLayer);function VectorTileLayer(){(0,_classCallCheck2.default)(this,VectorTileLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(VectorTileLayer,[{key:"loaded",value:function loaded(map){if(map&&map['addStyle']){map['addStyle'](this.props.styleOptions,this.props.before);}}},{key:"render",value:function render(){return null;}}]);return VectorTileLayer;}(_react.default.Component))||_class);exports.default=VectorTileLayer;
- /***/ }),
- /* 114 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _util=__webpack_require__(11);var _UniqueThemeLayerViewModel=_interopRequireDefault(__webpack_require__(115));var _dec,_class,_class2,_temp;var UniqueThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(UniqueThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(UniqueThemeLayer);function UniqueThemeLayer(){var _this;(0,_classCallCheck2.default)(this,UniqueThemeLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(UniqueThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _UniqueThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return UniqueThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{}},_temp))||_class);exports.default=UniqueThemeLayer;
- /***/ }),
- /* 115 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var UniqueThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(UniqueThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(UniqueThemeLayerViewModel);function UniqueThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,UniqueThemeLayerViewModel);_this=_super.call(this);_this.map=map;var options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data,layerName=themeProps.layerName;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(UniqueThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.UniqueThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);if(this.data&&this.data.length){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return UniqueThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=UniqueThemeLayerViewModel;
- /***/ }),
- /* 116 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=__webpack_require__(5);var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _util=__webpack_require__(11);var _RanksymbolThemeLayerViewModel=_interopRequireDefault(__webpack_require__(117));var _dec,_class,_temp;var RanksymbolThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=/*#__PURE__*/function(_Component){(0,_inherits2.default)(RanksymbolThemeLayer,_Component);var _super=(0,_createSuper2.default)(RanksymbolThemeLayer);function RanksymbolThemeLayer(){var _this;(0,_classCallCheck2.default)(this,RanksymbolThemeLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(RanksymbolThemeLayer,[{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _RanksymbolThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return RanksymbolThemeLayer;}(_react.Component),_temp))||_class);exports.default=RanksymbolThemeLayer;
- /***/ }),
- /* 117 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var RanksymbolThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RanksymbolThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RanksymbolThemeLayerViewModel);function RanksymbolThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,RanksymbolThemeLayerViewModel);_this=_super.call(this);_this.map=map;var layerName=themeProps.layerName,options=themeProps.options,symbolType=themeProps.symbolType,layerId=themeProps.layerId,data=themeProps.data;_this.layerName=layerName||layerId;_this.symbolType=symbolType||'Circle';options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(RanksymbolThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.RankSymbolThemeLayer(this.layerName,this.symbolType,this.options);this.map.addLayer(this.themeLayer);this.themeLayer.addFeatures(this.data);}}]);return RanksymbolThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=RanksymbolThemeLayerViewModel;
- /***/ }),
- /* 118 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _util=__webpack_require__(11);var _RangeThemeLayerViewModel=_interopRequireDefault(__webpack_require__(119));var _dec,_class,_class2,_temp;var RangeThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(RangeThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(RangeThemeLayer);function RangeThemeLayer(){var _this;(0,_classCallCheck2.default)(this,RangeThemeLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(RangeThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _RangeThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return RangeThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{}},_temp))||_class);exports.default=RangeThemeLayer;
- /***/ }),
- /* 119 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var RangeThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RangeThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RangeThemeLayerViewModel);function RangeThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,RangeThemeLayerViewModel);_this=_super.call(this);var layerName=themeProps.layerName,options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data;_this.map=map;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(RangeThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.RangeThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);if(this.data&&this.data.length){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return RangeThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=RangeThemeLayerViewModel;
- /***/ }),
- /* 120 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _util=__webpack_require__(11);var _GraphThemeLayerViewModel=_interopRequireDefault(__webpack_require__(121));var _dec,_class,_class2,_temp;var GraphThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(GraphThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(GraphThemeLayer);function GraphThemeLayer(){var _this;(0,_classCallCheck2.default)(this,GraphThemeLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(GraphThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _GraphThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return GraphThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{},chartsType:'Bar'},_temp))||_class);exports.default=GraphThemeLayer;
- /***/ }),
- /* 121 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var GraphThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(GraphThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(GraphThemeLayerViewModel);function GraphThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,GraphThemeLayerViewModel);_this=_super.call(this);_this.map=map;var layerName=themeProps.layerName,options=themeProps.options,chartsType=themeProps.chartsType,layerId=themeProps.layerId,data=themeProps.data;_this.layerName=layerName||layerId;_this.chartsType=chartsType||'Bar';options.id=options.id||layerId;_this.options=options;_this.data=data||{};_this._init();return _this;}(0,_createClass2.default)(GraphThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.GraphThemeLayer(this.layerName,this.chartsType,this.options);this.map.addLayer(this.themeLayer);if(JSON.stringify(this.data)!=='{}'){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return GraphThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=GraphThemeLayerViewModel;
- /***/ }),
- /* 122 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=__webpack_require__(5);var _ClusterLayerViewModel=_interopRequireDefault(__webpack_require__(123));var _CircleStyle=_interopRequireDefault(__webpack_require__(57));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _dec,_class,_class2,_temp;var ClusterLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(ClusterLayer,_Component);var _super=(0,_createSuper2.default)(ClusterLayer);function ClusterLayer(){var _this;(0,_classCallCheck2.default)(this,ClusterLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(ClusterLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this$props=this.props,data=_this$props.data,clusteredPointStyle=_this$props.clusteredPointStyle,unclusteredPointStyle=_this$props.unclusteredPointStyle,clusteredPointTextLayout=_this$props.clusteredPointTextLayout;if(!(0,_lodash.default)(data,prevProps.data)){this.viewModel&&this.viewModel.setData(data);}if(prevProps.clusteredPointStyle!==clusteredPointStyle){this.viewModel&&this.viewModel.setClusteredPointStyle(clusteredPointStyle);}if(prevProps.unclusteredPointStyle!==unclusteredPointStyle){this.viewModel&&this.viewModel.setUnclusteredPointStyle(unclusteredPointStyle);}if(prevProps.clusteredPointTextLayout!==clusteredPointTextLayout){this.viewModel&&this.viewModel.setClusteredPointTextLayout(clusteredPointTextLayout);}}},{key:"loaded",value:function loaded(map){var options=JSON.parse(JSON.stringify(this.props));delete options.data;this.viewModel=new _ClusterLayerViewModel.default(map,this.props.data,(0,_objectSpread2.default)({},options));}},{key:"render",value:function render(){return null;}}]);return ClusterLayer;}(_react.Component),_class2.defaultProps={radius:50,maxZoom:14,clusteredPointStyle:new _CircleStyle.default({'circle-color':['step',['get','point_count'],'#51bbd6',100,'#f1f075',750,'#f28cb1'],'circle-radius':['step',['get','point_count'],20,100,30,750,40]}),unclusteredPointStyle:new _CircleStyle.default({'circle-color':'#11b4da','circle-radius':4,'circle-stroke-width':1,'circle-stroke-color':'#fff'})},_temp))||_class);var _default=ClusterLayer;exports.default=_default;
- /***/ }),
- /* 123 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));/**
- * @class ClusterLayerViewModel
- * @param {mapboxgl.map} map - mapboxgl map 对象。
- * @param {Object} data - Cluster layer data。
- * @param {Object} options - 可选参数。
- * @param {String} [options.layerId] - 图层 ID。
- * @param {Object} [options.clusteredPointStyle] - 聚合点的 Paint 对象。
- * @param {Object} [options.unclusteredPointStyle] - 未聚合的点的 Paint 对象。
- * @param {Object} [options.clusteredPointTextLayout] - 聚合点的文本 layout 对象
- * @param {number} [options.radius=50] - 图层聚合点半径。
- * @param {number} [options.maxZoom=14] - 图层最大显示级别。
- */var ClusterLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(ClusterLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(ClusterLayerViewModel);function ClusterLayerViewModel(map,data){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};(0,_classCallCheck2.default)(this,ClusterLayerViewModel);_this=_super.call(this);_this.options=options;if(!map){throw new Error('map is requierd');}_this.map=map;_this.data=data;_this.layerId=options.layerId||'clusterLayer'+new Date().getTime();_this.data&&_this._initializeClusterLayer();return _this;}(0,_createClass2.default)(ClusterLayerViewModel,[{key:"setData",value:function setData(data){if(!data){return;}this.data=data;if(this.layerId&&!this.map.getSource(this.layerId)){this._initializeClusterLayer();}else{this.map.getSource(this.layerId).setData(data);}}},{key:"setClusteredPointStyle",value:function setClusteredPointStyle(clusteredPointStyle){if(!clusteredPointStyle||this.layerId&&!this.map.getSource(this.layerId)){return;}this.options.clusteredPointStyle=clusteredPointStyle;this._setPaintProperty(clusteredPointStyle.paint,this.layerId);this._setLayoutProperty(clusteredPointStyle.layout,this.layerId);}},{key:"setUnclusteredPointStyle",value:function setUnclusteredPointStyle(unclusteredPointStyle){var layerId='unclustered_point'+this.layerId;if(!unclusteredPointStyle||!this.map.getSource(layerId)){return;}this.options.unclusteredPointStyle=unclusteredPointStyle;this._setPaintProperty(unclusteredPointStyle.paint,layerId);this._setLayoutProperty(unclusteredPointStyle.layout,layerId);}},{key:"setClusteredPointTextLayout",value:function setClusteredPointTextLayout(clusteredPointTextLayout){var layerId='count_'+this.layerId;if(!clusteredPointTextLayout||!this.map.getSource(layerId)){return;}this.options.clusteredPointTextLayout=clusteredPointTextLayout;this._setLayoutProperty(clusteredPointTextLayout,layerId);}},{key:"_setPaintProperty",value:function _setPaintProperty(paint,layerId){var _this2=this;Object.keys(paint).forEach(function(key){_this2.map.setPaintProperty(layerId,key,paint[key]);});}},{key:"_setLayoutProperty",value:function _setLayoutProperty(layout,layerId){var _this3=this;Object.keys(layout).forEach(function(key){_this3.map.setLayoutProperty(layerId,key,layout[key]);});}},{key:"_initializeClusterLayer",value:function _initializeClusterLayer(){var _this4=this;this.map.addSource(this.layerId,{type:'geojson',data:this.data,cluster:true,clusterMaxZoom:this.options.maxZoom||14,clusterRadius:this.options.radius||50});this.map.addLayer({id:this.layerId,type:'circle',source:this.layerId,filter:['has','point_count'],paint:this.options.clusteredPointStyle&&this.options.clusteredPointStyle.paint||{'circle-color':['step',['get','point_count'],'#51bbd6',100,'#f1f075',750,'#f28cb1'],'circle-radius':['step',['get','point_count'],20,100,30,750,40]}});// 聚合点文本 layer
- this.map.addLayer({id:'count_'+this.layerId,type:'symbol',source:this.layerId,filter:['has','point_count'],layout:this.options.clusteredPointTextLayout||{'text-field':'{point_count_abbreviated}','text-font':['DIN Offc Pro Medium','Arial Unicode MS Bold'],'text-size':12}});// 未聚合点 layer
- this.map.addLayer({id:'unclustered_point'+this.layerId,type:'circle',source:this.layerId,filter:['!',['has','point_count']],paint:this.options.unclusteredPointStyle&&this.options.unclusteredPointStyle.paint||{'circle-color':'#11b4da','circle-radius':4,'circle-stroke-width':1,'circle-stroke-color':'#fff'}});/**
- * @event addcusterlayersucceeded
- * @description 添加点聚合图层成功后触发。
- * @property {Object} map - mapboxgl map 对象。
- */this.fire('addcusterlayersucceeded',{map:this.map});this.map.on('click',this.layerId,function(e){var features=_this4.map.queryRenderedFeatures(e.point,{layers:[_this4.layerId]});var clusterId=features[0].properties.cluster_id;_this4.map.getSource(_this4.layerId).getClusterExpansionZoom(clusterId,function(err,zoom){if(err)return;_this4.map.easeTo({center:features[0].geometry.coordinates,zoom:zoom});});});this.map.on('mouseenter',this.layerId,function(){_this4.map.getCanvas().style.cursor='pointer';});this.map.on('mouseleave',this.layerId,function(){_this4.map.getCanvas().style.cursor='';});}}]);return ClusterLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=ClusterLayerViewModel;
- /***/ }),
- /* 124 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=__webpack_require__(5);var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _DeckglLayerViewModel=_interopRequireDefault(__webpack_require__(125));var _dec,_class,_temp;var LAYER_TYPE_ID_LIST=['scatter-plot','path-layer','polygon-layer','arc-layer','hexagon-layer','screen-grid-layer'];var DeckglLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=/*#__PURE__*/function(_Component){(0,_inherits2.default)(DeckglLayer,_Component);var _super=(0,_createSuper2.default)(DeckglLayer);function DeckglLayer(){var _this;(0,_classCallCheck2.default)(this,DeckglLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(DeckglLayer,[{key:"loaded",value:function loaded(map){var _this2=this;var matchIndex=LAYER_TYPE_ID_LIST.findIndex(function(item){return item===_this2.props.layerType;});if(matchIndex>-1){this.viewModel=new _DeckglLayerViewModel.default(map,this.props);}}},{key:"render",value:function render(){return null;}}]);return DeckglLayer;}(_react.Component),_temp))||_class);exports.default=DeckglLayer;
- /***/ }),
- /* 125 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);__webpack_require__(126);var DeckglLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(DeckglLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(DeckglLayerViewModel);function DeckglLayerViewModel(map,deckglProps){var _this;(0,_classCallCheck2.default)(this,DeckglLayerViewModel);_this=_super.call(this);_this.map=map;var layerType=deckglProps.layerType,options=deckglProps.options,layerId=deckglProps.layerId;_this.layerType=layerType;options.data=options.data||[];options.layerId=options.layerId||layerId;_this.options=options;_this._init();return _this;}(0,_createClass2.default)(DeckglLayerViewModel,[{key:"_init",value:function _init(){if(this.layerType&&this.options){this._addDeckglLayer();}}},{key:"_addDeckglLayer",value:function _addDeckglLayer(){var deckglLayer=new _mapboxGlEnhance.default.supermap.DeckglLayer(this.layerType,this.options);this.map.addLayer(deckglLayer);}}]);return DeckglLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=DeckglLayerViewModel;
- /***/ }),
- /* 126 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__126__;
- /***/ }),
- /* 127 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=__webpack_require__(5);var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _util=__webpack_require__(11);var _LabelThemeLayerViewModel=_interopRequireDefault(__webpack_require__(128));var _dec,_class,_class2,_temp;var LabelThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(LabelThemeLayer,_Component);var _super=(0,_createSuper2.default)(LabelThemeLayer);function LabelThemeLayer(){var _this;(0,_classCallCheck2.default)(this,LabelThemeLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(LabelThemeLayer,[{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _LabelThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return LabelThemeLayer;}(_react.Component),_class2.defaultProps={options:{}},_temp))||_class);exports.default=LabelThemeLayer;
- /***/ }),
- /* 128 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var LabelThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(LabelThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(LabelThemeLayerViewModel);function LabelThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,LabelThemeLayerViewModel);_this=_super.call(this);var layerName=themeProps.layerName,options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data;_this.map=map;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(LabelThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.LabelThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);this.themeLayer.addFeatures(this.data);}}]);return LabelThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=LabelThemeLayerViewModel;
- /***/ }),
- /* 129 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _HeatmapLayerViewModel=_interopRequireDefault(__webpack_require__(130));var _HeatMapStyle=_interopRequireDefault(__webpack_require__(58));var _dec,_class,_class2,_temp;var HeatmapLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(HeatmapLayer,_React$Component);var _super=(0,_createSuper2.default)(HeatmapLayer);function HeatmapLayer(){var _this;(0,_classCallCheck2.default)(this,HeatmapLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(HeatmapLayer,[{key:"loaded",value:function loaded(map){var _this$props=this.props,data=_this$props.data,layerId=_this$props.layerId,layerStyle=_this$props.layerStyle;this.viewModel=new _HeatmapLayerViewModel.default(map,data,{layerId:layerId,layerStyle:layerStyle});}},{key:"render",value:function render(){return null;}}]);return HeatmapLayer;}(_react.default.Component),_class2.defaultProps={layerStyle:new _HeatMapStyle.default()},_temp))||_class);exports.default=HeatmapLayer;
- /***/ }),
- /* 130 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));/**
- * @class HeatMapLayerViewModel
- * @param {mapboxgl.map} map - mapboxgl map 对象。
- * @param {String} data - 热力图数据。
- * @param {Object} options - 可选参数。
- * @param {Object} [options.layerId] - 图层名。
- * @param {Object} [options.layerStyle] - 图层样式配置。
- */var HeatMapLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(HeatMapLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(HeatMapLayerViewModel);function HeatMapLayerViewModel(map,data,options){var _this;(0,_classCallCheck2.default)(this,HeatMapLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}options=options||{};_this.map=map;_this.data=data;_this.layerId=options.layerId||'heatmap'+new Date().getTime();var layerStyle=options.layerStyle;_this.paint=layerStyle&&layerStyle.paint;_this.layout=layerStyle&&layerStyle.layout;_this._initializeHeatMapLayer();return _this;}(0,_createClass2.default)(HeatMapLayerViewModel,[{key:"_initializeHeatMapLayer",value:function _initializeHeatMapLayer(){this.map.addSource(this.layerId,{type:'geojson',data:this.data});this.map.addLayer({id:this.layerId,type:'heatmap',source:this.layerId,maxzoom:9,paint:this.paint||{'heatmap-intensity':['interpolate',['linear'],['zoom'],0,1,9,3],'heatmap-color':['interpolate',['linear'],['heatmap-density'],0,'rgba(33,102,172,0)',0.2,'rgb(103,169,207)',0.4,'rgb(209,229,240)',0.6,'rgb(253,219,199)',0.8,'rgb(239,138,98)',1,'rgb(178,24,43)'],'heatmap-radius':['interpolate',['linear'],['zoom'],0,2,9,20],'heatmap-opacity':['interpolate',['linear'],['zoom'],7,1,9,0]},layout:this.layout||{}});this.fire('heatmaplayeraddsucceeded',{map:this.map});}}]);return HeatMapLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=HeatMapLayerViewModel;
- /***/ }),
- /* 131 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _MapvLayerViewModel=_interopRequireDefault(__webpack_require__(132));var _dec,_class,_class2,_temp;var MapvLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(MapvLayer,_React$Component);var _super=(0,_createSuper2.default)(MapvLayer);function MapvLayer(){var _this;(0,_classCallCheck2.default)(this,MapvLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(MapvLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _MapvLayerViewModel.default(map,this.props);}},{key:"render",value:function render(){return null;}}]);return MapvLayer;}(_react.default.Component),_class2.defaultProps={options:{},data:{}},_temp))||_class);exports.default=MapvLayer;
- /***/ }),
- /* 132 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);var MapvLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(MapvLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(MapvLayerViewModel);function MapvLayerViewModel(map,mapvLayerProps){var _this;(0,_classCallCheck2.default)(this,MapvLayerViewModel);_this=_super.call(this);_this.map=map;var data=mapvLayerProps.data,options=mapvLayerProps.options,layerId=mapvLayerProps.layerId;_this.data=data;_this.options=options.layerId?options:(0,_objectSpread2.default)((0,_objectSpread2.default)({},options),{},{layerId:layerId});_this._init();return _this;}(0,_createClass2.default)(MapvLayerViewModel,[{key:"_init",value:function _init(){if(this.data&&this.options){this._addMapvLayer();}}},{key:"_addMapvLayer",value:function _addMapvLayer(){var mapVLayer=new _mapboxGlEnhance.default.supermap.MapvLayer('',this.data,this.options);this.map.addLayer(mapVLayer);}}]);return MapvLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=MapvLayerViewModel;
- /***/ }),
- /* 133 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _EchatsLayerViewModel=_interopRequireDefault(__webpack_require__(134));var _dec,_class,_temp;var EchartsLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(EchartsLayer,_React$Component);var _super=(0,_createSuper2.default)(EchartsLayer);function EchartsLayer(){var _this;(0,_classCallCheck2.default)(this,EchartsLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(EchartsLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _EchatsLayerViewModel.default(map,this.props.options);}},{key:"render",value:function render(){return null;}}]);return EchartsLayer;}(_react.default.Component),_temp))||_class);exports.default=EchartsLayer;
- /***/ }),
- /* 134 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _echarts=_interopRequireDefault(__webpack_require__(50));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var _EchartsLayer=_interopRequireDefault(__webpack_require__(51));/**
- * @class EchatsLayerViewModel
- * @param {mapboxgl.map} map - mapboxgl map 对象。
- * @param {String} options - EchartsLayer options。
- */var EchatsLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(EchatsLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(EchatsLayerViewModel);function EchatsLayerViewModel(map,options){var _this;(0,_classCallCheck2.default)(this,EchatsLayerViewModel);_this=_super.call(this);if(!options){throw new Error('echarts options is requierd');}if(!map){throw new Error('map is requierd');}_this.map=map;_this.options=options;_this._initializeEchartsLayer();return _this;}(0,_createClass2.default)(EchatsLayerViewModel,[{key:"_initializeEchartsLayer",value:function _initializeEchartsLayer(){window.echarts=_echarts.default;var echartslayer=new _EchartsLayer.default(this.map);echartslayer.chart.setOption(this.options);/**
- * @event echartslayeraddsucceeded
- * @property {Object} layer - Echarts Layer.
- */this.fire('echartslayeraddsucceeded',{layer:echartslayer});this.echartslayer=echartslayer;}}]);return EchatsLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=EchatsLayerViewModel;
- /***/ }),
- /* 135 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(15));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _DataFlowLayerViewModel=_interopRequireDefault(__webpack_require__(136));var _types=__webpack_require__(59);var _util=__webpack_require__(11);var _dec,_class,_class2,_temp;var DataFlowLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(DataFlowLayer,_React$Component);var _super=(0,_createSuper2.default)(DataFlowLayer);function DataFlowLayer(){var _this;(0,_classCallCheck2.default)(this,DataFlowLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(DataFlowLayer,[{key:"loaded",value:function loaded(map){var options=JSON.parse(JSON.stringify(this.props));delete options.serviceUrl;this.viewModel=new _DataFlowLayerViewModel.default(map,this.props.serviceUrl,(0,_objectSpread2.default)({},options));this.registerEvents();}},{key:"registerEvents",value:function registerEvents(){var _this2=this;// @ts-ignore
- this.viewModel.on('subscribefailed',function(e){// this.$message.error(this.$t('dataFlow.dataSubscriptionFailed'));
- /**
- * @event subscribeFailed
- * @desc 数据订阅失败后触发。
- * @property {Object} e - 事件对象。
- */(0,_util.isFunction)(_this2.props.onSubscribeFailed)&&_this2.props.onSubscribeFailed(e);});// @ts-ignore
- this.viewModel.on('subscribesucceeded',function(e){/**
- * @event subscribeSucceeded
- * @desc 数据订阅失败后触发。
- * @property {Object} e - 事件对象。
- */(0,_util.isFunction)(_this2.props.onSubscribeSucceeded)&&_this2.props.onSubscribeSucceeded(e);});// @ts-ignore
- this.viewModel.on('dataupdated',function(e){/**
- * @event dataUpdated
- * @desc 数据更新成功后触发。
- * @property {GeoJSONObject} data - 更新的数据。
- * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
- */(0,_util.isFunction)(_this2.props.onDataUpdated)&&_this2.props.onDataUpdated(e);});}},{key:"render",value:function render(){return null;}}]);return DataFlowLayer;}(_react.default.Component),_class2.defaultProps={layerStyle:{line:new _types.LineStyle(),circle:new _types.CircleStyle(),fill:new _types.FillStyle()}},_temp))||_class);exports.default=DataFlowLayer;
- /***/ }),
- /* 136 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _lodash=_interopRequireDefault(__webpack_require__(53));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));__webpack_require__(12);/**
- * @class DataFlowLayerViewModel
- * @category ViewModel
- * @classdesc 数据流图层组件功能类。
- * @param {mapboxgl.Map} map - mapboxgl map 对象。
- * @param {String} serviceUrl - 数据流服务地址。
- * @param {Object} [options] - 可选参数。
- * @param {String} [options.layerId] - 图层 ID。
- * @param {Object} [options.layerStyle] - 指定图层样式。
- * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。
- * @param {String} [options.excludeField] - 排除字段。
- * @param {Object} [options.styleOptions] - style OPtion
- * @fires DataFlowLayerViewModel#subscribesucceeded
- * @fires DataFlowLayerViewModel#subscribefailed
- * @fires DataFlowLayerViewModel#dataUpdated
- */var DataFlowLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(DataFlowLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(DataFlowLayerViewModel);function DataFlowLayerViewModel(map,serviceUrl,options){var _this;(0,_classCallCheck2.default)(this,DataFlowLayerViewModel);_this=_super.call(this);if(!serviceUrl){throw new Error('serviceUrl is requierd');}if(!map){throw new Error('map is requierd');}_this.options=options||{};_this.map=map;_this.serviceUrl=serviceUrl;_this.sourceID=options.layerId||'dataFlow'+new Date().getTime();_this.layerStyle=options.layerStyle||{};if(_this.options.registerToken){SuperMap.SecurityManager.registerToken(_this.serviceUrl,_this.options.registerToken);}_this._initializeDataFlow();return _this;}(0,_createClass2.default)(DataFlowLayerViewModel,[{key:"setLaterStyle",value:function setLaterStyle(layerStyle){this.layerStyle=layerStyle;}/**
- * @function DataFlowLayerViewModel.prototype.setExcludeField
- * @description 设置唯一字段。
- * @param {string} excludeField - 唯一字段。
- */},{key:"setExcludeField",value:function setExcludeField(excludeField){this.dataService.setExcludeField(excludeField);this.options.excludeField=excludeField;return this;}/**
- * @function DataFlowLayerViewModel.prototype.setGeometry
- * @description 设置集合要素。
- * @param {GeoJSONObject} geometry - 待设置的 GeoJSON 几何要素对象。
- */},{key:"setGeometry",value:function setGeometry(geometry){this.dataService.setGeometry(geometry);this.options.geometry=geometry;return this;}},{key:"_initializeDataFlow",value:function _initializeDataFlow(){var _this2=this;var dataService=new _mapboxGlEnhance.default.supermap.DataFlowService(this.serviceUrl,{geometry:this.options.geometry,excludeField:this.options.excludeField}).initSubscribe();dataService.on('subscribeSocketConnected',function(e){/**
- * @event DataFlowLayerViewModel#subscribesucceeded
- * @description 数据订阅成功后触发。
- * @property {Object} e - 事件对象。
- */_this2.fire('subscribesucceeded',e);});dataService.on('subscribeSocketError',function(e){/**
- * @event DataFlowLayerViewModel#subscribefailed
- * @description 数据订阅失败后触发。
- * @property {Object} e - 事件对象。
- */_this2.fire('subscribefailed',e);});dataService.on('messageSucceeded',function(msg){_this2._addLayer(msg);});this.dataService=dataService;}},{key:"_addLayer",value:function _addLayer(msg){if(!msg.featureResult){return;}var feature=msg.featureResult;var type=feature.geometry.type;var layerStyle=this.layerStyle;if(!this.map.getSource(this.sourceID)){this.map.addSource(this.sourceID,{type:'geojson',data:{type:'FeatureCollection',features:[feature]}});if(type==='Point'){var pointType='circle';var pointPaint={'circle-radius':6,'circle-color':'red'};if(layerStyle.symbol){pointType='symbol';pointPaint={};}this.map.addLayer({id:this.sourceID,type:pointType,source:this.sourceID,paint:layerStyle[pointType]&&layerStyle[pointType].paint||pointPaint,layout:layerStyle[pointType]&&layerStyle[pointType].layout||{}});}else if(type==='MultiPolygon'||type==='Polygon'){this.map.addLayer({id:this.sourceID,type:'fill',paint:layerStyle.fill&&layerStyle.fill.paint||{'fill-color':'red','fill-opacity':1},layout:layerStyle.fill&&layerStyle.fill.layout||{},source:this.sourceID});}else if(type==='LineString'||type==='Line'||type==='MultiLineString'){this.map.addLayer({id:this.sourceID,type:'line',paint:layerStyle.line&&layerStyle.line.paint||{'line-width':5,'line-color':'red','line-opacity':1},layout:layerStyle.line&&layerStyle.line.layout||{},source:this.sourceID});}}else{// update layer
- var features=(0,_lodash.default)(this.map.getSource(this.sourceID)._data.features);var has=false;features.forEach(function(item,index){if(item.properties.id===feature.properties.id){has=true;features[index]=feature;}});if(!has){features.push(feature);}this.map.getSource(this.sourceID).setData({type:'FeatureCollection',features:features});/**
- * @event DataFlowLayerViewModel#dataUpdated
- * @description 数据更新成功后触发。
- * @property {GeoJSONObject} data - 更新的数据。
- * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
- */this.fire('dataupdated',{data:feature,map:this.map});}}}]);return DataFlowLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=DataFlowLayerViewModel;
- /***/ }),
- /* 137 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));/**
- * @class FillStyle
- * @category BaseTypes Style
- * @classdesc 面图层样式类。
- * @param {mapboxgl.LayersFill} paint - MapboxGL 面图层 Paint 配置。
- * @param {mapboxgl.LayersFill} layout - MapboxGL 面图层 Layout 配置。
- */var FillStyle=function FillStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,FillStyle);this.layout={visibility:'visible'};this.paint={'fill-opacity':0.8,'fill-color':'#3fb1e3','fill-translate':[0,0],'fill-antialias':true,'fill-outline-color':'#3fb1e3','fill-translate-anchor':'map'};Object.assign(this.paint,paint);Object.assign(this.layout,layout);};exports.default=FillStyle;
- /***/ }),
- /* 138 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));/**
- * @class LineStyle
- * @category BaseTypes Style
- * @classdesc 线图层样式类。
- * @param {mapboxgl.LayersLine} paint - MapboxGL 线图层 Paint 配置。
- * @param {mapboxgl.LayersLine} layout - MapboxGL 线图层 Layout 配置。
- */var LineStyle=function LineStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,LineStyle);this.layout={visibility:'visible','line-cap':'butt','line-join':'miter'};this.paint={'line-opacity':1,'line-color':'#3fb1e3','line-width':3,'line-blur':1};Object.assign(this.paint,paint);Object.assign(this.layout,layout);};exports.default=LineStyle;
- /***/ }),
- /* 139 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));/**
- * @class SymbolStyle
- * @classdesc symbol 图层样式类。
- */var SymbolStyle=function SymbolStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,SymbolStyle);this.paint=Object.assign({},paint);this.layout=Object.assign({visibility:'visible'},layout);};exports.default=SymbolStyle;
- /***/ }),
- /* 140 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _compose2=_interopRequireDefault(__webpack_require__(8));var _react=_interopRequireDefault(__webpack_require__(5));var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _baseLayer=_interopRequireDefault(__webpack_require__(9));var _FireLayerViewModel=_interopRequireDefault(__webpack_require__(141));var _dec,_class,_class2,_temp;var FireLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_temp=_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(FireLayer,_React$Component);var _super=(0,_createSuper2.default)(FireLayer);function FireLayer(){var _this;(0,_classCallCheck2.default)(this,FireLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;return _this;}(0,_createClass2.default)(FireLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this$props=this.props,features=_this$props.features,modelScale=_this$props.modelScale;if(this.viewModel){if(!(0,_lodash.default)(prevProps.features,features)){this.viewModel.setFeatures(features);}if(prevProps.modelScale!==modelScale){this.viewModel.setModelScale(modelScale);}}}},{key:"loaded",value:function loaded(map){this.viewModel=new _FireLayerViewModel.default(map,this.props.features,this.props.modelScale,this.props.layerId);}},{key:"render",value:function render(){return null;}}]);return FireLayer;}(_react.default.Component),_class2.defaultProps={modelScale:5.41843220338983e-6},_temp))||_class);exports.default=FireLayer;
- /***/ }),
- /* 141 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireWildcard=__webpack_require__(19);var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _toConsumableArray2=_interopRequireDefault(__webpack_require__(156));var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var THREE=_interopRequireWildcard(__webpack_require__(142));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var _tendrils=_interopRequireDefault(__webpack_require__(143));var FireLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(FireLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(FireLayerViewModel);function FireLayerViewModel(map,features){var _this;var modelScale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:5.41843220338983e-6;var layerId=arguments.length>3?arguments[3]:undefined;(0,_classCallCheck2.default)(this,FireLayerViewModel);_this=_super.call(this);_this.map=void 0;_this.layerId=void 0;_this.features=void 0;_this.modelScale=void 0;_this.camera=void 0;_this.scene=void 0;_this.renderer=void 0;_this._object=void 0;_this._fireballs=void 0;_this._height=void 0;_this._radius=void 0;_this._fireMaterial=void 0;_this._light=void 0;_this._lightIntensity=void 0;if(!map){throw new Error('map is requierd');}_this.map=map;_this.layerId=layerId;_this.features=features;_this.modelScale=modelScale;_this.features&&_this._addFireLayer();return _this;}(0,_createClass2.default)(FireLayerViewModel,[{key:"setFeatures",value:function setFeatures(features){this.features=features;this._addFireLayer();}},{key:"setModelScale",value:function setModelScale(modelScale){this.modelScale=modelScale;this._addFireLayer();}},{key:"_addFireLayer",value:function _addFireLayer(){var _this2=this;var feature=this.features.features[0];if(feature.geometry.type!=='Point'){throw new Error("Feature's type must be point");}if(this.features.features.length>50){throw new Error('The maximum number of features is 50');}this.features.features.forEach(function(feature,index){var geometry=feature.geometry;if(geometry.type==='Point'){_this2._initializeFireLayer(geometry.coordinates,index);}});}},{key:"_initializeFireLayer",value:function _initializeFireLayer(originCoordinate,index){var _this3=this;var modelTransform=this._getModelTransform(originCoordinate);var layerId=this.layerId&&this.layerId+'-'+index||"threeLayerFire-".concat(new Date());this.map.getLayer(layerId)&&this.map.removeLayer(layerId);var customLayer={id:layerId,type:'custom',renderingMode:'3d',onAdd:function onAdd(map,gl){_this3.camera=new THREE.PerspectiveCamera(45,map.getCanvas().width/map.getCanvas().height,0.1,2000);_this3.scene=new THREE.Scene();_this3.renderer=new THREE.WebGLRenderer({canvas:map.getCanvas(),context:gl,antialias:true});_this3.renderer.autoClear=false;var rig=new THREE.Group();rig.add(_this3.camera);_this3.scene.add(rig);_this3._fire();_this3.scene.add(_this3._object);var light=new THREE.PointLight(0xffffff,1,100);light.position.set(10,10,20);_this3.scene.add(light);_this3.map=map;},render:function render(gl,matrix){var rotationX=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1,0,0),modelTransform.rotateX);var rotationY=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,1,0),modelTransform.rotateY);var rotationZ=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,0,1),modelTransform.rotateZ);var m=new THREE.Matrix4().fromArray(matrix);var l=new THREE.Matrix4().makeTranslation(modelTransform.translateX,modelTransform.translateY,modelTransform.translateZ).scale(new THREE.Vector3(modelTransform.scale,-modelTransform.scale,modelTransform.scale)).multiply(rotationX).multiply(rotationY).multiply(rotationZ);_this3.camera.projectionMatrix.elements=matrix;_this3.camera.projectionMatrix=m.multiply(l);_this3.renderer.state.reset();_this3._update();_this3.renderer.render(_this3.scene,_this3.camera);// @ts-ignore
- _this3.map.triggerRepaint();}};// @ts-ignore TODO mapbox-gl types 未更新
- this.map.addLayer(customLayer);}},{key:"_getModelTransform",value:function _getModelTransform(originCoordinate){var modelOrigin=originCoordinate;var modelAltitude=0;var modelRotate=[Math.PI/2,0,0];var modelTransform={translateX:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).x,translateY:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).y,translateZ:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).z,rotateX:modelRotate[0],rotateY:modelRotate[1],rotateZ:modelRotate[2],scale:this.modelScale};return modelTransform;}},{key:"_fire",value:function _fire(){var _this$_object;var density=arguments.length>0&&arguments[0]!==undefined?arguments[0]:150;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:8;var r=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0.2;this._object=new THREE.Group();this._fireballs=[];this._height=height;this._radius=r;var texture=new THREE.TextureLoader().load(_tendrils.default,function(){console.log('loaded');},undefined,function(e){console.log('error',e);});// @ts-ignore
- texture.crossOrigin='';// "anonymous";
- this._fireMaterial=new THREE.ShaderMaterial({uniforms:{time:{value:1.0},blend:{value:1.0},blendPattern:{type:'t',value:texture}},vertexShader:"precision mediump float;\n precision mediump int;\n attribute vec4 color;\n varying vec2 vUv;\n varying float vFade;\n void main()\t{\n vUv = uv;\n vec4 localPosition = vec4( position, 1);\n vFade = clamp((localPosition.y + 3.0) / 6.0, 0.0, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * localPosition;\n }",fragmentShader:"precision mediump float;\n precision mediump int;\n uniform float time;\n uniform float blend;\n uniform sampler2D blendPattern;\n varying float vFade;\n varying vec2 vUv;\n\n\n void main()\t{\n\n vec4 startColor = vec4(1., 0.5, 0.1, 1.0);\n vec4 endColor = vec4(0.2, 0.2, 0.2, 1.0);\n\n float dissolve = texture2D(blendPattern, vUv).r * 0.5;\n\n float spread = 0.4;\n\n float fadeAmount = smoothstep(\n max(0.0, vFade - spread),\n min(1.0, vFade + spread),\n blend + dissolve\n );\n\n vec4 color = mix(\n startColor, endColor,\n smoothstep(0.1,1., fadeAmount)\n );\n\n gl_FragColor = vec4(color.rgb, 1.-fadeAmount);\n }",transparent:true,side:THREE.DoubleSide,blending:THREE.AdditiveBlending});this._light=new THREE.PointLight(0xff5500,1,100);this._light.position.set(0,0.4,0);this._lightIntensity=Math.random()*5;this._object.add(this._light);// this._fireMaterial = new THREE.MeshStandardMaterial(0x661100);
- for(var i=0;i<density;i++){var geometry=new THREE.SphereGeometry(1,32,32);var mat=this._fireMaterial.clone();mat.uniforms.blendPattern.value=texture;mat.needsUpdate=true;var sphere=new THREE.Mesh(geometry,mat);sphere.position.y=Math.random()*height;sphere.position.x=(0.5-Math.random())*this._radius;sphere.position.z=(0.5-Math.random())*this._radius;sphere.rotateX(Math.random()*5);sphere.rotateZ(Math.random()*5);sphere.rotateY(Math.random()*5);// @ts-ignore
- sphere.dirX=(0.5-Math.random())*0.006;// @ts-ignore
- sphere.dirY=0.006;// @ts-ignore
- sphere.dirZ=(0.5-Math.random())*0.006;this._fireballs.push(sphere);}(_this$_object=this._object).add.apply(_this$_object,(0,_toConsumableArray2.default)(this._fireballs));}},{key:"_update",value:function _update(){var _this4=this;this._fireballs.forEach(function(ball){ball.position.y+=ball.dirY;ball.position.x+=Math.sin(ball.position.y)*ball.dirX;ball.position.z+=Math.cos(ball.position.y)*ball.dirZ;if(ball.position.y>_this4._height){ball.position.y=Math.random()*0.1;ball.position.x=(0.5-Math.random())*_this4._radius;ball.position.z=(0.5-Math.random())*_this4._radius;}var p=0.1+ball.position.y/_this4._height;ball.rotateX((1.2-p)*0.01);ball.rotateZ((1.2-p)*0.01);ball.rotateY((1.2-p)*0.01);ball.scale.set(p,p,p);/// ball.opacity = p;
- ball.material.uniforms.blend.value=p;// ball.material.needsUpdate = true;
- });this._light.intensity+=(this._lightIntensity-this._light.intensity)*0.006;if(Math.random()>0.8){this._lightIntensity=Math.random()*5;}}}]);return FireLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=FireLayerViewModel;
- /***/ }),
- /* 142 */
- /***/ (function(module, exports) {
- module.exports = __WEBPACK_EXTERNAL_MODULE__142__;
- /***/ }),
- /* 143 */
- /***/ (function(module, exports) {
- module.exports = "data:image/png;base64,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"
- /***/ }),
- /* 144 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _react=__webpack_require__(5);var _lodash=_interopRequireDefault(__webpack_require__(13));var _mapGetter=_interopRequireDefault(__webpack_require__(6));var _AnimateMarkerLayerViewModel=_interopRequireDefault(__webpack_require__(145));var _BreathingApertureMarker=_interopRequireDefault(__webpack_require__(149));var _DiffusedApertureMarker=_interopRequireDefault(__webpack_require__(150));var _HaloRingMarker=_interopRequireDefault(__webpack_require__(151));var _RotatingApertureMarker=_interopRequireDefault(__webpack_require__(152));var _RotatingTextBorderMarker=_interopRequireDefault(__webpack_require__(153));var _FluorescenceMarker=_interopRequireDefault(__webpack_require__(154));var _class,_class2,_temp;var AnimateMarkerLayer=(0,_mapGetter.default)(_class=(_temp=_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(AnimateMarkerLayer,_Component);var _super=(0,_createSuper2.default)(AnimateMarkerLayer);function AnimateMarkerLayer(){var _this;(0,_classCallCheck2.default)(this,AnimateMarkerLayer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.viewModel=void 0;_this.map=void 0;_this.marker=void 0;_this._markersElement=void 0;return _this;}(0,_createClass2.default)(AnimateMarkerLayer,[{key:"componentDidMount",value:function componentDidMount(){this._markersElement=[];}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.viewModel&&!(0,_lodash.default)(prevProps.features,this.props.features)){this._markersElement=[];this._getMarkerElement();this.props.features&&this.viewModel.setFeatures(this.props.features,this._markersElement);}if(this.viewModel&&!(0,_lodash.default)(prevProps.type,this.props.type)){this._markersElement=[];this._getMarkerElement();this.viewModel.setType(this._markersElement);}if(this.viewModel&&this.props.width&&prevProps.width!==this.props.width){this.marker&&this.marker.setMarkersWidth(this.props.width);}if(this.viewModel&&this.props.height&&prevProps.height!==this.props.height){this.marker&&this.marker.setMarkersHeight&&this.marker.setMarkersHeight(this.props.height);}if(this.viewModel&&this.props.textColor&&prevProps.textColor!==this.props.textColor){this.marker&&this.marker.setMarkersTextColor(this.props.textColor);}if(this.viewModel&&this.props.textFontSize&&prevProps.textFontSize!==this.props.textFontSize){this.marker&&this.marker.setMarkersTextFontSize(this.props.textFontSize);}if(this.viewModel&&this.props.colors&&this.props.colors.length&&this.props.colors.length>0&&!(0,_lodash.default)(prevProps.colors,this.props.colors)){this.marker&&this.marker.setMarkersTextFontSize(this.props.textFontSize);}if(this.viewModel&&this.props.textField&&prevProps.textField!==this.props.textField){this.marker&&this.marker.setMarkersTextField(this.props.textField);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.viewModel&&this.viewModel.clearMarkerLayer();}},{key:"loaded",value:function loaded(map){this.props.features&&this._getMarkerElement();this.viewModel=new _AnimateMarkerLayerViewModel.default(map,this.props.features,this._markersElement,this.props.fitBounds);}},{key:"_getMarkerElement",value:function _getMarkerElement(){this.setState({marker:null});var _this$props=this.props,features=_this$props.features,width=_this$props.width,height=_this$props.height,colors=_this$props.colors,textFontSize=_this$props.textFontSize,textColor=_this$props.textColor,textField=_this$props.textField,type=_this$props.type;if(!features||JSON.stringify(features)==='{}'||!features.features){this.viewModel&&this.viewModel.clearMarkerLayer();return;}switch(type){case'rotatingAperture':this.marker=new _RotatingApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'haloRing':this.marker=new _HaloRingMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'breathingAperture':this.marker=new _BreathingApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'diffusedAperture':this.marker=new _DiffusedApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'rotatingTextBorder':this.marker=new _RotatingTextBorderMarker.default(features,{width:width,height:height,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'fluorescence':this.marker=new _FluorescenceMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;}this.marker&&(this._markersElement=this.marker.getMarkersElement());}},{key:"render",value:function render(){return null;}}]);return AnimateMarkerLayer;}(_react.Component),_class2.defaultProps={type:'breathingAperture',textFontSize:14},_temp))||_class;exports.default=AnimateMarkerLayer;
- /***/ }),
- /* 145 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(7));var _envelope=_interopRequireDefault(__webpack_require__(157));var _bbox=_interopRequireDefault(__webpack_require__(146));var _transformScale=_interopRequireDefault(__webpack_require__(155));var AnimateMarkerLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(AnimateMarkerLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(AnimateMarkerLayerViewModel);function AnimateMarkerLayerViewModel(map,features,markersElement){var _this;var fitBounds=arguments.length>3&&arguments[3]!==undefined?arguments[3]:true;(0,_classCallCheck2.default)(this,AnimateMarkerLayerViewModel);_this=_super.call(this);_this.map=void 0;_this.features=void 0;_this.markers=void 0;_this.markersElement=void 0;_this.fitBounds=void 0;if(!map){throw new Error('map is requierd');}_this.map=map;_this.features=features;_this.markers=[];_this.markersElement=markersElement;_this.fitBounds=fitBounds;_this.features&&_this._initalizeMarkerLayer();return _this;}(0,_createClass2.default)(AnimateMarkerLayerViewModel,[{key:"setType",value:function setType(markersElement){this.markersElement=markersElement;this._initalizeMarkerLayer();}},{key:"setFeatures",value:function setFeatures(features,markersElement){this.markersElement=markersElement;this.features=features;this._initalizeMarkerLayer();}},{key:"_initalizeMarkerLayer",value:function _initalizeMarkerLayer(){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.clearMarkerLayer();this._createMarker();}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point,index){var marker=new _mapboxGlEnhance.default.Marker(_this2.markersElement[index]||_this2.markersElement[0])// @ts-ignore
- .setLngLat(point.geometry.coordinates).addTo(_this2.map);_this2.markers.push(marker);},this);if(this.fitBounds){// @ts-ignore
- var bounds=(0,_bbox.default)((0,_transformScale.default)((0,_envelope.default)(this.features),1.7));this.fitBounds&&this.map.fitBounds([[bounds[0],bounds[1]],[bounds[2],bounds[3]]],{maxZoom:17});}}},{key:"clearMarkerLayer",value:function clearMarkerLayer(){this.markers.length>0&&this.markers.forEach(function(marker){marker&&marker.remove();});this.markers=[];}}]);return AnimateMarkerLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports.default=AnimateMarkerLayerViewModel;
- /***/ }),
- /* 146 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var meta_1 = __webpack_require__(147);
- /**
- * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
- *
- * @name bbox
- * @param {GeoJSON} geojson any GeoJSON object
- * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
- * var bbox = turf.bbox(line);
- * var bboxPolygon = turf.bboxPolygon(bbox);
- *
- * //addToMap
- * var addToMap = [line, bboxPolygon]
- */
- function bbox(geojson) {
- var result = [Infinity, Infinity, -Infinity, -Infinity];
- meta_1.coordEach(geojson, function (coord) {
- if (result[0] > coord[0]) {
- result[0] = coord[0];
- }
- if (result[1] > coord[1]) {
- result[1] = coord[1];
- }
- if (result[2] < coord[0]) {
- result[2] = coord[0];
- }
- if (result[3] < coord[1]) {
- result[3] = coord[1];
- }
- });
- return result;
- }
- exports.default = bbox;
- /***/ }),
- /* 147 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, '__esModule', { value: true });
- var helpers = __webpack_require__(148);
- /**
- * Callback for coordEach
- *
- * @callback coordEachCallback
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
- *
- * @name coordEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function coordEach(geojson, callback, excludeWrapCoord) {
- // Handles null Geometry -- Skips this GeoJSON
- if (geojson === null) return;
- var j, k, l, geometry, stopG, coords,
- geometryMaybeCollection,
- wrapShrink = 0,
- coordIndex = 0,
- isGeometryCollection,
- type = geojson.type,
- isFeatureCollection = type === 'FeatureCollection',
- isFeature = type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
- (isFeature ? geojson.geometry : geojson));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
- var multiFeatureIndex = 0;
- var geometryIndex = 0;
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
- // Handles null Geometry -- Skips this geometry
- if (geometry === null) continue;
- coords = geometry.coordinates;
- var geomType = geometry.type;
- wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
- switch (geomType) {
- case null:
- break;
- case 'Point':
- if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- multiFeatureIndex++;
- break;
- case 'LineString':
- case 'MultiPoint':
- for (j = 0; j < coords.length; j++) {
- if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- if (geomType === 'MultiPoint') multiFeatureIndex++;
- }
- if (geomType === 'LineString') multiFeatureIndex++;
- break;
- case 'Polygon':
- case 'MultiLineString':
- for (j = 0; j < coords.length; j++) {
- for (k = 0; k < coords[j].length - wrapShrink; k++) {
- if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- if (geomType === 'MultiLineString') multiFeatureIndex++;
- if (geomType === 'Polygon') geometryIndex++;
- }
- if (geomType === 'Polygon') multiFeatureIndex++;
- break;
- case 'MultiPolygon':
- for (j = 0; j < coords.length; j++) {
- geometryIndex = 0;
- for (k = 0; k < coords[j].length; k++) {
- for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
- if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- geometryIndex++;
- }
- multiFeatureIndex++;
- }
- break;
- case 'GeometryCollection':
- for (j = 0; j < geometry.geometries.length; j++)
- if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
- break;
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- }
- }
- /**
- * Callback for coordReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback coordReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
- *
- * @name coordReduce
- * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentCoord;
- * });
- */
- function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
- var previousValue = initialValue;
- coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
- else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
- }, excludeWrapCoord);
- return previousValue;
- }
- /**
- * Callback for propEach
- *
- * @callback propEachCallback
- * @param {Object} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over properties in any GeoJSON object, similar to Array.forEach()
- *
- * @name propEach
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentProperties, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propEach(features, function (currentProperties, featureIndex) {
- * //=currentProperties
- * //=featureIndex
- * });
- */
- function propEach(geojson, callback) {
- var i;
- switch (geojson.type) {
- case 'FeatureCollection':
- for (i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i].properties, i) === false) break;
- }
- break;
- case 'Feature':
- callback(geojson.properties, 0);
- break;
- }
- }
- /**
- * Callback for propReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback propReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {*} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce properties in any GeoJSON object into a single value,
- * similar to how Array.reduce works. However, in this case we lazily run
- * the reduction, so an array of all properties is unnecessary.
- *
- * @name propReduce
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
- * //=previousValue
- * //=currentProperties
- * //=featureIndex
- * return currentProperties
- * });
- */
- function propReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- propEach(geojson, function (currentProperties, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
- else previousValue = callback(previousValue, currentProperties, featureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for featureEach
- *
- * @callback featureEachCallback
- * @param {Feature<any>} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name featureEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.featureEach(features, function (currentFeature, featureIndex) {
- * //=currentFeature
- * //=featureIndex
- * });
- */
- function featureEach(geojson, callback) {
- if (geojson.type === 'Feature') {
- callback(geojson, 0);
- } else if (geojson.type === 'FeatureCollection') {
- for (var i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i], i) === false) break;
- }
- }
- }
- /**
- * Callback for featureReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback featureReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name featureReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * return currentFeature
- * });
- */
- function featureReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- featureEach(geojson, function (currentFeature, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex);
- });
- return previousValue;
- }
- /**
- * Get all coordinates from any GeoJSON object.
- *
- * @name coordAll
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @returns {Array<Array<number>>} coordinate position array
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * var coords = turf.coordAll(features);
- * //= [[26, 37], [36, 53]]
- */
- function coordAll(geojson) {
- var coords = [];
- coordEach(geojson, function (coord) {
- coords.push(coord);
- });
- return coords;
- }
- /**
- * Callback for geomEach
- *
- * @callback geomEachCallback
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
- *
- * @name geomEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * });
- */
- function geomEach(geojson, callback) {
- var i, j, g, geometry, stopG,
- geometryMaybeCollection,
- isGeometryCollection,
- featureProperties,
- featureBBox,
- featureId,
- featureIndex = 0,
- isFeatureCollection = geojson.type === 'FeatureCollection',
- isFeature = geojson.type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (i = 0; i < stop; i++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
- (isFeature ? geojson.geometry : geojson));
- featureProperties = (isFeatureCollection ? geojson.features[i].properties :
- (isFeature ? geojson.properties : {}));
- featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
- (isFeature ? geojson.bbox : undefined));
- featureId = (isFeatureCollection ? geojson.features[i].id :
- (isFeature ? geojson.id : undefined));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (g = 0; g < stopG; g++) {
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
- // Handle null Geometry
- if (geometry === null) {
- if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- continue;
- }
- switch (geometry.type) {
- case 'Point':
- case 'LineString':
- case 'MultiPoint':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon': {
- if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- break;
- }
- case 'GeometryCollection': {
- for (j = 0; j < geometry.geometries.length; j++) {
- if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- }
- break;
- }
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- // Only increase `featureIndex` per each feature
- featureIndex++;
- }
- }
- /**
- * Callback for geomReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback geomReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Reduce geometry in any GeoJSON object, similar to Array.reduce().
- *
- * @name geomReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=previousValue
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * return currentGeometry
- * });
- */
- function geomReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
- else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
- });
- return previousValue;
- }
- /**
- * Callback for flattenEach
- *
- * @callback flattenEachCallback
- * @param {Feature} currentFeature The current flattened feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Iterate over flattened features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name flattenEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * });
- */
- function flattenEach(geojson, callback) {
- geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
- // Callback for single geometry
- var type = (geometry === null) ? null : geometry.type;
- switch (type) {
- case null:
- case 'Point':
- case 'LineString':
- case 'Polygon':
- if (callback(helpers.feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
- return;
- }
- var geomType;
- // Callback for multi-geometry
- switch (type) {
- case 'MultiPoint':
- geomType = 'Point';
- break;
- case 'MultiLineString':
- geomType = 'LineString';
- break;
- case 'MultiPolygon':
- geomType = 'Polygon';
- break;
- }
- for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
- var coordinate = geometry.coordinates[multiFeatureIndex];
- var geom = {
- type: geomType,
- coordinates: coordinate
- };
- if (callback(helpers.feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
- }
- });
- }
- /**
- * Callback for flattenReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback flattenReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
- *
- * @name flattenReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * return currentFeature
- * });
- */
- function flattenReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
- if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for segmentEach
- *
- * @callback segmentEachCallback
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- * @returns {void}
- */
- /**
- * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //=currentSegment
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * //=segmentIndex
- * });
- *
- * // Calculate the total number of segments
- * var total = 0;
- * turf.segmentEach(polygon, function () {
- * total++;
- * });
- */
- function segmentEach(geojson, callback) {
- flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {
- var segmentIndex = 0;
- // Exclude null Geometries
- if (!feature.geometry) return;
- // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- var type = feature.geometry.type;
- if (type === 'Point' || type === 'MultiPoint') return;
- // Generate 2-vertex line segments
- var previousCoords;
- var previousFeatureIndex = 0;
- var previousMultiIndex = 0;
- var prevGeomIndex = 0;
- if (coordEach(feature, function (currentCoord, coordIndex, featureIndexCoord, multiPartIndexCoord, geometryIndex) {
- // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
- if (previousCoords === undefined || featureIndex > previousFeatureIndex || multiPartIndexCoord > previousMultiIndex || geometryIndex > prevGeomIndex) {
- previousCoords = currentCoord;
- previousFeatureIndex = featureIndex;
- previousMultiIndex = multiPartIndexCoord;
- prevGeomIndex = geometryIndex;
- segmentIndex = 0;
- return;
- }
- var currentSegment = helpers.lineString([previousCoords, currentCoord], feature.properties);
- if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
- segmentIndex++;
- previousCoords = currentCoord;
- }) === false) return false;
- });
- }
- /**
- * Callback for segmentReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback segmentReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- */
- /**
- * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //= previousSegment
- * //= currentSegment
- * //= featureIndex
- * //= multiFeatureIndex
- * //= geometryIndex
- * //= segmentInex
- * return currentSegment
- * });
- *
- * // Calculate the total number of segments
- * var initialValue = 0
- * var total = turf.segmentReduce(polygon, function (previousValue) {
- * previousValue++;
- * return previousValue;
- * }, initialValue);
- */
- function segmentReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- var started = false;
- segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- if (started === false && initialValue === undefined) previousValue = currentSegment;
- else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
- started = true;
- });
- return previousValue;
- }
- /**
- * Callback for lineEach
- *
- * @callback lineEachCallback
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
- * similar to Array.forEach.
- *
- * @name lineEach
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @example
- * var multiLine = turf.multiLineString([
- * [[26, 37], [35, 45]],
- * [[36, 53], [38, 50], [41, 55]]
- * ]);
- *
- * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function lineEach(geojson, callback) {
- // validation
- if (!geojson) throw new Error('geojson is required');
- flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {
- if (feature.geometry === null) return;
- var type = feature.geometry.type;
- var coords = feature.geometry.coordinates;
- switch (type) {
- case 'LineString':
- if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
- break;
- case 'Polygon':
- for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
- if (callback(helpers.lineString(coords[geometryIndex], feature.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- }
- break;
- }
- });
- }
- /**
- * Callback for lineReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback lineReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name lineReduce
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var multiPoly = turf.multiPolygon([
- * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
- * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
- * ]);
- *
- * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentLine
- * });
- */
- function lineReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
- else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
- });
- return previousValue;
- }
- /**
- * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- * Point & MultiPoint will always return null.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.segmentIndex=0] Segment Index
- * @param {Object} [options.properties={}] Translate Properties to output LineString
- * @param {BBox} [options.bbox={}] Translate BBox to output LineString
- * @param {number|string} [options.id={}] Translate Id to output LineString
- * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findSegment(multiLine);
- * // => Feature<LineString<[[10, 10], [50, 30]]>>
- *
- * // First Segment of 2nd Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: 1});
- * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
- *
- * // Last Segment of Last Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
- * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
- */
- function findSegment(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers.isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var segmentIndex = options.segmentIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find SegmentIndex
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
- return helpers.lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
- return helpers.lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
- return helpers.lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
- return helpers.lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- /**
- * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.coordIndex=0] Coord Index
- * @param {Object} [options.properties={}] Translate Properties to output Point
- * @param {BBox} [options.bbox={}] Translate BBox to output Point
- * @param {number|string} [options.id={}] Translate Id to output Point
- * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findPoint(multiLine);
- * // => Feature<Point<[10, 10]>>
- *
- * // First Segment of the 2nd Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: 1});
- * // => Feature<Point<[-10, -10]>>
- *
- * // Last Segment of last Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
- * // => Feature<Point<[-30, -40]>>
- */
- function findPoint(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers.isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var coordIndex = options.coordIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find Coord Index
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- return helpers.point(coords, properties, options);
- case 'MultiPoint':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- return helpers.point(coords[multiFeatureIndex], properties, options);
- case 'LineString':
- if (coordIndex < 0) coordIndex = coords.length + coordIndex;
- return helpers.point(coords[coordIndex], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
- return helpers.point(coords[geometryIndex][coordIndex], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
- return helpers.point(coords[multiFeatureIndex][coordIndex], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
- return helpers.point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- exports.coordEach = coordEach;
- exports.coordReduce = coordReduce;
- exports.propEach = propEach;
- exports.propReduce = propReduce;
- exports.featureEach = featureEach;
- exports.featureReduce = featureReduce;
- exports.coordAll = coordAll;
- exports.geomEach = geomEach;
- exports.geomReduce = geomReduce;
- exports.flattenEach = flattenEach;
- exports.flattenReduce = flattenReduce;
- exports.segmentEach = segmentEach;
- exports.segmentReduce = segmentReduce;
- exports.lineEach = lineEach;
- exports.lineReduce = lineReduce;
- exports.findSegment = findSegment;
- exports.findPoint = findPoint;
- /***/ }),
- /* 148 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * @module helpers
- */
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- *
- * @memberof helpers
- * @type {number}
- */
- exports.earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- *
- * @memberof helpers
- * @type {Object}
- */
- exports.factors = {
- centimeters: exports.earthRadius * 100,
- centimetres: exports.earthRadius * 100,
- degrees: exports.earthRadius / 111325,
- feet: exports.earthRadius * 3.28084,
- inches: exports.earthRadius * 39.370,
- kilometers: exports.earthRadius / 1000,
- kilometres: exports.earthRadius / 1000,
- meters: exports.earthRadius,
- metres: exports.earthRadius,
- miles: exports.earthRadius / 1609.344,
- millimeters: exports.earthRadius * 1000,
- millimetres: exports.earthRadius * 1000,
- nauticalmiles: exports.earthRadius / 1852,
- radians: 1,
- yards: exports.earthRadius / 1.0936,
- };
- /**
- * Units of measurement factors based on 1 meter.
- *
- * @memberof helpers
- * @type {Object}
- */
- exports.unitsFactors = {
- centimeters: 100,
- centimetres: 100,
- degrees: 1 / 111325,
- feet: 3.28084,
- inches: 39.370,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- meters: 1,
- metres: 1,
- miles: 1 / 1609.344,
- millimeters: 1000,
- millimetres: 1000,
- nauticalmiles: 1 / 1852,
- radians: 1 / exports.earthRadius,
- yards: 1 / 1.0936,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- *
- * @memberof helpers
- * @type {Object}
- */
- exports.areaFactors = {
- acres: 0.000247105,
- centimeters: 10000,
- centimetres: 10000,
- feet: 10.763910417,
- inches: 1550.003100006,
- kilometers: 0.000001,
- kilometres: 0.000001,
- meters: 1,
- metres: 1,
- miles: 3.86e-7,
- millimeters: 1000000,
- millimetres: 1000000,
- yards: 1.195990046,
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function feature(geom, properties, options) {
- if (options === void 0) { options = {}; }
- var feat = { type: "Feature" };
- if (options.id === 0 || options.id) {
- feat.id = options.id;
- }
- if (options.bbox) {
- feat.bbox = options.bbox;
- }
- feat.properties = properties || {};
- feat.geometry = geom;
- return feat;
- }
- exports.feature = feature;
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<any>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = "Point";
- * var coordinates = [110, 50];
- * var geometry = turf.geometry(type, coordinates);
- * // => geometry
- */
- function geometry(type, coordinates, options) {
- if (options === void 0) { options = {}; }
- switch (type) {
- case "Point": return point(coordinates).geometry;
- case "LineString": return lineString(coordinates).geometry;
- case "Polygon": return polygon(coordinates).geometry;
- case "MultiPoint": return multiPoint(coordinates).geometry;
- case "MultiLineString": return multiLineString(coordinates).geometry;
- case "MultiPolygon": return multiPolygon(coordinates).geometry;
- default: throw new Error(type + " is invalid");
- }
- }
- exports.geometry = geometry;
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function point(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- var geom = {
- type: "Point",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.point = point;
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
- * associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function points(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- return featureCollection(coordinates.map(function (coords) {
- return point(coords, properties);
- }), options);
- }
- exports.points = points;
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function polygon(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
- var ring = coordinates_1[_i];
- if (ring.length < 4) {
- throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error("First and last Position are not equivalent.");
- }
- }
- }
- var geom = {
- type: "Polygon",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.polygon = polygon;
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function polygons(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- return featureCollection(coordinates.map(function (coords) {
- return polygon(coords, properties);
- }), options);
- }
- exports.polygons = polygons;
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function lineString(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- if (coordinates.length < 2) {
- throw new Error("coordinates must be an array of two or more positions");
- }
- var geom = {
- type: "LineString",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.lineString = lineString;
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
- * associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function lineStrings(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- return featureCollection(coordinates.map(function (coords) {
- return lineString(coords, properties);
- }), options);
- }
- exports.lineStrings = lineStrings;
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function featureCollection(features, options) {
- if (options === void 0) { options = {}; }
- var fc = { type: "FeatureCollection" };
- if (options.id) {
- fc.id = options.id;
- }
- if (options.bbox) {
- fc.bbox = options.bbox;
- }
- fc.features = features;
- return fc;
- }
- exports.featureCollection = featureCollection;
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function multiLineString(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- var geom = {
- type: "MultiLineString",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.multiLineString = multiLineString;
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function multiPoint(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- var geom = {
- type: "MultiPoint",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.multiPoint = multiPoint;
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function multiPolygon(coordinates, properties, options) {
- if (options === void 0) { options = {}; }
- var geom = {
- type: "MultiPolygon",
- coordinates: coordinates,
- };
- return feature(geom, properties, options);
- }
- exports.multiPolygon = multiPolygon;
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = turf.geometry("Point", [100, 0]);
- * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
- * var collection = turf.geometryCollection([pt, line]);
- *
- * // => collection
- */
- function geometryCollection(geometries, properties, options) {
- if (options === void 0) { options = {}; }
- var geom = {
- type: "GeometryCollection",
- geometries: geometries,
- };
- return feature(geom, properties, options);
- }
- exports.geometryCollection = geometryCollection;
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function round(num, precision) {
- if (precision === void 0) { precision = 0; }
- if (precision && !(precision >= 0)) {
- throw new Error("precision must be a positive number");
- }
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- exports.round = round;
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
- * meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function radiansToLength(radians, units) {
- if (units === void 0) { units = "kilometers"; }
- var factor = exports.factors[units];
- if (!factor) {
- throw new Error(units + " units is invalid");
- }
- return radians * factor;
- }
- exports.radiansToLength = radiansToLength;
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
- * meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function lengthToRadians(distance, units) {
- if (units === void 0) { units = "kilometers"; }
- var factor = exports.factors[units];
- if (!factor) {
- throw new Error(units + " units is invalid");
- }
- return distance / factor;
- }
- exports.lengthToRadians = lengthToRadians;
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
- * meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function lengthToDegrees(distance, units) {
- return radiansToDegrees(lengthToRadians(distance, units));
- }
- exports.lengthToDegrees = lengthToDegrees;
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function bearingToAzimuth(bearing) {
- var angle = bearing % 360;
- if (angle < 0) {
- angle += 360;
- }
- return angle;
- }
- exports.bearingToAzimuth = bearingToAzimuth;
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function radiansToDegrees(radians) {
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- exports.radiansToDegrees = radiansToDegrees;
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function degreesToRadians(degrees) {
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- exports.degreesToRadians = degreesToRadians;
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {Units} [originalUnit="kilometers"] of the length
- * @param {Units} [finalUnit="kilometers"] returned unit
- * @returns {number} the converted length
- */
- function convertLength(length, originalUnit, finalUnit) {
- if (originalUnit === void 0) { originalUnit = "kilometers"; }
- if (finalUnit === void 0) { finalUnit = "kilometers"; }
- if (!(length >= 0)) {
- throw new Error("length must be a positive number");
- }
- return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
- }
- exports.convertLength = convertLength;
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {Units} [originalUnit="meters"] of the distance
- * @param {Units} [finalUnit="kilometers"] returned unit
- * @returns {number} the converted distance
- */
- function convertArea(area, originalUnit, finalUnit) {
- if (originalUnit === void 0) { originalUnit = "meters"; }
- if (finalUnit === void 0) { finalUnit = "kilometers"; }
- if (!(area >= 0)) {
- throw new Error("area must be a positive number");
- }
- var startFactor = exports.areaFactors[originalUnit];
- if (!startFactor) {
- throw new Error("invalid original units");
- }
- var finalFactor = exports.areaFactors[finalUnit];
- if (!finalFactor) {
- throw new Error("invalid final units");
- }
- return (area / startFactor) * finalFactor;
- }
- exports.convertArea = convertArea;
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
- }
- exports.isNumber = isNumber;
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- exports.isObject = isObject;
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function validateBBox(bbox) {
- if (!bbox) {
- throw new Error("bbox is required");
- }
- if (!Array.isArray(bbox)) {
- throw new Error("bbox must be an Array");
- }
- if (bbox.length !== 4 && bbox.length !== 6) {
- throw new Error("bbox must be an Array of 4 or 6 numbers");
- }
- bbox.forEach(function (num) {
- if (!isNumber(num)) {
- throw new Error("bbox must only contain numbers");
- }
- });
- }
- exports.validateBBox = validateBBox;
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function validateId(id) {
- if (!id) {
- throw new Error("id is required");
- }
- if (["string", "number"].indexOf(typeof id) === -1) {
- throw new Error("id must be a number or a string");
- }
- }
- exports.validateId = validateId;
- // Deprecated methods
- function radians2degrees() {
- throw new Error("method has been renamed to `radiansToDegrees`");
- }
- exports.radians2degrees = radians2degrees;
- function degrees2radians() {
- throw new Error("method has been renamed to `degreesToRadians`");
- }
- exports.degrees2radians = degrees2radians;
- function distanceToDegrees() {
- throw new Error("method has been renamed to `lengthToDegrees`");
- }
- exports.distanceToDegrees = distanceToDegrees;
- function distanceToRadians() {
- throw new Error("method has been renamed to `lengthToRadians`");
- }
- exports.distanceToRadians = distanceToRadians;
- function radiansToDistance() {
- throw new Error("method has been renamed to `radiansToLength`");
- }
- exports.radiansToDistance = radiansToDistance;
- function bearingToAngle() {
- throw new Error("method has been renamed to `bearingToAzimuth`");
- }
- exports.bearingToAngle = bearingToAngle;
- function convertDistance() {
- throw new Error("method has been renamed to `convertLength`");
- }
- exports.convertDistance = convertDistance;
- /***/ }),
- /* 149 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _Marker2=_interopRequireDefault(__webpack_require__(17));var BreathingApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(BreathingApertureMarker,_Marker);var _super=(0,_createSuper2.default)(BreathingApertureMarker);function BreathingApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,BreathingApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(BreathingApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var pulse=document.getElementsByClassName('sm-component-animate-marker__pulse');for(var i=0;i<pulse.length;i++){// @ts-ignore
- this._setBreathingApertureWidth(pulse[i].style);}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var dot=document.getElementsByClassName('sm-component-animate-marker__dot-point');for(var i=0;i<dot.length;i++){// @ts-ignore
- dot[i].style.background=this.options.colors[0];}var pulse=document.getElementsByClassName('sm-component-animate-marker__pulse');for(var _i=0;_i<pulse.length;_i++){// @ts-ignore
- var style=pulse[_i].style;style.borderColor=this.options.colors[0];style.boxShadow="0 0 12px ".concat(this.options.colors[1],", 0 0 20px ").concat(this.options.colors[1]," inset");}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--breathing-aperture';var dot=document.createElement('span');dot.className='sm-component-animate-marker__dot-point';var colors;if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){colors=_this2.options.colors;}colors&&(dot.style.background=colors[0]);markerContainer.appendChild(dot);var childElements=_this2._createMakerElement(3,'span',['sm-component-animate-marker__delay','sm-component-animate-marker__pulse']);childElements.forEach(function(element){if(colors){element.style.borderColor=colors[0];element.style.boxShadow="0 0 12px ".concat(colors[1],", 0 0 20px ").concat(colors[1]," inset");}_this2._setBreathingApertureWidth(element.style);markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'breathing-aperture-name');markerContainer.appendChild(nameContainer);_this2.markersElement.push(markerContainer);},this);}},{key:"_setBreathingApertureWidth",value:function _setBreathingApertureWidth(style){var width=this.options.width;if(width){style.width=width+'px';style.height=width+'px';style.top=-width/2+'px';style.left=-width/2+'px';style.borderRadius=width/2+'px';}}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}}]);return BreathingApertureMarker;}(_Marker2.default);exports.default=BreathingApertureMarker;
- /***/ }),
- /* 150 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _Marker2=_interopRequireDefault(__webpack_require__(17));var DiffusedApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(DiffusedApertureMarker,_Marker);var _super=(0,_createSuper2.default)(DiffusedApertureMarker);function DiffusedApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,DiffusedApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(DiffusedApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--diffused-aperture');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- var style=markerContainer[i].style;style.setProperty('--container-width',width+'px');}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--diffused-aperture');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- var style=markerContainer[i].style;style.setProperty('--background-color',this.options.colors[0]);style.setProperty('--box-shadow-color',this.options.colors[1]||this.options.colors[0]);}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--diffused-aperture';var wrapper=document.createElement('div');wrapper.className='sm-component-animate-marker__diffused-aperture-wrapper';var bg=document.createElement('div');bg.className='sm-component-animate-marker__bg';wrapper.appendChild(bg);var circle=document.createElement('div');circle.className='sm-component-animate-marker__circle';wrapper.appendChild(circle);markerContainer.appendChild(wrapper);var nameContainer=_this2._getTextContainer(point,'diffused-aperture-name');markerContainer.appendChild(nameContainer);_this2.options.width&&markerContainer.style.setProperty('--container-width',_this2.options.width+'px');if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--background-color',_this2.options.colors[0]);markerContainer.style.setProperty('--box-shadow-color',_this2.options.colors[1]||_this2.options.colors[0]);}_this2.markersElement.push(markerContainer);},this);}}]);return DiffusedApertureMarker;}(_Marker2.default);exports.default=DiffusedApertureMarker;
- /***/ }),
- /* 151 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _colorcolor=_interopRequireDefault(__webpack_require__(41));var _Marker2=_interopRequireDefault(__webpack_require__(17));var HaloRingMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(HaloRingMarker,_Marker);var _super=(0,_createSuper2.default)(HaloRingMarker);function HaloRingMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,HaloRingMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(HaloRingMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--halo-ring');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- var style=markerContainer[i].style;style.setProperty('--halo-width',this.options.width+'px');style.setProperty('--halo-left',-this.options.width/2+'px');style.setProperty('--box-shadow-width-1',this.options.width/10+'px');style.setProperty('--box-shadow-width-2',this.options.width/4+'px');}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--halo-ring');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- var style=markerContainer[i].style;style.setProperty('--color-1',this._getColorWithOpacity(this.options.colors[0],0.3));style.setProperty('--color-1-transparent',this._getColorWithOpacity(this.options.colors[0],0.1));style.setProperty('--color-2',this._getColorWithOpacity(this.options.colors[1],0.3));style.setProperty('--color-2-transparent',this._getColorWithOpacity(this.options.colors[1],0.1));}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--halo-ring';var childElements=_this2._createMakerElement(8,'div',['sm-component-animate-marker__ring','sm-component-animate-marker__halo']);childElements.forEach(function(element){markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'halo-ring-name');markerContainer.appendChild(nameContainer);if(_this2.options.width){markerContainer.style.setProperty('--halo-width',_this2.options.width+'px');markerContainer.style.setProperty('--halo-left',-_this2.options.width/2+'px');markerContainer.style.setProperty('--box-shadow-width-1',_this2.options.width/10+'px');markerContainer.style.setProperty('--box-shadow-width-2',_this2.options.width/4+'px');}if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--color-1',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[0],'rgba',true),0.3));markerContainer.style.setProperty('--color-1-transparent',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[0],'rgba',true),0.1));markerContainer.style.setProperty('--color-2',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[1],'rgba',true),0.3));markerContainer.style.setProperty('--color-2-transparent',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[1],'rgba',true),0.1));}_this2.markersElement.push(markerContainer);},this);}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}}]);return HaloRingMarker;}(_Marker2.default);exports.default=HaloRingMarker;
- /***/ }),
- /* 152 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _Marker2=_interopRequireDefault(__webpack_require__(17));var RotatingApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(RotatingApertureMarker,_Marker);var _super=(0,_createSuper2.default)(RotatingApertureMarker);function RotatingApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,RotatingApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(RotatingApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;// TODO 待抛出 width 不能小于 40
- if(!this.options.width||this.options.width<40){return;}var dotsMarker=document.getElementsByClassName('sm-component-animate-marker--rotating-aperture');for(var i=0;i<dotsMarker.length;i++){// @ts-ignore
- dotsMarker[i].style.setProperty('--container-width',"".concat(this.options.width,"px"));var dots1=dotsMarker[i].children[0];var dots2=dotsMarker[i].children[1];var dots3=dotsMarker[i].children[2];dots1.setAttribute('style',this._getDotsStyleObj(this.options.width-32));dots2.setAttribute('style',this._getDotsStyleObj(this.options.width-16));dots3.setAttribute('style',this._getDotsStyleObj(this.options.width));}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var dotsMarker=document.getElementsByClassName('sm-component-animate-marker--rotating-aperture');for(var i=0;i<dotsMarker.length;i++){// @ts-ignore
- var style=dotsMarker[i].style;style.setProperty('--light-color',this.options.colors[1]);style.setProperty('--color',this.options.colors[0]);style.setProperty('--line-color',this._getColorWithOpacity(this.options.colors[0],0.2));}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var width=_this2.options.width&&_this2.options.width>=40?_this2.options.width:50;var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--rotating-aperture';var childElements=_this2._createMakerElement(3,'div',['sm-component-animate-marker__dots','sm-component-animate-marker__dots']);childElements.forEach(function(element,index){var elementWidth;index===0&&(elementWidth=width-32);index===1&&(elementWidth=width-16);index===2&&(elementWidth=width);element.setAttribute('style',_this2._getDotsStyleObj(elementWidth));markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'rotating-aperture-name');markerContainer.appendChild(nameContainer);if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0&&_this2.options.colors[0].indexOf('rgb')>-1){markerContainer.style.setProperty('--color',_this2.options.colors[0]);markerContainer.style.setProperty('--line-color',_this2._getColorWithOpacity(_this2.options.colors[0],0.2));markerContainer.style.setProperty('--light-color',_this2.options.colors[1]);}markerContainer.style.setProperty('--container-width',width+'px');_this2.markersElement.push(markerContainer);},this);}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}},{key:"_getDotsStyleObj",value:function _getDotsStyleObj(width){return"--dots-width: ".concat(width,"px;\n --dots-height: ").concat(width,"px;\n --dots-box-shadow-x: ").concat(width/2+6,"px;\n --dots-box-shadow-x-negative: -").concat(width/2+6,"px;\n --dots-box-shadow-radius1: ").concat(width/2-2,"px;\n --dots-box-shadow-radius1-negative: -").concat(width/2-2,"px;\n --dots-box-shadow-radius2: ").concat(width/2-3,"px;\n --dots-box-shadow-radius2-negative: -").concat(width/2-3,"px;");}}]);return RotatingApertureMarker;}(_Marker2.default);exports.default=RotatingApertureMarker;
- /***/ }),
- /* 153 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _Marker2=_interopRequireDefault(__webpack_require__(17));var RotatingTextBorderMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(RotatingTextBorderMarker,_Marker);var _super=(0,_createSuper2.default)(RotatingTextBorderMarker);function RotatingTextBorderMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,RotatingTextBorderMarker);_this=_super.call(this,features);_this.options=void 0;_this.options=options;_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(RotatingTextBorderMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;this._setMarkerContainerProperty({'--clip-width-1':width+width/10+'px','--clip-width-2':width+width/10-2+'px','--boder-width':width+'px','--text-left-position':-width/2+'px'});}},{key:"setMarkersHeight",value:function setMarkersHeight(height){this.options.height=height;this._setMarkerContainerProperty({'--clip-height-1':height+height/10+'px','--clip-height-2':height+height/10-2+'px','--boder-height':height+'px'});}},{key:"setMarkersTextField",value:function setMarkersTextField(textField){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.options.textField=textField;var name=document.getElementsByClassName('sm-component-animate-marker__text');for(var i=0;i<name.length;i++){var properties=this.features.features[i]&&this.features.features[i].properties;if(properties&&properties[textField]){name[i].innerHTML=properties[textField];}else{name[i].innerHTML='';}}}},{key:"setMarkersTextColor",value:function setMarkersTextColor(textColor){this.options.textColor=textColor;this._setMarkerContainerProperty({'--text-color':textColor});}},{key:"setMarkersTextFontSize",value:function setMarkersTextFontSize(textFontSize){this.options.textFontSize=textFontSize;this._setMarkerContainerProperty({'--text-font-size':textFontSize+'px'});}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){this._setMarkerContainerProperty({'--border-color':colors[0],'--box-shadow-color':colors[1]});}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--text-boder';var border=document.createElement('div');border.className='sm-component-animate-marker__boder';var keys=Object.keys(point.properties);var name;if(point.properties||Object.keys(point.properties).length!==0){name=point.properties[_this2.options.textField]||point.properties[keys[0]];}var span=document.createElement('span');span.className='sm-component-animate-marker__text';span.innerHTML=name||'';border.appendChild(span);if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--border-color',_this2.options.colors[0]);markerContainer.style.setProperty('--box-shadow-color',_this2.options.colors[1]);}_this2.options.textColor&&markerContainer.style.setProperty('--text-color',_this2.options.textColor);_this2.options.textFontSize&&markerContainer.style.setProperty('--text-font-size',_this2.options.textFontSize+'px');if(_this2.options.width){markerContainer.style.setProperty('--clip-width-1',_this2.options.width+_this2.options.width/10+'px');markerContainer.style.setProperty('--clip-width-2',_this2.options.width+_this2.options.width/10-2+'px');markerContainer.style.setProperty('--boder-width',_this2.options.width+'px');markerContainer.style.setProperty('--text-left-position',-_this2.options.width/2+'px');}if(_this2.options.height){markerContainer.style.setProperty('--clip-height-1',_this2.options.height+_this2.options.width/10+'px');markerContainer.style.setProperty('--clip-height-2',_this2.options.height+_this2.options.width/10-2+'px');markerContainer.style.setProperty('--boder-height',_this2.options.height+'px');}if((_this2.options.width||100)>(_this2.options.width||200)){markerContainer.style.setProperty('--animation-name','clipMe2');}else{markerContainer.style.setProperty('--animation-name','clipMe1');}markerContainer.appendChild(border);_this2.markersElement.push(markerContainer);},this);}},{key:"_setMarkerContainerProperty",value:function _setMarkerContainerProperty(properties){var _this3=this;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--text-boder');var _loop=function _loop(i){// @ts-ignore
- var style=markerContainer[i].style;Object.keys(properties).forEach(function(key){style.setProperty(key,properties[key]);});if((_this3.options.height||100)>(_this3.options.width||200)){style.setProperty('--animation-name','clipMe2');}else{style.setProperty('--animation-name','clipMe1');}};for(var i=0;i<markerContainer.length;i++){_loop(i);}}}]);return RotatingTextBorderMarker;}(_Marker2.default);exports.default=RotatingTextBorderMarker;
- /***/ }),
- /* 154 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var _interopRequireDefault=__webpack_require__(0);Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(1));var _createClass2=_interopRequireDefault(__webpack_require__(2));var _inherits2=_interopRequireDefault(__webpack_require__(4));var _createSuper2=_interopRequireDefault(__webpack_require__(3));var _Marker2=_interopRequireDefault(__webpack_require__(17));var FluorescenceMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(FluorescenceMarker,_Marker);var _super=(0,_createSuper2.default)(FluorescenceMarker);function FluorescenceMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,FluorescenceMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(FluorescenceMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--fluorescence');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- this._setFluorescenceWidth(markerContainer[i].style);}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--fluorescence');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
- this._setFluorescenceColor(markerContainer[i].style);}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--fluorescence';var marker=document.createElement('div');marker.className='sm-component-animate-marker__fluorescence';markerContainer.appendChild(marker);var nameContainer=_this2._getTextContainer(point,'fluorescence-name');markerContainer.appendChild(nameContainer);_this2._setFluorescenceWidth(markerContainer.style);_this2._setFluorescenceColor(markerContainer.style);_this2.markersElement.push(markerContainer);});}},{key:"_setFluorescenceWidth",value:function _setFluorescenceWidth(style){if(this.options.width){style.setProperty('--container-width',this.options.width/3+'px');style.setProperty('--box-shadow-width',this.options.width+'px');}}},{key:"_setFluorescenceColor",value:function _setFluorescenceColor(style){if(this.options.colors&&this.options.colors.length>0){style.setProperty('--box-shadow-color',this.options.colors[0]);style.setProperty('--light-color',this.options.colors[1]);}}}]);return FluorescenceMarker;}(_Marker2.default);exports.default=FluorescenceMarker;
- /***/ }),
- /* 155 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/@turf/clone/main.es.js
- /**
- * Returns a cloned copy of the passed GeoJSON Object, including possible 'Foreign Members'.
- * ~3-5x faster than the common JSON.parse + JSON.stringify combo method.
- *
- * @name clone
- * @param {GeoJSON} geojson GeoJSON Object
- * @returns {GeoJSON} cloned GeoJSON Object
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]], {color: 'red'});
- *
- * var lineCloned = turf.clone(line);
- */
- function clone(geojson) {
- if (!geojson) throw new Error('geojson is required');
- switch (geojson.type) {
- case 'Feature':
- return cloneFeature(geojson);
- case 'FeatureCollection':
- return cloneFeatureCollection(geojson);
- case 'Point':
- case 'LineString':
- case 'Polygon':
- case 'MultiPoint':
- case 'MultiLineString':
- case 'MultiPolygon':
- case 'GeometryCollection':
- return cloneGeometry(geojson);
- default:
- throw new Error('unknown GeoJSON type');
- }
- }
- /**
- * Clone Feature
- *
- * @private
- * @param {Feature<any>} geojson GeoJSON Feature
- * @returns {Feature<any>} cloned Feature
- */
- function cloneFeature(geojson) {
- var cloned = {type: 'Feature'};
- // Preserve Foreign Members
- Object.keys(geojson).forEach(function (key) {
- switch (key) {
- case 'type':
- case 'properties':
- case 'geometry':
- return;
- default:
- cloned[key] = geojson[key];
- }
- });
- // Add properties & geometry last
- cloned.properties = cloneProperties(geojson.properties);
- cloned.geometry = cloneGeometry(geojson.geometry);
- return cloned;
- }
- /**
- * Clone Properties
- *
- * @private
- * @param {Object} properties GeoJSON Properties
- * @returns {Object} cloned Properties
- */
- function cloneProperties(properties) {
- var cloned = {};
- if (!properties) return cloned;
- Object.keys(properties).forEach(function (key) {
- var value = properties[key];
- if (typeof value === 'object') {
- if (value === null) {
- // handle null
- cloned[key] = null;
- } else if (value.length) {
- // handle Array
- cloned[key] = value.map(function (item) {
- return item;
- });
- } else {
- // handle generic Object
- cloned[key] = cloneProperties(value);
- }
- } else cloned[key] = value;
- });
- return cloned;
- }
- /**
- * Clone Feature Collection
- *
- * @private
- * @param {FeatureCollection<any>} geojson GeoJSON Feature Collection
- * @returns {FeatureCollection<any>} cloned Feature Collection
- */
- function cloneFeatureCollection(geojson) {
- var cloned = {type: 'FeatureCollection'};
- // Preserve Foreign Members
- Object.keys(geojson).forEach(function (key) {
- switch (key) {
- case 'type':
- case 'features':
- return;
- default:
- cloned[key] = geojson[key];
- }
- });
- // Add features
- cloned.features = geojson.features.map(function (feature) {
- return cloneFeature(feature);
- });
- return cloned;
- }
- /**
- * Clone Geometry
- *
- * @private
- * @param {Geometry<any>} geometry GeoJSON Geometry
- * @returns {Geometry<any>} cloned Geometry
- */
- function cloneGeometry(geometry) {
- var geom = {type: geometry.type};
- if (geometry.bbox) geom.bbox = geometry.bbox;
- if (geometry.type === 'GeometryCollection') {
- geom.geometries = geometry.geometries.map(function (geom) {
- return cloneGeometry(geom);
- });
- return geom;
- }
- geom.coordinates = deepSlice(geometry.coordinates);
- return geom;
- }
- /**
- * Deep Slice coordinates
- *
- * @private
- * @param {Coordinates} coords Coordinates
- * @returns {Coordinates} all coordinates sliced
- */
- function deepSlice(coords) {
- if (typeof coords[0] !== 'object') { return coords.slice(); }
- return coords.map(function (coord) {
- return deepSlice(coord);
- });
- }
- /* harmony default export */ var main_es = (clone);
- // CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var factors = {
- meters: earthRadius,
- metres: earthRadius,
- millimeters: earthRadius * 1000,
- millimetres: earthRadius * 1000,
- centimeters: earthRadius * 100,
- centimetres: earthRadius * 100,
- kilometers: earthRadius / 1000,
- kilometres: earthRadius / 1000,
- miles: earthRadius / 1609.344,
- nauticalmiles: earthRadius / 1852,
- inches: earthRadius * 39.370,
- yards: earthRadius / 1.0936,
- feet: earthRadius * 3.28084,
- radians: 1,
- degrees: earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) validateBBox(bbox);
- if (id) validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = point(coordinates).geometry; break;
- case 'LineString': geom = lineString(coordinates).geometry; break;
- case 'Polygon': geom = polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !isNumber(ring[0][0]) || !isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!isNumber(coordinates[0][1]) || !isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) validateBBox(bbox);
- if (id) validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function lengthToDegrees(distance, units) {
- return radiansToDegrees(lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return radiansToLength(lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/meta/main.es.js
- /**
- * Callback for coordEach
- *
- * @callback coordEachCallback
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
- *
- * @name coordEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function coordEach(geojson, callback, excludeWrapCoord) {
- // Handles null Geometry -- Skips this GeoJSON
- if (geojson === null) return;
- var j, k, l, geometry, stopG, coords,
- geometryMaybeCollection,
- wrapShrink = 0,
- coordIndex = 0,
- isGeometryCollection,
- type = geojson.type,
- isFeatureCollection = type === 'FeatureCollection',
- isFeature = type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
- (isFeature ? geojson.geometry : geojson));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
- var multiFeatureIndex = 0;
- var geometryIndex = 0;
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
- // Handles null Geometry -- Skips this geometry
- if (geometry === null) continue;
- coords = geometry.coordinates;
- var geomType = geometry.type;
- wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
- switch (geomType) {
- case null:
- break;
- case 'Point':
- if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- multiFeatureIndex++;
- break;
- case 'LineString':
- case 'MultiPoint':
- for (j = 0; j < coords.length; j++) {
- if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- if (geomType === 'MultiPoint') multiFeatureIndex++;
- }
- if (geomType === 'LineString') multiFeatureIndex++;
- break;
- case 'Polygon':
- case 'MultiLineString':
- for (j = 0; j < coords.length; j++) {
- for (k = 0; k < coords[j].length - wrapShrink; k++) {
- if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- if (geomType === 'MultiLineString') multiFeatureIndex++;
- if (geomType === 'Polygon') geometryIndex++;
- }
- if (geomType === 'Polygon') multiFeatureIndex++;
- break;
- case 'MultiPolygon':
- for (j = 0; j < coords.length; j++) {
- if (geomType === 'MultiPolygon') geometryIndex = 0;
- for (k = 0; k < coords[j].length; k++) {
- for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
- if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- geometryIndex++;
- }
- multiFeatureIndex++;
- }
- break;
- case 'GeometryCollection':
- for (j = 0; j < geometry.geometries.length; j++)
- if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
- break;
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- }
- }
- /**
- * Callback for coordReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback coordReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
- *
- * @name coordReduce
- * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentCoord;
- * });
- */
- function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
- var previousValue = initialValue;
- coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
- else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
- }, excludeWrapCoord);
- return previousValue;
- }
- /**
- * Callback for propEach
- *
- * @callback propEachCallback
- * @param {Object} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over properties in any GeoJSON object, similar to Array.forEach()
- *
- * @name propEach
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentProperties, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propEach(features, function (currentProperties, featureIndex) {
- * //=currentProperties
- * //=featureIndex
- * });
- */
- function propEach(geojson, callback) {
- var i;
- switch (geojson.type) {
- case 'FeatureCollection':
- for (i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i].properties, i) === false) break;
- }
- break;
- case 'Feature':
- callback(geojson.properties, 0);
- break;
- }
- }
- /**
- * Callback for propReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback propReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {*} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce properties in any GeoJSON object into a single value,
- * similar to how Array.reduce works. However, in this case we lazily run
- * the reduction, so an array of all properties is unnecessary.
- *
- * @name propReduce
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
- * //=previousValue
- * //=currentProperties
- * //=featureIndex
- * return currentProperties
- * });
- */
- function propReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- propEach(geojson, function (currentProperties, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
- else previousValue = callback(previousValue, currentProperties, featureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for featureEach
- *
- * @callback featureEachCallback
- * @param {Feature<any>} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name featureEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.featureEach(features, function (currentFeature, featureIndex) {
- * //=currentFeature
- * //=featureIndex
- * });
- */
- function featureEach(geojson, callback) {
- if (geojson.type === 'Feature') {
- callback(geojson, 0);
- } else if (geojson.type === 'FeatureCollection') {
- for (var i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i], i) === false) break;
- }
- }
- }
- /**
- * Callback for featureReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback featureReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name featureReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * return currentFeature
- * });
- */
- function featureReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- featureEach(geojson, function (currentFeature, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex);
- });
- return previousValue;
- }
- /**
- * Get all coordinates from any GeoJSON object.
- *
- * @name coordAll
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @returns {Array<Array<number>>} coordinate position array
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * var coords = turf.coordAll(features);
- * //= [[26, 37], [36, 53]]
- */
- function coordAll(geojson) {
- var coords = [];
- coordEach(geojson, function (coord) {
- coords.push(coord);
- });
- return coords;
- }
- /**
- * Callback for geomEach
- *
- * @callback geomEachCallback
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
- *
- * @name geomEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * });
- */
- function geomEach(geojson, callback) {
- var i, j, g, geometry, stopG,
- geometryMaybeCollection,
- isGeometryCollection,
- featureProperties,
- featureBBox,
- featureId,
- featureIndex = 0,
- isFeatureCollection = geojson.type === 'FeatureCollection',
- isFeature = geojson.type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (i = 0; i < stop; i++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
- (isFeature ? geojson.geometry : geojson));
- featureProperties = (isFeatureCollection ? geojson.features[i].properties :
- (isFeature ? geojson.properties : {}));
- featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
- (isFeature ? geojson.bbox : undefined));
- featureId = (isFeatureCollection ? geojson.features[i].id :
- (isFeature ? geojson.id : undefined));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (g = 0; g < stopG; g++) {
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
- // Handle null Geometry
- if (geometry === null) {
- if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- continue;
- }
- switch (geometry.type) {
- case 'Point':
- case 'LineString':
- case 'MultiPoint':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon': {
- if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- break;
- }
- case 'GeometryCollection': {
- for (j = 0; j < geometry.geometries.length; j++) {
- if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- }
- break;
- }
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- // Only increase `featureIndex` per each feature
- featureIndex++;
- }
- }
- /**
- * Callback for geomReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback geomReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Reduce geometry in any GeoJSON object, similar to Array.reduce().
- *
- * @name geomReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=previousValue
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * return currentGeometry
- * });
- */
- function geomReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
- else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
- });
- return previousValue;
- }
- /**
- * Callback for flattenEach
- *
- * @callback flattenEachCallback
- * @param {Feature} currentFeature The current flattened feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Iterate over flattened features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name flattenEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * });
- */
- function flattenEach(geojson, callback) {
- geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
- // Callback for single geometry
- var type = (geometry === null) ? null : geometry.type;
- switch (type) {
- case null:
- case 'Point':
- case 'LineString':
- case 'Polygon':
- if (callback(main_es_feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
- return;
- }
- var geomType;
- // Callback for multi-geometry
- switch (type) {
- case 'MultiPoint':
- geomType = 'Point';
- break;
- case 'MultiLineString':
- geomType = 'LineString';
- break;
- case 'MultiPolygon':
- geomType = 'Polygon';
- break;
- }
- for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
- var coordinate = geometry.coordinates[multiFeatureIndex];
- var geom = {
- type: geomType,
- coordinates: coordinate
- };
- if (callback(main_es_feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
- }
- });
- }
- /**
- * Callback for flattenReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback flattenReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
- *
- * @name flattenReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * return currentFeature
- * });
- */
- function flattenReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
- if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for segmentEach
- *
- * @callback segmentEachCallback
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- * @returns {void}
- */
- /**
- * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //=currentSegment
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * //=segmentIndex
- * });
- *
- * // Calculate the total number of segments
- * var total = 0;
- * turf.segmentEach(polygon, function () {
- * total++;
- * });
- */
- function segmentEach(geojson, callback) {
- flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- var segmentIndex = 0;
- // Exclude null Geometries
- if (!feature$$1.geometry) return;
- // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- var type = feature$$1.geometry.type;
- if (type === 'Point' || type === 'MultiPoint') return;
- // Generate 2-vertex line segments
- var previousCoords;
- if (coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
- // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
- if (previousCoords === undefined) {
- previousCoords = currentCoord;
- return;
- }
- var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
- if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
- segmentIndex++;
- previousCoords = currentCoord;
- }) === false) return false;
- });
- }
- /**
- * Callback for segmentReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback segmentReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- */
- /**
- * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //= previousSegment
- * //= currentSegment
- * //= featureIndex
- * //= multiFeatureIndex
- * //= geometryIndex
- * //= segmentInex
- * return currentSegment
- * });
- *
- * // Calculate the total number of segments
- * var initialValue = 0
- * var total = turf.segmentReduce(polygon, function (previousValue) {
- * previousValue++;
- * return previousValue;
- * }, initialValue);
- */
- function segmentReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- var started = false;
- segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- if (started === false && initialValue === undefined) previousValue = currentSegment;
- else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
- started = true;
- });
- return previousValue;
- }
- /**
- * Callback for lineEach
- *
- * @callback lineEachCallback
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
- * similar to Array.forEach.
- *
- * @name lineEach
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @example
- * var multiLine = turf.multiLineString([
- * [[26, 37], [35, 45]],
- * [[36, 53], [38, 50], [41, 55]]
- * ]);
- *
- * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function lineEach(geojson, callback) {
- // validation
- if (!geojson) throw new Error('geojson is required');
- flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- if (feature$$1.geometry === null) return;
- var type = feature$$1.geometry.type;
- var coords = feature$$1.geometry.coordinates;
- switch (type) {
- case 'LineString':
- if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
- break;
- case 'Polygon':
- for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
- if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- }
- break;
- }
- });
- }
- /**
- * Callback for lineReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback lineReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name lineReduce
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var multiPoly = turf.multiPolygon([
- * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
- * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
- * ]);
- *
- * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentLine
- * });
- */
- function lineReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
- else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
- });
- return previousValue;
- }
- /**
- * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- * Point & MultiPoint will always return null.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.segmentIndex=0] Segment Index
- * @param {Object} [options.properties={}] Translate Properties to output LineString
- * @param {BBox} [options.bbox={}] Translate BBox to output LineString
- * @param {number|string} [options.id={}] Translate Id to output LineString
- * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findSegment(multiLine);
- * // => Feature<LineString<[[10, 10], [50, 30]]>>
- *
- * // First Segment of 2nd Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: 1});
- * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
- *
- * // Last Segment of Last Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
- * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
- */
- function findSegment(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var segmentIndex = options.segmentIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find SegmentIndex
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
- return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
- return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
- return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
- return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- /**
- * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.coordIndex=0] Coord Index
- * @param {Object} [options.properties={}] Translate Properties to output Point
- * @param {BBox} [options.bbox={}] Translate BBox to output Point
- * @param {number|string} [options.id={}] Translate Id to output Point
- * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findPoint(multiLine);
- * // => Feature<Point<[10, 10]>>
- *
- * // First Segment of the 2nd Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: 1});
- * // => Feature<Point<[-10, -10]>>
- *
- * // Last Segment of last Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
- * // => Feature<Point<[-30, -40]>>
- */
- function findPoint(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var coordIndex = options.coordIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find Coord Index
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- return point(coords, properties, options);
- case 'MultiPoint':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- return point(coords[multiFeatureIndex], properties, options);
- case 'LineString':
- if (coordIndex < 0) coordIndex = coords.length + coordIndex;
- return point(coords[coordIndex], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
- return point(coords[geometryIndex][coordIndex], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
- return point(coords[multiFeatureIndex][coordIndex], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
- return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/bbox/main.es.js
- /**
- * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
- *
- * @name bbox
- * @param {GeoJSON} geojson any GeoJSON object
- * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
- * var bbox = turf.bbox(line);
- * var bboxPolygon = turf.bboxPolygon(bbox);
- *
- * //addToMap
- * var addToMap = [line, bboxPolygon]
- */
- function main_es_bbox(geojson) {
- var BBox = [Infinity, Infinity, -Infinity, -Infinity];
- coordEach(geojson, function (coord) {
- if (BBox[0] > coord[0]) BBox[0] = coord[0];
- if (BBox[1] > coord[1]) BBox[1] = coord[1];
- if (BBox[2] < coord[0]) BBox[2] = coord[0];
- if (BBox[3] < coord[1]) BBox[3] = coord[1];
- });
- return BBox;
- }
- /* harmony default export */ var bbox_main_es = (main_es_bbox);
- // CONCATENATED MODULE: ./node_modules/@turf/center/main.es.js
- /**
- * Takes a {@link Feature} or {@link FeatureCollection} and returns the absolute center point of all features.
- *
- * @name center
- * @param {GeoJSON} geojson GeoJSON to be centered
- * @param {Object} [options={}] Optional parameters
- * @param {Object} [options.properties={}] an Object that is used as the {@link Feature}'s properties
- * @returns {Feature<Point>} a Point feature at the absolute center point of all input features
- * @example
- * var features = turf.featureCollection([
- * turf.point( [-97.522259, 35.4691]),
- * turf.point( [-97.502754, 35.463455]),
- * turf.point( [-97.508269, 35.463245])
- * ]);
- *
- * var center = turf.center(features);
- *
- * //addToMap
- * var addToMap = [features, center]
- * center.properties['marker-size'] = 'large';
- * center.properties['marker-color'] = '#000';
- */
- function center(geojson, options) {
- // Optional parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var properties = options.properties;
- // Input validation
- if (!geojson) throw new Error('geojson is required');
- var ext = bbox_main_es(geojson);
- var x = (ext[0] + ext[2]) / 2;
- var y = (ext[1] + ext[3]) / 2;
- return point([x, y], properties);
- }
- /* harmony default export */ var center_main_es = (center);
- // CONCATENATED MODULE: ./node_modules/@turf/centroid/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var main_es_factors = {
- meters: main_es_earthRadius,
- metres: main_es_earthRadius,
- millimeters: main_es_earthRadius * 1000,
- millimetres: main_es_earthRadius * 1000,
- centimeters: main_es_earthRadius * 100,
- centimetres: main_es_earthRadius * 100,
- kilometers: main_es_earthRadius / 1000,
- kilometres: main_es_earthRadius / 1000,
- miles: main_es_earthRadius / 1609.344,
- nauticalmiles: main_es_earthRadius / 1852,
- inches: main_es_earthRadius * 39.370,
- yards: main_es_earthRadius / 1.0936,
- feet: main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) main_es_validateBBox(bbox);
- if (id) main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = main_es_point(coordinates).geometry; break;
- case 'LineString': geom = main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!main_es_isNumber(coordinates[0]) || !main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !main_es_isNumber(ring[0][0]) || !main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!main_es_isNumber(coordinates[0][1]) || !main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) main_es_validateBBox(bbox);
- if (id) main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function main_es_lengthToDegrees(distance, units) {
- return main_es_radiansToDegrees(main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return main_es_radiansToLength(main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/centroid/node_modules/@turf/meta/main.es.js
- /**
- * Callback for coordEach
- *
- * @callback coordEachCallback
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
- *
- * @name coordEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function main_es_coordEach(geojson, callback, excludeWrapCoord) {
- // Handles null Geometry -- Skips this GeoJSON
- if (geojson === null) return;
- var j, k, l, geometry, stopG, coords,
- geometryMaybeCollection,
- wrapShrink = 0,
- coordIndex = 0,
- isGeometryCollection,
- type = geojson.type,
- isFeatureCollection = type === 'FeatureCollection',
- isFeature = type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
- (isFeature ? geojson.geometry : geojson));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
- var multiFeatureIndex = 0;
- var geometryIndex = 0;
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
- // Handles null Geometry -- Skips this geometry
- if (geometry === null) continue;
- coords = geometry.coordinates;
- var geomType = geometry.type;
- wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
- switch (geomType) {
- case null:
- break;
- case 'Point':
- if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- multiFeatureIndex++;
- break;
- case 'LineString':
- case 'MultiPoint':
- for (j = 0; j < coords.length; j++) {
- if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- if (geomType === 'MultiPoint') multiFeatureIndex++;
- }
- if (geomType === 'LineString') multiFeatureIndex++;
- break;
- case 'Polygon':
- case 'MultiLineString':
- for (j = 0; j < coords.length; j++) {
- for (k = 0; k < coords[j].length - wrapShrink; k++) {
- if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- if (geomType === 'MultiLineString') multiFeatureIndex++;
- if (geomType === 'Polygon') geometryIndex++;
- }
- if (geomType === 'Polygon') multiFeatureIndex++;
- break;
- case 'MultiPolygon':
- for (j = 0; j < coords.length; j++) {
- if (geomType === 'MultiPolygon') geometryIndex = 0;
- for (k = 0; k < coords[j].length; k++) {
- for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
- if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- geometryIndex++;
- }
- multiFeatureIndex++;
- }
- break;
- case 'GeometryCollection':
- for (j = 0; j < geometry.geometries.length; j++)
- if (main_es_coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
- break;
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- }
- }
- /**
- * Callback for coordReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback coordReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
- *
- * @name coordReduce
- * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentCoord;
- * });
- */
- function main_es_coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
- var previousValue = initialValue;
- main_es_coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
- else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
- }, excludeWrapCoord);
- return previousValue;
- }
- /**
- * Callback for propEach
- *
- * @callback propEachCallback
- * @param {Object} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over properties in any GeoJSON object, similar to Array.forEach()
- *
- * @name propEach
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentProperties, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propEach(features, function (currentProperties, featureIndex) {
- * //=currentProperties
- * //=featureIndex
- * });
- */
- function main_es_propEach(geojson, callback) {
- var i;
- switch (geojson.type) {
- case 'FeatureCollection':
- for (i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i].properties, i) === false) break;
- }
- break;
- case 'Feature':
- callback(geojson.properties, 0);
- break;
- }
- }
- /**
- * Callback for propReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback propReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {*} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce properties in any GeoJSON object into a single value,
- * similar to how Array.reduce works. However, in this case we lazily run
- * the reduction, so an array of all properties is unnecessary.
- *
- * @name propReduce
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
- * //=previousValue
- * //=currentProperties
- * //=featureIndex
- * return currentProperties
- * });
- */
- function main_es_propReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- main_es_propEach(geojson, function (currentProperties, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
- else previousValue = callback(previousValue, currentProperties, featureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for featureEach
- *
- * @callback featureEachCallback
- * @param {Feature<any>} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name featureEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.featureEach(features, function (currentFeature, featureIndex) {
- * //=currentFeature
- * //=featureIndex
- * });
- */
- function main_es_featureEach(geojson, callback) {
- if (geojson.type === 'Feature') {
- callback(geojson, 0);
- } else if (geojson.type === 'FeatureCollection') {
- for (var i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i], i) === false) break;
- }
- }
- }
- /**
- * Callback for featureReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback featureReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name featureReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * return currentFeature
- * });
- */
- function main_es_featureReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- main_es_featureEach(geojson, function (currentFeature, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex);
- });
- return previousValue;
- }
- /**
- * Get all coordinates from any GeoJSON object.
- *
- * @name coordAll
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @returns {Array<Array<number>>} coordinate position array
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * var coords = turf.coordAll(features);
- * //= [[26, 37], [36, 53]]
- */
- function main_es_coordAll(geojson) {
- var coords = [];
- main_es_coordEach(geojson, function (coord) {
- coords.push(coord);
- });
- return coords;
- }
- /**
- * Callback for geomEach
- *
- * @callback geomEachCallback
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
- *
- * @name geomEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * });
- */
- function main_es_geomEach(geojson, callback) {
- var i, j, g, geometry, stopG,
- geometryMaybeCollection,
- isGeometryCollection,
- featureProperties,
- featureBBox,
- featureId,
- featureIndex = 0,
- isFeatureCollection = geojson.type === 'FeatureCollection',
- isFeature = geojson.type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (i = 0; i < stop; i++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
- (isFeature ? geojson.geometry : geojson));
- featureProperties = (isFeatureCollection ? geojson.features[i].properties :
- (isFeature ? geojson.properties : {}));
- featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
- (isFeature ? geojson.bbox : undefined));
- featureId = (isFeatureCollection ? geojson.features[i].id :
- (isFeature ? geojson.id : undefined));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (g = 0; g < stopG; g++) {
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
- // Handle null Geometry
- if (geometry === null) {
- if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- continue;
- }
- switch (geometry.type) {
- case 'Point':
- case 'LineString':
- case 'MultiPoint':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon': {
- if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- break;
- }
- case 'GeometryCollection': {
- for (j = 0; j < geometry.geometries.length; j++) {
- if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- }
- break;
- }
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- // Only increase `featureIndex` per each feature
- featureIndex++;
- }
- }
- /**
- * Callback for geomReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback geomReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Reduce geometry in any GeoJSON object, similar to Array.reduce().
- *
- * @name geomReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=previousValue
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * return currentGeometry
- * });
- */
- function main_es_geomReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- main_es_geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
- else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
- });
- return previousValue;
- }
- /**
- * Callback for flattenEach
- *
- * @callback flattenEachCallback
- * @param {Feature} currentFeature The current flattened feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Iterate over flattened features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name flattenEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * });
- */
- function main_es_flattenEach(geojson, callback) {
- main_es_geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
- // Callback for single geometry
- var type = (geometry === null) ? null : geometry.type;
- switch (type) {
- case null:
- case 'Point':
- case 'LineString':
- case 'Polygon':
- if (callback(helpers_main_es_feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
- return;
- }
- var geomType;
- // Callback for multi-geometry
- switch (type) {
- case 'MultiPoint':
- geomType = 'Point';
- break;
- case 'MultiLineString':
- geomType = 'LineString';
- break;
- case 'MultiPolygon':
- geomType = 'Polygon';
- break;
- }
- for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
- var coordinate = geometry.coordinates[multiFeatureIndex];
- var geom = {
- type: geomType,
- coordinates: coordinate
- };
- if (callback(helpers_main_es_feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
- }
- });
- }
- /**
- * Callback for flattenReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback flattenReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
- *
- * @name flattenReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * return currentFeature
- * });
- */
- function main_es_flattenReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- main_es_flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
- if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for segmentEach
- *
- * @callback segmentEachCallback
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- * @returns {void}
- */
- /**
- * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //=currentSegment
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * //=segmentIndex
- * });
- *
- * // Calculate the total number of segments
- * var total = 0;
- * turf.segmentEach(polygon, function () {
- * total++;
- * });
- */
- function main_es_segmentEach(geojson, callback) {
- main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- var segmentIndex = 0;
- // Exclude null Geometries
- if (!feature$$1.geometry) return;
- // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- var type = feature$$1.geometry.type;
- if (type === 'Point' || type === 'MultiPoint') return;
- // Generate 2-vertex line segments
- var previousCoords;
- if (main_es_coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
- // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
- if (previousCoords === undefined) {
- previousCoords = currentCoord;
- return;
- }
- var currentSegment = main_es_lineString([previousCoords, currentCoord], feature$$1.properties);
- if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
- segmentIndex++;
- previousCoords = currentCoord;
- }) === false) return false;
- });
- }
- /**
- * Callback for segmentReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback segmentReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- */
- /**
- * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //= previousSegment
- * //= currentSegment
- * //= featureIndex
- * //= multiFeatureIndex
- * //= geometryIndex
- * //= segmentInex
- * return currentSegment
- * });
- *
- * // Calculate the total number of segments
- * var initialValue = 0
- * var total = turf.segmentReduce(polygon, function (previousValue) {
- * previousValue++;
- * return previousValue;
- * }, initialValue);
- */
- function main_es_segmentReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- var started = false;
- main_es_segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- if (started === false && initialValue === undefined) previousValue = currentSegment;
- else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
- started = true;
- });
- return previousValue;
- }
- /**
- * Callback for lineEach
- *
- * @callback lineEachCallback
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
- * similar to Array.forEach.
- *
- * @name lineEach
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @example
- * var multiLine = turf.multiLineString([
- * [[26, 37], [35, 45]],
- * [[36, 53], [38, 50], [41, 55]]
- * ]);
- *
- * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function main_es_lineEach(geojson, callback) {
- // validation
- if (!geojson) throw new Error('geojson is required');
- main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- if (feature$$1.geometry === null) return;
- var type = feature$$1.geometry.type;
- var coords = feature$$1.geometry.coordinates;
- switch (type) {
- case 'LineString':
- if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
- break;
- case 'Polygon':
- for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
- if (callback(main_es_lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- }
- break;
- }
- });
- }
- /**
- * Callback for lineReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback lineReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name lineReduce
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var multiPoly = turf.multiPolygon([
- * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
- * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
- * ]);
- *
- * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentLine
- * });
- */
- function main_es_lineReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- main_es_lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
- else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
- });
- return previousValue;
- }
- /**
- * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- * Point & MultiPoint will always return null.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.segmentIndex=0] Segment Index
- * @param {Object} [options.properties={}] Translate Properties to output LineString
- * @param {BBox} [options.bbox={}] Translate BBox to output LineString
- * @param {number|string} [options.id={}] Translate Id to output LineString
- * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findSegment(multiLine);
- * // => Feature<LineString<[[10, 10], [50, 30]]>>
- *
- * // First Segment of 2nd Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: 1});
- * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
- *
- * // Last Segment of Last Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
- * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
- */
- function main_es_findSegment(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var segmentIndex = options.segmentIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find SegmentIndex
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
- return main_es_lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
- return main_es_lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
- return main_es_lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
- return main_es_lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- /**
- * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.coordIndex=0] Coord Index
- * @param {Object} [options.properties={}] Translate Properties to output Point
- * @param {BBox} [options.bbox={}] Translate BBox to output Point
- * @param {number|string} [options.id={}] Translate Id to output Point
- * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findPoint(multiLine);
- * // => Feature<Point<[10, 10]>>
- *
- * // First Segment of the 2nd Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: 1});
- * // => Feature<Point<[-10, -10]>>
- *
- * // Last Segment of last Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
- * // => Feature<Point<[-30, -40]>>
- */
- function main_es_findPoint(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var coordIndex = options.coordIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find Coord Index
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- return main_es_point(coords, properties, options);
- case 'MultiPoint':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- return main_es_point(coords[multiFeatureIndex], properties, options);
- case 'LineString':
- if (coordIndex < 0) coordIndex = coords.length + coordIndex;
- return main_es_point(coords[coordIndex], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
- return main_es_point(coords[geometryIndex][coordIndex], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
- return main_es_point(coords[multiFeatureIndex][coordIndex], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
- return main_es_point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/centroid/main.es.js
- /**
- * Takes one or more features and calculates the centroid using the mean of all vertices.
- * This lessens the effect of small islands and artifacts when calculating the centroid of a set of polygons.
- *
- * @name centroid
- * @param {GeoJSON} geojson GeoJSON to be centered
- * @param {Object} [properties={}] an Object that is used as the {@link Feature}'s properties
- * @returns {Feature<Point>} the centroid of the input features
- * @example
- * var polygon = turf.polygon([[[-81, 41], [-88, 36], [-84, 31], [-80, 33], [-77, 39], [-81, 41]]]);
- *
- * var centroid = turf.centroid(polygon);
- *
- * //addToMap
- * var addToMap = [polygon, centroid]
- */
- function centroid(geojson, properties) {
- var xSum = 0;
- var ySum = 0;
- var len = 0;
- main_es_coordEach(geojson, function (coord) {
- xSum += coord[0];
- ySum += coord[1];
- len++;
- }, true);
- return main_es_point([xSum / len, ySum / len], properties);
- }
- /* harmony default export */ var centroid_main_es = (centroid);
- // CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var helpers_main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var helpers_main_es_factors = {
- meters: helpers_main_es_earthRadius,
- metres: helpers_main_es_earthRadius,
- millimeters: helpers_main_es_earthRadius * 1000,
- millimetres: helpers_main_es_earthRadius * 1000,
- centimeters: helpers_main_es_earthRadius * 100,
- centimetres: helpers_main_es_earthRadius * 100,
- kilometers: helpers_main_es_earthRadius / 1000,
- kilometres: helpers_main_es_earthRadius / 1000,
- miles: helpers_main_es_earthRadius / 1609.344,
- nauticalmiles: helpers_main_es_earthRadius / 1852,
- inches: helpers_main_es_earthRadius * 39.370,
- yards: helpers_main_es_earthRadius / 1.0936,
- feet: helpers_main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: helpers_main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var helpers_main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / helpers_main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var helpers_main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function _turf_helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) helpers_main_es_validateBBox(bbox);
- if (id) helpers_main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function _turf_helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) helpers_main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = helpers_main_es_point(coordinates).geometry; break;
- case 'LineString': geom = helpers_main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = helpers_main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = helpers_main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = helpers_main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = helpers_main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function helpers_main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!helpers_main_es_isNumber(coordinates[0]) || !helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return _turf_helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function helpers_main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return helpers_main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function helpers_main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !helpers_main_es_isNumber(ring[0][0]) || !helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return _turf_helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function helpers_main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return helpers_main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function helpers_main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!helpers_main_es_isNumber(coordinates[0][1]) || !helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return _turf_helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function helpers_main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return helpers_main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function helpers_main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) helpers_main_es_validateBBox(bbox);
- if (id) helpers_main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function helpers_main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return _turf_helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function helpers_main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return _turf_helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function helpers_main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return _turf_helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function helpers_main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return _turf_helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function helpers_main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function helpers_main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function helpers_main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function helpers_main_es_lengthToDegrees(distance, units) {
- return helpers_main_es_radiansToDegrees(helpers_main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function helpers_main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function helpers_main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function helpers_main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function helpers_main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return helpers_main_es_radiansToLength(helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function helpers_main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = helpers_main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = helpers_main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function helpers_main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function helpers_main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function helpers_main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function helpers_main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function helpers_main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function helpers_main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function helpers_main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function helpers_main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function helpers_main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function helpers_main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function helpers_main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/meta/main.es.js
- /**
- * Callback for coordEach
- *
- * @callback coordEachCallback
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
- *
- * @name coordEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function meta_main_es_coordEach(geojson, callback, excludeWrapCoord) {
- // Handles null Geometry -- Skips this GeoJSON
- if (geojson === null) return;
- var j, k, l, geometry, stopG, coords,
- geometryMaybeCollection,
- wrapShrink = 0,
- coordIndex = 0,
- isGeometryCollection,
- type = geojson.type,
- isFeatureCollection = type === 'FeatureCollection',
- isFeature = type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
- (isFeature ? geojson.geometry : geojson));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
- var multiFeatureIndex = 0;
- var geometryIndex = 0;
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
- // Handles null Geometry -- Skips this geometry
- if (geometry === null) continue;
- coords = geometry.coordinates;
- var geomType = geometry.type;
- wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
- switch (geomType) {
- case null:
- break;
- case 'Point':
- if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- multiFeatureIndex++;
- break;
- case 'LineString':
- case 'MultiPoint':
- for (j = 0; j < coords.length; j++) {
- if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- if (geomType === 'MultiPoint') multiFeatureIndex++;
- }
- if (geomType === 'LineString') multiFeatureIndex++;
- break;
- case 'Polygon':
- case 'MultiLineString':
- for (j = 0; j < coords.length; j++) {
- for (k = 0; k < coords[j].length - wrapShrink; k++) {
- if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- if (geomType === 'MultiLineString') multiFeatureIndex++;
- if (geomType === 'Polygon') geometryIndex++;
- }
- if (geomType === 'Polygon') multiFeatureIndex++;
- break;
- case 'MultiPolygon':
- for (j = 0; j < coords.length; j++) {
- if (geomType === 'MultiPolygon') geometryIndex = 0;
- for (k = 0; k < coords[j].length; k++) {
- for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
- if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- geometryIndex++;
- }
- multiFeatureIndex++;
- }
- break;
- case 'GeometryCollection':
- for (j = 0; j < geometry.geometries.length; j++)
- if (meta_main_es_coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
- break;
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- }
- }
- /**
- * Callback for coordReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback coordReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
- *
- * @name coordReduce
- * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentCoord;
- * });
- */
- function meta_main_es_coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
- var previousValue = initialValue;
- meta_main_es_coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
- else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
- }, excludeWrapCoord);
- return previousValue;
- }
- /**
- * Callback for propEach
- *
- * @callback propEachCallback
- * @param {Object} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over properties in any GeoJSON object, similar to Array.forEach()
- *
- * @name propEach
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentProperties, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propEach(features, function (currentProperties, featureIndex) {
- * //=currentProperties
- * //=featureIndex
- * });
- */
- function meta_main_es_propEach(geojson, callback) {
- var i;
- switch (geojson.type) {
- case 'FeatureCollection':
- for (i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i].properties, i) === false) break;
- }
- break;
- case 'Feature':
- callback(geojson.properties, 0);
- break;
- }
- }
- /**
- * Callback for propReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback propReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {*} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce properties in any GeoJSON object into a single value,
- * similar to how Array.reduce works. However, in this case we lazily run
- * the reduction, so an array of all properties is unnecessary.
- *
- * @name propReduce
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
- * //=previousValue
- * //=currentProperties
- * //=featureIndex
- * return currentProperties
- * });
- */
- function meta_main_es_propReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- meta_main_es_propEach(geojson, function (currentProperties, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
- else previousValue = callback(previousValue, currentProperties, featureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for featureEach
- *
- * @callback featureEachCallback
- * @param {Feature<any>} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name featureEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.featureEach(features, function (currentFeature, featureIndex) {
- * //=currentFeature
- * //=featureIndex
- * });
- */
- function meta_main_es_featureEach(geojson, callback) {
- if (geojson.type === 'Feature') {
- callback(geojson, 0);
- } else if (geojson.type === 'FeatureCollection') {
- for (var i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i], i) === false) break;
- }
- }
- }
- /**
- * Callback for featureReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback featureReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name featureReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * return currentFeature
- * });
- */
- function meta_main_es_featureReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- meta_main_es_featureEach(geojson, function (currentFeature, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex);
- });
- return previousValue;
- }
- /**
- * Get all coordinates from any GeoJSON object.
- *
- * @name coordAll
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @returns {Array<Array<number>>} coordinate position array
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * var coords = turf.coordAll(features);
- * //= [[26, 37], [36, 53]]
- */
- function meta_main_es_coordAll(geojson) {
- var coords = [];
- meta_main_es_coordEach(geojson, function (coord) {
- coords.push(coord);
- });
- return coords;
- }
- /**
- * Callback for geomEach
- *
- * @callback geomEachCallback
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
- *
- * @name geomEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * });
- */
- function meta_main_es_geomEach(geojson, callback) {
- var i, j, g, geometry, stopG,
- geometryMaybeCollection,
- isGeometryCollection,
- featureProperties,
- featureBBox,
- featureId,
- featureIndex = 0,
- isFeatureCollection = geojson.type === 'FeatureCollection',
- isFeature = geojson.type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (i = 0; i < stop; i++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
- (isFeature ? geojson.geometry : geojson));
- featureProperties = (isFeatureCollection ? geojson.features[i].properties :
- (isFeature ? geojson.properties : {}));
- featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
- (isFeature ? geojson.bbox : undefined));
- featureId = (isFeatureCollection ? geojson.features[i].id :
- (isFeature ? geojson.id : undefined));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (g = 0; g < stopG; g++) {
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
- // Handle null Geometry
- if (geometry === null) {
- if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- continue;
- }
- switch (geometry.type) {
- case 'Point':
- case 'LineString':
- case 'MultiPoint':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon': {
- if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- break;
- }
- case 'GeometryCollection': {
- for (j = 0; j < geometry.geometries.length; j++) {
- if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- }
- break;
- }
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- // Only increase `featureIndex` per each feature
- featureIndex++;
- }
- }
- /**
- * Callback for geomReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback geomReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Reduce geometry in any GeoJSON object, similar to Array.reduce().
- *
- * @name geomReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=previousValue
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * return currentGeometry
- * });
- */
- function meta_main_es_geomReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- meta_main_es_geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
- else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
- });
- return previousValue;
- }
- /**
- * Callback for flattenEach
- *
- * @callback flattenEachCallback
- * @param {Feature} currentFeature The current flattened feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Iterate over flattened features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name flattenEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * });
- */
- function meta_main_es_flattenEach(geojson, callback) {
- meta_main_es_geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
- // Callback for single geometry
- var type = (geometry === null) ? null : geometry.type;
- switch (type) {
- case null:
- case 'Point':
- case 'LineString':
- case 'Polygon':
- if (callback(_turf_helpers_main_es_feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
- return;
- }
- var geomType;
- // Callback for multi-geometry
- switch (type) {
- case 'MultiPoint':
- geomType = 'Point';
- break;
- case 'MultiLineString':
- geomType = 'LineString';
- break;
- case 'MultiPolygon':
- geomType = 'Polygon';
- break;
- }
- for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
- var coordinate = geometry.coordinates[multiFeatureIndex];
- var geom = {
- type: geomType,
- coordinates: coordinate
- };
- if (callback(_turf_helpers_main_es_feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
- }
- });
- }
- /**
- * Callback for flattenReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback flattenReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
- *
- * @name flattenReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * return currentFeature
- * });
- */
- function meta_main_es_flattenReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- meta_main_es_flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
- if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for segmentEach
- *
- * @callback segmentEachCallback
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- * @returns {void}
- */
- /**
- * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //=currentSegment
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * //=segmentIndex
- * });
- *
- * // Calculate the total number of segments
- * var total = 0;
- * turf.segmentEach(polygon, function () {
- * total++;
- * });
- */
- function meta_main_es_segmentEach(geojson, callback) {
- meta_main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- var segmentIndex = 0;
- // Exclude null Geometries
- if (!feature$$1.geometry) return;
- // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- var type = feature$$1.geometry.type;
- if (type === 'Point' || type === 'MultiPoint') return;
- // Generate 2-vertex line segments
- var previousCoords;
- if (meta_main_es_coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
- // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
- if (previousCoords === undefined) {
- previousCoords = currentCoord;
- return;
- }
- var currentSegment = helpers_main_es_lineString([previousCoords, currentCoord], feature$$1.properties);
- if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
- segmentIndex++;
- previousCoords = currentCoord;
- }) === false) return false;
- });
- }
- /**
- * Callback for segmentReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback segmentReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- */
- /**
- * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //= previousSegment
- * //= currentSegment
- * //= featureIndex
- * //= multiFeatureIndex
- * //= geometryIndex
- * //= segmentInex
- * return currentSegment
- * });
- *
- * // Calculate the total number of segments
- * var initialValue = 0
- * var total = turf.segmentReduce(polygon, function (previousValue) {
- * previousValue++;
- * return previousValue;
- * }, initialValue);
- */
- function meta_main_es_segmentReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- var started = false;
- meta_main_es_segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- if (started === false && initialValue === undefined) previousValue = currentSegment;
- else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
- started = true;
- });
- return previousValue;
- }
- /**
- * Callback for lineEach
- *
- * @callback lineEachCallback
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
- * similar to Array.forEach.
- *
- * @name lineEach
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @example
- * var multiLine = turf.multiLineString([
- * [[26, 37], [35, 45]],
- * [[36, 53], [38, 50], [41, 55]]
- * ]);
- *
- * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function meta_main_es_lineEach(geojson, callback) {
- // validation
- if (!geojson) throw new Error('geojson is required');
- meta_main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- if (feature$$1.geometry === null) return;
- var type = feature$$1.geometry.type;
- var coords = feature$$1.geometry.coordinates;
- switch (type) {
- case 'LineString':
- if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
- break;
- case 'Polygon':
- for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
- if (callback(helpers_main_es_lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- }
- break;
- }
- });
- }
- /**
- * Callback for lineReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback lineReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name lineReduce
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var multiPoly = turf.multiPolygon([
- * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
- * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
- * ]);
- *
- * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentLine
- * });
- */
- function meta_main_es_lineReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- meta_main_es_lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
- else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
- });
- return previousValue;
- }
- /**
- * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- * Point & MultiPoint will always return null.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.segmentIndex=0] Segment Index
- * @param {Object} [options.properties={}] Translate Properties to output LineString
- * @param {BBox} [options.bbox={}] Translate BBox to output LineString
- * @param {number|string} [options.id={}] Translate Id to output LineString
- * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findSegment(multiLine);
- * // => Feature<LineString<[[10, 10], [50, 30]]>>
- *
- * // First Segment of 2nd Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: 1});
- * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
- *
- * // Last Segment of Last Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
- * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
- */
- function meta_main_es_findSegment(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var segmentIndex = options.segmentIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find SegmentIndex
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
- return helpers_main_es_lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
- return helpers_main_es_lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
- return helpers_main_es_lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
- return helpers_main_es_lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- /**
- * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.coordIndex=0] Coord Index
- * @param {Object} [options.properties={}] Translate Properties to output Point
- * @param {BBox} [options.bbox={}] Translate BBox to output Point
- * @param {number|string} [options.id={}] Translate Id to output Point
- * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findPoint(multiLine);
- * // => Feature<Point<[10, 10]>>
- *
- * // First Segment of the 2nd Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: 1});
- * // => Feature<Point<[-10, -10]>>
- *
- * // Last Segment of last Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
- * // => Feature<Point<[-30, -40]>>
- */
- function meta_main_es_findPoint(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var coordIndex = options.coordIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find Coord Index
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- return helpers_main_es_point(coords, properties, options);
- case 'MultiPoint':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- return helpers_main_es_point(coords[multiFeatureIndex], properties, options);
- case 'LineString':
- if (coordIndex < 0) coordIndex = coords.length + coordIndex;
- return helpers_main_es_point(coords[coordIndex], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
- return helpers_main_es_point(coords[geometryIndex][coordIndex], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
- return helpers_main_es_point(coords[multiFeatureIndex][coordIndex], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
- return helpers_main_es_point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/bbox/main.es.js
- /**
- * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
- *
- * @name bbox
- * @param {GeoJSON} geojson any GeoJSON object
- * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
- * var bbox = turf.bbox(line);
- * var bboxPolygon = turf.bboxPolygon(bbox);
- *
- * //addToMap
- * var addToMap = [line, bboxPolygon]
- */
- function bbox_main_es_bbox(geojson) {
- var BBox = [Infinity, Infinity, -Infinity, -Infinity];
- meta_main_es_coordEach(geojson, function (coord) {
- if (BBox[0] > coord[0]) BBox[0] = coord[0];
- if (BBox[1] > coord[1]) BBox[1] = coord[1];
- if (BBox[2] < coord[0]) BBox[2] = coord[0];
- if (BBox[3] < coord[1]) BBox[3] = coord[1];
- });
- return BBox;
- }
- /* harmony default export */ var _turf_bbox_main_es = (bbox_main_es_bbox);
- // CONCATENATED MODULE: ./node_modules/@turf/invariant/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var _turf_helpers_main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var _turf_helpers_main_es_factors = {
- meters: _turf_helpers_main_es_earthRadius,
- metres: _turf_helpers_main_es_earthRadius,
- millimeters: _turf_helpers_main_es_earthRadius * 1000,
- millimetres: _turf_helpers_main_es_earthRadius * 1000,
- centimeters: _turf_helpers_main_es_earthRadius * 100,
- centimetres: _turf_helpers_main_es_earthRadius * 100,
- kilometers: _turf_helpers_main_es_earthRadius / 1000,
- kilometres: _turf_helpers_main_es_earthRadius / 1000,
- miles: _turf_helpers_main_es_earthRadius / 1609.344,
- nauticalmiles: _turf_helpers_main_es_earthRadius / 1852,
- inches: _turf_helpers_main_es_earthRadius * 39.370,
- yards: _turf_helpers_main_es_earthRadius / 1.0936,
- feet: _turf_helpers_main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: _turf_helpers_main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var _turf_helpers_main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / _turf_helpers_main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var _turf_helpers_main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) _turf_helpers_main_es_validateBBox(bbox);
- if (id) _turf_helpers_main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) _turf_helpers_main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = _turf_helpers_main_es_point(coordinates).geometry; break;
- case 'LineString': geom = _turf_helpers_main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = _turf_helpers_main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = _turf_helpers_main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = _turf_helpers_main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = _turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function _turf_helpers_main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!_turf_helpers_main_es_isNumber(coordinates[0]) || !_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return node_modules_turf_helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function _turf_helpers_main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return _turf_helpers_main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function _turf_helpers_main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !_turf_helpers_main_es_isNumber(ring[0][0]) || !_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return node_modules_turf_helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function _turf_helpers_main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return _turf_helpers_main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function _turf_helpers_main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!_turf_helpers_main_es_isNumber(coordinates[0][1]) || !_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return node_modules_turf_helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function _turf_helpers_main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return _turf_helpers_main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function _turf_helpers_main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) _turf_helpers_main_es_validateBBox(bbox);
- if (id) _turf_helpers_main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function _turf_helpers_main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return node_modules_turf_helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function _turf_helpers_main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return node_modules_turf_helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function _turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return node_modules_turf_helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function _turf_helpers_main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return node_modules_turf_helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function _turf_helpers_main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function _turf_helpers_main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = _turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function _turf_helpers_main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = _turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function _turf_helpers_main_es_lengthToDegrees(distance, units) {
- return _turf_helpers_main_es_radiansToDegrees(_turf_helpers_main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function _turf_helpers_main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function _turf_helpers_main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function _turf_helpers_main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function _turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return _turf_helpers_main_es_radiansToLength(_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function _turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = _turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = _turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function _turf_helpers_main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function _turf_helpers_main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function _turf_helpers_main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function _turf_helpers_main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function _turf_helpers_main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function _turf_helpers_main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function _turf_helpers_main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function _turf_helpers_main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function _turf_helpers_main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function _turf_helpers_main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function _turf_helpers_main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/invariant/main.es.js
- /**
- * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
- *
- * @name getCoord
- * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
- * @returns {Array<number>} coordinates
- * @example
- * var pt = turf.point([10, 10]);
- *
- * var coord = turf.getCoord(pt);
- * //= [10, 10]
- */
- function getCoord(coord) {
- if (!coord) throw new Error('coord is required');
- if (coord.type === 'Feature' && coord.geometry !== null && coord.geometry.type === 'Point') return coord.geometry.coordinates;
- if (coord.type === 'Point') return coord.coordinates;
- if (Array.isArray(coord) && coord.length >= 2 && coord[0].length === undefined && coord[1].length === undefined) return coord;
- throw new Error('coord must be GeoJSON Point or an Array of numbers');
- }
- /**
- * Unwrap coordinates from a Feature, Geometry Object or an Array
- *
- * @name getCoords
- * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
- * @returns {Array<any>} coordinates
- * @example
- * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
- *
- * var coords = turf.getCoords(poly);
- * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
- */
- function getCoords(coords) {
- if (!coords) throw new Error('coords is required');
- // Feature
- if (coords.type === 'Feature' && coords.geometry !== null) return coords.geometry.coordinates;
- // Geometry
- if (coords.coordinates) return coords.coordinates;
- // Array of numbers
- if (Array.isArray(coords)) return coords;
- throw new Error('coords must be GeoJSON Feature, Geometry Object or an Array');
- }
- /**
- * Checks if coordinates contains a number
- *
- * @name containsNumber
- * @param {Array<any>} coordinates GeoJSON Coordinates
- * @returns {boolean} true if Array contains a number
- */
- function containsNumber(coordinates) {
- if (coordinates.length > 1 && _turf_helpers_main_es_isNumber(coordinates[0]) && _turf_helpers_main_es_isNumber(coordinates[1])) {
- return true;
- }
- if (Array.isArray(coordinates[0]) && coordinates[0].length) {
- return containsNumber(coordinates[0]);
- }
- throw new Error('coordinates must only contain numbers');
- }
- /**
- * Enforce expectations about types of GeoJSON objects for Turf.
- *
- * @name geojsonType
- * @param {GeoJSON} value any GeoJSON object
- * @param {string} type expected GeoJSON type
- * @param {string} name name of calling function
- * @throws {Error} if value is not the expected type.
- */
- function geojsonType(value, type, name) {
- if (!type || !name) throw new Error('type and name required');
- if (!value || value.type !== type) {
- throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + value.type);
- }
- }
- /**
- * Enforce expectations about types of {@link Feature} inputs for Turf.
- * Internally this uses {@link geojsonType} to judge geometry types.
- *
- * @name featureOf
- * @param {Feature} feature a feature with an expected geometry type
- * @param {string} type expected GeoJSON type
- * @param {string} name name of calling function
- * @throws {Error} error if value is not the expected type.
- */
- function featureOf(feature, type, name) {
- if (!feature) throw new Error('No feature passed');
- if (!name) throw new Error('.featureOf() requires a name');
- if (!feature || feature.type !== 'Feature' || !feature.geometry) {
- throw new Error('Invalid input to ' + name + ', Feature with geometry required');
- }
- if (!feature.geometry || feature.geometry.type !== type) {
- throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
- }
- }
- /**
- * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
- * Internally this uses {@link geojsonType} to judge geometry types.
- *
- * @name collectionOf
- * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
- * @param {string} type expected GeoJSON type
- * @param {string} name name of calling function
- * @throws {Error} if value is not the expected type.
- */
- function collectionOf(featureCollection, type, name) {
- if (!featureCollection) throw new Error('No featureCollection passed');
- if (!name) throw new Error('.collectionOf() requires a name');
- if (!featureCollection || featureCollection.type !== 'FeatureCollection') {
- throw new Error('Invalid input to ' + name + ', FeatureCollection required');
- }
- for (var i = 0; i < featureCollection.features.length; i++) {
- var feature = featureCollection.features[i];
- if (!feature || feature.type !== 'Feature' || !feature.geometry) {
- throw new Error('Invalid input to ' + name + ', Feature with geometry required');
- }
- if (!feature.geometry || feature.geometry.type !== type) {
- throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
- }
- }
- }
- /**
- * Get Geometry from Feature or Geometry Object
- *
- * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
- * @returns {Geometry|null} GeoJSON Geometry Object
- * @throws {Error} if geojson is not a Feature or Geometry Object
- * @example
- * var point = {
- * "type": "Feature",
- * "properties": {},
- * "geometry": {
- * "type": "Point",
- * "coordinates": [110, 40]
- * }
- * }
- * var geom = turf.getGeom(point)
- * //={"type": "Point", "coordinates": [110, 40]}
- */
- function getGeom(geojson) {
- if (!geojson) throw new Error('geojson is required');
- if (geojson.geometry !== undefined) return geojson.geometry;
- if (geojson.coordinates || geojson.geometries) return geojson;
- throw new Error('geojson must be a valid Feature or Geometry Object');
- }
- /**
- * Get Geometry Type from Feature or Geometry Object
- *
- * @throws {Error} **DEPRECATED** in v5.0.0 in favor of getType
- */
- function getGeomType() {
- throw new Error('invariant.getGeomType has been deprecated in v5.0 in favor of invariant.getType');
- }
- /**
- * Get GeoJSON object's type, Geometry type is prioritize.
- *
- * @param {GeoJSON} geojson GeoJSON object
- * @param {string} [name="geojson"] name of the variable to display in error message
- * @returns {string} GeoJSON type
- * @example
- * var point = {
- * "type": "Feature",
- * "properties": {},
- * "geometry": {
- * "type": "Point",
- * "coordinates": [110, 40]
- * }
- * }
- * var geom = turf.getType(point)
- * //="Point"
- */
- function getType(geojson, name) {
- if (!geojson) throw new Error((name || 'geojson') + ' is required');
- // GeoJSON Feature & GeometryCollection
- if (geojson.geometry && geojson.geometry.type) return geojson.geometry.type;
- // GeoJSON Geometry & FeatureCollection
- if (geojson.type) return geojson.type;
- throw new Error((name || 'geojson') + ' is invalid');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-bearing/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var node_modules_turf_helpers_main_es_factors = {
- meters: node_modules_turf_helpers_main_es_earthRadius,
- metres: node_modules_turf_helpers_main_es_earthRadius,
- millimeters: node_modules_turf_helpers_main_es_earthRadius * 1000,
- millimetres: node_modules_turf_helpers_main_es_earthRadius * 1000,
- centimeters: node_modules_turf_helpers_main_es_earthRadius * 100,
- centimetres: node_modules_turf_helpers_main_es_earthRadius * 100,
- kilometers: node_modules_turf_helpers_main_es_earthRadius / 1000,
- kilometres: node_modules_turf_helpers_main_es_earthRadius / 1000,
- miles: node_modules_turf_helpers_main_es_earthRadius / 1609.344,
- nauticalmiles: node_modules_turf_helpers_main_es_earthRadius / 1852,
- inches: node_modules_turf_helpers_main_es_earthRadius * 39.370,
- yards: node_modules_turf_helpers_main_es_earthRadius / 1.0936,
- feet: node_modules_turf_helpers_main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: node_modules_turf_helpers_main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var node_modules_turf_helpers_main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / node_modules_turf_helpers_main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var node_modules_turf_helpers_main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function rhumb_bearing_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function rhumb_bearing_node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
- case 'LineString': geom = node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return node_modules_turf_helpers_main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return node_modules_turf_helpers_main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return node_modules_turf_helpers_main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function node_modules_turf_helpers_main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function node_modules_turf_helpers_main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
- return node_modules_turf_helpers_main_es_radiansToDegrees(node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return node_modules_turf_helpers_main_es_radiansToLength(node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function node_modules_turf_helpers_main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function node_modules_turf_helpers_main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function node_modules_turf_helpers_main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function node_modules_turf_helpers_main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function node_modules_turf_helpers_main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function node_modules_turf_helpers_main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function node_modules_turf_helpers_main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function node_modules_turf_helpers_main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function node_modules_turf_helpers_main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function node_modules_turf_helpers_main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function node_modules_turf_helpers_main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-bearing/main.es.js
- // https://en.wikipedia.org/wiki/Rhumb_line
- /**
- * Takes two {@link Point|points} and finds the bearing angle between them along a Rhumb line
- * i.e. the angle measured in degrees start the north line (0 degrees)
- *
- * @name rhumbBearing
- * @param {Coord} start starting Point
- * @param {Coord} end ending Point
- * @param {Object} [options] Optional parameters
- * @param {boolean} [options.final=false] calculates the final bearing if true
- * @returns {number} bearing from north in decimal degrees, between -180 and 180 degrees (positive clockwise)
- * @example
- * var point1 = turf.point([-75.343, 39.984], {"marker-color": "#F00"});
- * var point2 = turf.point([-75.534, 39.123], {"marker-color": "#00F"});
- *
- * var bearing = turf.rhumbBearing(point1, point2);
- *
- * //addToMap
- * var addToMap = [point1, point2];
- * point1.properties.bearing = bearing;
- * point2.properties.bearing = bearing;
- */
- function rhumbBearing(start, end, options) {
- // Optional parameters
- options = options || {};
- if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var final = options.final;
- // validation
- if (!start) throw new Error('start point is required');
- if (!end) throw new Error('end point is required');
- var bear360;
- if (final) bear360 = calculateRhumbBearing(getCoord(end), getCoord(start));
- else bear360 = calculateRhumbBearing(getCoord(start), getCoord(end));
- var bear180 = (bear360 > 180) ? -(360 - bear360) : bear360;
- return bear180;
- }
- /**
- * Returns the bearing from ‘this’ point to destination point along a rhumb line.
- * Adapted from Geodesy: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js
- *
- * @private
- * @param {Array<number>} from - origin point.
- * @param {Array<number>} to - destination point.
- * @returns {number} Bearing in degrees from north.
- * @example
- * var p1 = new LatLon(51.127, 1.338);
- * var p2 = new LatLon(50.964, 1.853);
- * var d = p1.rhumbBearingTo(p2); // 116.7 m
- */
- function calculateRhumbBearing(from, to) {
- // φ => phi
- // Δλ => deltaLambda
- // Δψ => deltaPsi
- // θ => theta
- var phi1 = node_modules_turf_helpers_main_es_degreesToRadians(from[1]);
- var phi2 = node_modules_turf_helpers_main_es_degreesToRadians(to[1]);
- var deltaLambda = node_modules_turf_helpers_main_es_degreesToRadians((to[0] - from[0]));
- // if deltaLambdaon over 180° take shorter rhumb line across the anti-meridian:
- if (deltaLambda > Math.PI) deltaLambda -= 2 * Math.PI;
- if (deltaLambda < -Math.PI) deltaLambda += 2 * Math.PI;
- var deltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
- var theta = Math.atan2(deltaLambda, deltaPsi);
- return (node_modules_turf_helpers_main_es_radiansToDegrees(theta) + 360) % 360;
- }
- /* harmony default export */ var rhumb_bearing_main_es = (rhumbBearing);
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-distance/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var rhumb_distance_node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var rhumb_distance_node_modules_turf_helpers_main_es_factors = {
- meters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
- metres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
- millimeters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 1000,
- millimetres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 1000,
- centimeters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 100,
- centimetres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 100,
- kilometers: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1000,
- kilometres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1000,
- miles: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1609.344,
- nauticalmiles: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1852,
- inches: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 39.370,
- yards: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1.0936,
- feet: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var rhumb_distance_node_modules_turf_helpers_main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var rhumb_distance_node_modules_turf_helpers_main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) rhumb_distance_node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = rhumb_distance_node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
- case 'LineString': geom = rhumb_distance_node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = rhumb_distance_node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_distance_node_modules_turf_helpers_main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_distance_node_modules_turf_helpers_main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_distance_node_modules_turf_helpers_main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) rhumb_distance_node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return rhumb_distance_node_modules_turf_helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = rhumb_distance_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = rhumb_distance_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
- return rhumb_distance_node_modules_turf_helpers_main_es_radiansToDegrees(rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return rhumb_distance_node_modules_turf_helpers_main_es_radiansToLength(rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = rhumb_distance_node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = rhumb_distance_node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function rhumb_distance_node_modules_turf_helpers_main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function rhumb_distance_node_modules_turf_helpers_main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function rhumb_distance_node_modules_turf_helpers_main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-distance/main.es.js
- // https://en.wikipedia.org/wiki/Rhumb_line
- /**
- * Calculates the distance along a rhumb line between two {@link Point|points} in degrees, radians,
- * miles, or kilometers.
- *
- * @name rhumbDistance
- * @param {Coord} from origin point
- * @param {Coord} to destination point
- * @param {Object} [options] Optional parameters
- * @param {string} [options.units="kilometers"] can be degrees, radians, miles, or kilometers
- * @returns {number} distance between the two points
- * @example
- * var from = turf.point([-75.343, 39.984]);
- * var to = turf.point([-75.534, 39.123]);
- * var options = {units: 'miles'};
- *
- * var distance = turf.rhumbDistance(from, to, options);
- *
- * //addToMap
- * var addToMap = [from, to];
- * from.properties.distance = distance;
- * to.properties.distance = distance;
- */
- function rhumbDistance(from, to, options) {
- // Optional parameters
- options = options || {};
- if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var units = options.units;
- // validation
- if (!from) throw new Error('from point is required');
- if (!to) throw new Error('to point is required');
- var origin = getCoord(from);
- var destination = getCoord(to);
- // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html)
- // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678
- destination[0] += (destination[0] - origin[0] > 180) ? -360 : (origin[0] - destination[0] > 180) ? 360 : 0;
- var distanceInMeters = calculateRhumbDistance(origin, destination);
- var distance = rhumb_distance_node_modules_turf_helpers_main_es_convertLength(distanceInMeters, 'meters', units);
- return distance;
- }
- /**
- * Returns the distance travelling from ‘this’ point to destination point along a rhumb line.
- * Adapted from Geodesy: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js
- *
- * @private
- * @param {Array<number>} origin point.
- * @param {Array<number>} destination point.
- * @param {number} [radius=6371e3] - (Mean) radius of earth (defaults to radius in metres).
- * @returns {number} Distance in km between this point and destination point (same units as radius).
- *
- * @example
- * var p1 = new LatLon(51.127, 1.338);
- * var p2 = new LatLon(50.964, 1.853);
- * var d = p1.distanceTo(p2); // 40.31 km
- */
- function calculateRhumbDistance(origin, destination, radius) {
- // φ => phi
- // λ => lambda
- // ψ => psi
- // Δ => Delta
- // δ => delta
- // θ => theta
- radius = (radius === undefined) ? rhumb_distance_node_modules_turf_helpers_main_es_earthRadius : Number(radius);
- // see www.edwilliams.org/avform.htm#Rhumb
- var R = radius;
- var phi1 = origin[1] * Math.PI / 180;
- var phi2 = destination[1] * Math.PI / 180;
- var DeltaPhi = phi2 - phi1;
- var DeltaLambda = Math.abs(destination[0] - origin[0]) * Math.PI / 180;
- // if dLon over 180° take shorter rhumb line across the anti-meridian:
- if (DeltaLambda > Math.PI) DeltaLambda -= 2 * Math.PI;
- // on Mercator projection, longitude distances shrink by latitude; q is the 'stretch factor'
- // q becomes ill-conditioned along E-W line (0/0); use empirical tolerance to avoid it
- var DeltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
- var q = Math.abs(DeltaPsi) > 10e-12 ? DeltaPhi / DeltaPsi : Math.cos(phi1);
- // distance is pythagoras on 'stretched' Mercator projection
- var delta = Math.sqrt(DeltaPhi * DeltaPhi + q * q * DeltaLambda * DeltaLambda); // angular distance in radians
- var dist = delta * R;
- return dist;
- }
- /* harmony default export */ var rhumb_distance_main_es = (rhumbDistance);
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-destination/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var rhumb_destination_node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var rhumb_destination_node_modules_turf_helpers_main_es_factors = {
- meters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
- metres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
- millimeters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 1000,
- millimetres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 1000,
- centimeters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 100,
- centimetres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 100,
- kilometers: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1000,
- kilometres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1000,
- miles: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1609.344,
- nauticalmiles: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1852,
- inches: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 39.370,
- yards: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1.0936,
- feet: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var rhumb_destination_node_modules_turf_helpers_main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var rhumb_destination_node_modules_turf_helpers_main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) rhumb_destination_node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = rhumb_destination_node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
- case 'LineString': geom = rhumb_destination_node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = rhumb_destination_node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_destination_node_modules_turf_helpers_main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_destination_node_modules_turf_helpers_main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
- return rhumb_destination_node_modules_turf_helpers_main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
- if (id) rhumb_destination_node_modules_turf_helpers_main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return rhumb_destination_node_modules_turf_helpers_main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = rhumb_destination_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = rhumb_destination_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
- return rhumb_destination_node_modules_turf_helpers_main_es_radiansToDegrees(rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return rhumb_destination_node_modules_turf_helpers_main_es_radiansToLength(rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = rhumb_destination_node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = rhumb_destination_node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function rhumb_destination_node_modules_turf_helpers_main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function rhumb_destination_node_modules_turf_helpers_main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function rhumb_destination_node_modules_turf_helpers_main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/rhumb-destination/main.es.js
- // https://en.wikipedia.org/wiki/Rhumb_line
- /**
- * Returns the destination {@link Point} having travelled the given distance along a Rhumb line from the
- * origin Point with the (varant) given bearing.
- *
- * @name rhumbDestination
- * @param {Coord} origin starting point
- * @param {number} distance distance from the starting point
- * @param {number} bearing varant bearing angle ranging from -180 to 180 degrees from north
- * @param {Object} [options={}] Optional parameters
- * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers
- * @param {Object} [options.properties={}] translate properties to destination point
- * @returns {Feature<Point>} Destination point.
- * @example
- * var pt = turf.point([-75.343, 39.984], {"marker-color": "F00"});
- * var distance = 50;
- * var bearing = 90;
- * var options = {units: 'miles'};
- *
- * var destination = turf.rhumbDestination(pt, distance, bearing, options);
- *
- * //addToMap
- * var addToMap = [pt, destination]
- * destination.properties['marker-color'] = '#00F';
- */
- function rhumbDestination(origin, distance, bearing, options) {
- // Optional parameters
- options = options || {};
- if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var units = options.units;
- var properties = options.properties;
- // validation
- if (!origin) throw new Error('origin is required');
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (bearing === undefined || bearing === null) throw new Error('bearing is required');
- if (!(distance >= 0)) throw new Error('distance must be greater than 0');
- var distanceInMeters = rhumb_destination_node_modules_turf_helpers_main_es_convertLength(distance, units, 'meters');
- var coords = getCoord(origin);
- var destination = calculateRhumbDestination(coords, distanceInMeters, bearing);
- // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html)
- // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678
- destination[0] += (destination[0] - coords[0] > 180) ? -360 : (coords[0] - destination[0] > 180) ? 360 : 0;
- return rhumb_destination_node_modules_turf_helpers_main_es_point(destination, properties);
- }
- /**
- * Returns the destination point having travelled along a rhumb line from origin point the given
- * distance on the given bearing.
- * Adapted from Geodesy: http://www.movable-type.co.uk/scripts/latlong.html#rhumblines
- *
- * @private
- * @param {Array<number>} origin - point
- * @param {number} distance - Distance travelled, in same units as earth radius (default: metres).
- * @param {number} bearing - Bearing in degrees from north.
- * @param {number} [radius=6371e3] - (Mean) radius of earth (defaults to radius in metres).
- * @returns {Array<number>} Destination point.
- */
- function calculateRhumbDestination(origin, distance, bearing, radius) {
- // φ => phi
- // λ => lambda
- // ψ => psi
- // Δ => Delta
- // δ => delta
- // θ => theta
- radius = (radius === undefined) ? rhumb_destination_node_modules_turf_helpers_main_es_earthRadius : Number(radius);
- var delta = distance / radius; // angular distance in radians
- var lambda1 = origin[0] * Math.PI / 180; // to radians, but without normalize to 𝜋
- var phi1 = rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(origin[1]);
- var theta = rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(bearing);
- var DeltaPhi = delta * Math.cos(theta);
- var phi2 = phi1 + DeltaPhi;
- // check for some daft bugger going past the pole, normalise latitude if so
- if (Math.abs(phi2) > Math.PI / 2) phi2 = phi2 > 0 ? Math.PI - phi2 : -Math.PI - phi2;
- var DeltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
- var q = Math.abs(DeltaPsi) > 10e-12 ? DeltaPhi / DeltaPsi : Math.cos(phi1); // E-W course becomes ill-conditioned with 0/0
- var DeltaLambda = delta * Math.sin(theta) / q;
- var lambda2 = lambda1 + DeltaLambda;
- return [((lambda2 * 180 / Math.PI) + 540) % 360 - 180, phi2 * 180 / Math.PI]; // normalise to −180..+180°
- }
- /* harmony default export */ var rhumb_destination_main_es = (rhumbDestination);
- // CONCATENATED MODULE: ./node_modules/@turf/transform-scale/main.es.js
- /**
- * Scale a GeoJSON from a given point by a factor of scaling (ex: factor=2 would make the GeoJSON 200% larger).
- * If a FeatureCollection is provided, the origin point will be calculated based on each individual Feature.
- *
- * @name transformScale
- * @param {GeoJSON} geojson GeoJSON to be scaled
- * @param {number} factor of scaling, positive or negative values greater than 0
- * @param {Object} [options={}] Optional parameters
- * @param {string|Coord} [options.origin='centroid'] Point from which the scaling will occur (string options: sw/se/nw/ne/center/centroid)
- * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
- * @returns {GeoJSON} scaled GeoJSON
- * @example
- * var poly = turf.polygon([[[0,29],[3.5,29],[2.5,32],[0,29]]]);
- * var scaledPoly = turf.transformScale(poly, 3);
- *
- * //addToMap
- * var addToMap = [poly, scaledPoly];
- * scaledPoly.properties = {stroke: '#F00', 'stroke-width': 4};
- */
- function transformScale(geojson, factor, options) {
- // Optional parameters
- options = options || {};
- if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
- var origin = options.origin;
- var mutate = options.mutate;
- // Input validation
- if (!geojson) throw new Error('geojson required');
- if (typeof factor !== 'number' || factor === 0) throw new Error('invalid factor');
- var originIsPoint = Array.isArray(origin) || typeof origin === 'object';
- // Clone geojson to avoid side effects
- if (mutate !== true) geojson = main_es(geojson);
- // Scale each Feature separately
- if (geojson.type === 'FeatureCollection' && !originIsPoint) {
- meta_main_es_featureEach(geojson, function (feature, index) {
- geojson.features[index] = scale(feature, factor, origin);
- });
- return geojson;
- }
- // Scale Feature/Geometry
- return scale(geojson, factor, origin);
- }
- /**
- * Scale Feature/Geometry
- *
- * @private
- * @param {Feature|Geometry} feature GeoJSON Feature/Geometry
- * @param {number} factor of scaling, positive or negative values greater than 0
- * @param {string|Coord} [origin="centroid"] Point from which the scaling will occur (string options: sw/se/nw/ne/center/centroid)
- * @returns {Feature|Geometry} scaled GeoJSON Feature/Geometry
- */
- function scale(feature, factor, origin) {
- // Default params
- var isPoint = getType(feature) === 'Point';
- origin = defineOrigin(feature, origin);
- // Shortcut no-scaling
- if (factor === 1 || isPoint) return feature;
- // Scale each coordinate
- meta_main_es_coordEach(feature, function (coord) {
- var originalDistance = rhumb_distance_main_es(origin, coord);
- var bearing = rhumb_bearing_main_es(origin, coord);
- var newDistance = originalDistance * factor;
- var newCoord = getCoords(rhumb_destination_main_es(origin, newDistance, bearing));
- coord[0] = newCoord[0];
- coord[1] = newCoord[1];
- if (coord.length === 3) coord[2] *= factor;
- });
- return feature;
- }
- /**
- * Define Origin
- *
- * @private
- * @param {GeoJSON} geojson GeoJSON
- * @param {string|Coord} origin sw/se/nw/ne/center/centroid
- * @returns {Feature<Point>} Point origin
- */
- function defineOrigin(geojson, origin) {
- // Default params
- if (origin === undefined || origin === null) origin = 'centroid';
- // Input Coord
- if (Array.isArray(origin) || typeof origin === 'object') return getCoord(origin);
- // Define BBox
- var bbox = (geojson.bbox) ? geojson.bbox : _turf_bbox_main_es(geojson);
- var west = bbox[0];
- var south = bbox[1];
- var east = bbox[2];
- var north = bbox[3];
- switch (origin) {
- case 'sw':
- case 'southwest':
- case 'westsouth':
- case 'bottomleft':
- return helpers_main_es_point([west, south]);
- case 'se':
- case 'southeast':
- case 'eastsouth':
- case 'bottomright':
- return helpers_main_es_point([east, south]);
- case 'nw':
- case 'northwest':
- case 'westnorth':
- case 'topleft':
- return helpers_main_es_point([west, north]);
- case 'ne':
- case 'northeast':
- case 'eastnorth':
- case 'topright':
- return helpers_main_es_point([east, north]);
- case 'center':
- return center_main_es(geojson);
- case undefined:
- case null:
- case 'centroid':
- return centroid_main_es(geojson);
- default:
- throw new Error('invalid origin');
- }
- }
- /* harmony default export */ var transform_scale_main_es = __webpack_exports__["default"] = (transformScale);
- /***/ }),
- /* 156 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
- function _arrayLikeToArray(arr, len) {
- if (len == null || len > arr.length) len = arr.length;
- for (var i = 0, arr2 = new Array(len); i < len; i++) {
- arr2[i] = arr[i];
- }
- return arr2;
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
- function _arrayWithoutHoles(arr) {
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js
- function _iterableToArray(iter) {
- if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
- function _unsupportedIterableToArray(o, minLen) {
- if (!o) return;
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
- var n = Object.prototype.toString.call(o).slice(8, -1);
- if (n === "Object" && o.constructor) n = o.constructor.name;
- if (n === "Map" || n === "Set") return Array.from(n);
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
- function _nonIterableSpread() {
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _toConsumableArray; });
- function _toConsumableArray(arr) {
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
- }
- /***/ }),
- /* 157 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var factors = {
- meters: earthRadius,
- metres: earthRadius,
- millimeters: earthRadius * 1000,
- millimetres: earthRadius * 1000,
- centimeters: earthRadius * 100,
- centimetres: earthRadius * 100,
- kilometers: earthRadius / 1000,
- kilometres: earthRadius / 1000,
- miles: earthRadius / 1609.344,
- nauticalmiles: earthRadius / 1852,
- inches: earthRadius * 39.370,
- yards: earthRadius / 1.0936,
- feet: earthRadius * 3.28084,
- radians: 1,
- degrees: earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) validateBBox(bbox);
- if (id) validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = point(coordinates).geometry; break;
- case 'LineString': geom = lineString(coordinates).geometry; break;
- case 'Polygon': geom = polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !isNumber(ring[0][0]) || !isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!isNumber(coordinates[0][1]) || !isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return featureCollection(coordinates.map(function (coords) {
- return lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) validateBBox(bbox);
- if (id) validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function lengthToDegrees(distance, units) {
- return radiansToDegrees(lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return radiansToLength(lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/meta/main.es.js
- /**
- * Callback for coordEach
- *
- * @callback coordEachCallback
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
- *
- * @name coordEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function coordEach(geojson, callback, excludeWrapCoord) {
- // Handles null Geometry -- Skips this GeoJSON
- if (geojson === null) return;
- var j, k, l, geometry, stopG, coords,
- geometryMaybeCollection,
- wrapShrink = 0,
- coordIndex = 0,
- isGeometryCollection,
- type = geojson.type,
- isFeatureCollection = type === 'FeatureCollection',
- isFeature = type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
- (isFeature ? geojson.geometry : geojson));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
- var multiFeatureIndex = 0;
- var geometryIndex = 0;
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
- // Handles null Geometry -- Skips this geometry
- if (geometry === null) continue;
- coords = geometry.coordinates;
- var geomType = geometry.type;
- wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
- switch (geomType) {
- case null:
- break;
- case 'Point':
- if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- multiFeatureIndex++;
- break;
- case 'LineString':
- case 'MultiPoint':
- for (j = 0; j < coords.length; j++) {
- if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- if (geomType === 'MultiPoint') multiFeatureIndex++;
- }
- if (geomType === 'LineString') multiFeatureIndex++;
- break;
- case 'Polygon':
- case 'MultiLineString':
- for (j = 0; j < coords.length; j++) {
- for (k = 0; k < coords[j].length - wrapShrink; k++) {
- if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- if (geomType === 'MultiLineString') multiFeatureIndex++;
- if (geomType === 'Polygon') geometryIndex++;
- }
- if (geomType === 'Polygon') multiFeatureIndex++;
- break;
- case 'MultiPolygon':
- for (j = 0; j < coords.length; j++) {
- if (geomType === 'MultiPolygon') geometryIndex = 0;
- for (k = 0; k < coords[j].length; k++) {
- for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
- if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- coordIndex++;
- }
- geometryIndex++;
- }
- multiFeatureIndex++;
- }
- break;
- case 'GeometryCollection':
- for (j = 0; j < geometry.geometries.length; j++)
- if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
- break;
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- }
- }
- /**
- * Callback for coordReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback coordReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Array<number>} currentCoord The current coordinate being processed.
- * @param {number} coordIndex The current index of the coordinate being processed.
- * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- */
- /**
- * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
- *
- * @name coordReduce
- * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentCoord
- * //=coordIndex
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentCoord;
- * });
- */
- function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
- var previousValue = initialValue;
- coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
- if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
- else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
- }, excludeWrapCoord);
- return previousValue;
- }
- /**
- * Callback for propEach
- *
- * @callback propEachCallback
- * @param {Object} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over properties in any GeoJSON object, similar to Array.forEach()
- *
- * @name propEach
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentProperties, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propEach(features, function (currentProperties, featureIndex) {
- * //=currentProperties
- * //=featureIndex
- * });
- */
- function propEach(geojson, callback) {
- var i;
- switch (geojson.type) {
- case 'FeatureCollection':
- for (i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i].properties, i) === false) break;
- }
- break;
- case 'Feature':
- callback(geojson.properties, 0);
- break;
- }
- }
- /**
- * Callback for propReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback propReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {*} currentProperties The current Properties being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce properties in any GeoJSON object into a single value,
- * similar to how Array.reduce works. However, in this case we lazily run
- * the reduction, so an array of all properties is unnecessary.
- *
- * @name propReduce
- * @param {FeatureCollection|Feature} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
- * //=previousValue
- * //=currentProperties
- * //=featureIndex
- * return currentProperties
- * });
- */
- function propReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- propEach(geojson, function (currentProperties, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
- else previousValue = callback(previousValue, currentProperties, featureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for featureEach
- *
- * @callback featureEachCallback
- * @param {Feature<any>} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Iterate over features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name featureEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.featureEach(features, function (currentFeature, featureIndex) {
- * //=currentFeature
- * //=featureIndex
- * });
- */
- function featureEach(geojson, callback) {
- if (geojson.type === 'Feature') {
- callback(geojson, 0);
- } else if (geojson.type === 'FeatureCollection') {
- for (var i = 0; i < geojson.features.length; i++) {
- if (callback(geojson.features[i], i) === false) break;
- }
- }
- }
- /**
- * Callback for featureReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback featureReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name featureReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {"foo": "bar"}),
- * turf.point([36, 53], {"hello": "world"})
- * ]);
- *
- * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * return currentFeature
- * });
- */
- function featureReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- featureEach(geojson, function (currentFeature, featureIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex);
- });
- return previousValue;
- }
- /**
- * Get all coordinates from any GeoJSON object.
- *
- * @name coordAll
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @returns {Array<Array<number>>} coordinate position array
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * var coords = turf.coordAll(features);
- * //= [[26, 37], [36, 53]]
- */
- function coordAll(geojson) {
- var coords = [];
- coordEach(geojson, function (coord) {
- coords.push(coord);
- });
- return coords;
- }
- /**
- * Callback for geomEach
- *
- * @callback geomEachCallback
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
- *
- * @name geomEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @returns {void}
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * });
- */
- function geomEach(geojson, callback) {
- var i, j, g, geometry, stopG,
- geometryMaybeCollection,
- isGeometryCollection,
- featureProperties,
- featureBBox,
- featureId,
- featureIndex = 0,
- isFeatureCollection = geojson.type === 'FeatureCollection',
- isFeature = geojson.type === 'Feature',
- stop = isFeatureCollection ? geojson.features.length : 1;
- // This logic may look a little weird. The reason why it is that way
- // is because it's trying to be fast. GeoJSON supports multiple kinds
- // of objects at its root: FeatureCollection, Features, Geometries.
- // This function has the responsibility of handling all of them, and that
- // means that some of the `for` loops you see below actually just don't apply
- // to certain inputs. For instance, if you give this just a
- // Point geometry, then both loops are short-circuited and all we do
- // is gradually rename the input until it's called 'geometry'.
- //
- // This also aims to allocate as few resources as possible: just a
- // few numbers and booleans, rather than any temporary arrays as would
- // be required with the normalization approach.
- for (i = 0; i < stop; i++) {
- geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
- (isFeature ? geojson.geometry : geojson));
- featureProperties = (isFeatureCollection ? geojson.features[i].properties :
- (isFeature ? geojson.properties : {}));
- featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
- (isFeature ? geojson.bbox : undefined));
- featureId = (isFeatureCollection ? geojson.features[i].id :
- (isFeature ? geojson.id : undefined));
- isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
- stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
- for (g = 0; g < stopG; g++) {
- geometry = isGeometryCollection ?
- geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
- // Handle null Geometry
- if (geometry === null) {
- if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- continue;
- }
- switch (geometry.type) {
- case 'Point':
- case 'LineString':
- case 'MultiPoint':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon': {
- if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- break;
- }
- case 'GeometryCollection': {
- for (j = 0; j < geometry.geometries.length; j++) {
- if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
- }
- break;
- }
- default:
- throw new Error('Unknown Geometry Type');
- }
- }
- // Only increase `featureIndex` per each feature
- featureIndex++;
- }
- }
- /**
- * Callback for geomReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback geomReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Geometry} currentGeometry The current Geometry being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {Object} featureProperties The current Feature Properties being processed.
- * @param {Array<number>} featureBBox The current Feature BBox being processed.
- * @param {number|string} featureId The current Feature Id being processed.
- */
- /**
- * Reduce geometry in any GeoJSON object, similar to Array.reduce().
- *
- * @name geomReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.point([36, 53], {hello: 'world'})
- * ]);
- *
- * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- * //=previousValue
- * //=currentGeometry
- * //=featureIndex
- * //=featureProperties
- * //=featureBBox
- * //=featureId
- * return currentGeometry
- * });
- */
- function geomReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
- else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
- });
- return previousValue;
- }
- /**
- * Callback for flattenEach
- *
- * @callback flattenEachCallback
- * @param {Feature} currentFeature The current flattened feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Iterate over flattened features in any GeoJSON object, similar to
- * Array.forEach.
- *
- * @name flattenEach
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * });
- */
- function flattenEach(geojson, callback) {
- geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
- // Callback for single geometry
- var type = (geometry === null) ? null : geometry.type;
- switch (type) {
- case null:
- case 'Point':
- case 'LineString':
- case 'Polygon':
- if (callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
- return;
- }
- var geomType;
- // Callback for multi-geometry
- switch (type) {
- case 'MultiPoint':
- geomType = 'Point';
- break;
- case 'MultiLineString':
- geomType = 'LineString';
- break;
- case 'MultiPolygon':
- geomType = 'Polygon';
- break;
- }
- for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
- var coordinate = geometry.coordinates[multiFeatureIndex];
- var geom = {
- type: geomType,
- coordinates: coordinate
- };
- if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
- }
- });
- }
- /**
- * Callback for flattenReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback flattenReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature} currentFeature The current Feature being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- */
- /**
- * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
- *
- * @name flattenReduce
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
- * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var features = turf.featureCollection([
- * turf.point([26, 37], {foo: 'bar'}),
- * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
- * ]);
- *
- * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
- * //=previousValue
- * //=currentFeature
- * //=featureIndex
- * //=multiFeatureIndex
- * return currentFeature
- * });
- */
- function flattenReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
- if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
- else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
- });
- return previousValue;
- }
- /**
- * Callback for segmentEach
- *
- * @callback segmentEachCallback
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- * @returns {void}
- */
- /**
- * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //=currentSegment
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * //=segmentIndex
- * });
- *
- * // Calculate the total number of segments
- * var total = 0;
- * turf.segmentEach(polygon, function () {
- * total++;
- * });
- */
- function segmentEach(geojson, callback) {
- flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- var segmentIndex = 0;
- // Exclude null Geometries
- if (!feature$$1.geometry) return;
- // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- var type = feature$$1.geometry.type;
- if (type === 'Point' || type === 'MultiPoint') return;
- // Generate 2-vertex line segments
- var previousCoords;
- if (coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
- // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
- if (previousCoords === undefined) {
- previousCoords = currentCoord;
- return;
- }
- var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
- if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
- segmentIndex++;
- previousCoords = currentCoord;
- }) === false) return false;
- });
- }
- /**
- * Callback for segmentReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback segmentReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentSegment The current Segment being processed.
- * @param {number} featureIndex The current index of the Feature being processed.
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
- * @param {number} geometryIndex The current index of the Geometry being processed.
- * @param {number} segmentIndex The current index of the Segment being processed.
- */
- /**
- * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
- * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
- * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {void}
- * @example
- * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
- *
- * // Iterate over GeoJSON by 2-vertex segments
- * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- * //= previousSegment
- * //= currentSegment
- * //= featureIndex
- * //= multiFeatureIndex
- * //= geometryIndex
- * //= segmentInex
- * return currentSegment
- * });
- *
- * // Calculate the total number of segments
- * var initialValue = 0
- * var total = turf.segmentReduce(polygon, function (previousValue) {
- * previousValue++;
- * return previousValue;
- * }, initialValue);
- */
- function segmentReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- var started = false;
- segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
- if (started === false && initialValue === undefined) previousValue = currentSegment;
- else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
- started = true;
- });
- return previousValue;
- }
- /**
- * Callback for lineEach
- *
- * @callback lineEachCallback
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
- * similar to Array.forEach.
- *
- * @name lineEach
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @example
- * var multiLine = turf.multiLineString([
- * [[26, 37], [35, 45]],
- * [[36, 53], [38, 50], [41, 55]]
- * ]);
- *
- * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * });
- */
- function lineEach(geojson, callback) {
- // validation
- if (!geojson) throw new Error('geojson is required');
- flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
- if (feature$$1.geometry === null) return;
- var type = feature$$1.geometry.type;
- var coords = feature$$1.geometry.coordinates;
- switch (type) {
- case 'LineString':
- if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
- break;
- case 'Polygon':
- for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
- if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
- }
- break;
- }
- });
- }
- /**
- * Callback for lineReduce
- *
- * The first time the callback function is called, the values provided as arguments depend
- * on whether the reduce method has an initialValue argument.
- *
- * If an initialValue is provided to the reduce method:
- * - The previousValue argument is initialValue.
- * - The currentValue argument is the value of the first element present in the array.
- *
- * If an initialValue is not provided:
- * - The previousValue argument is the value of the first element present in the array.
- * - The currentValue argument is the value of the second element present in the array.
- *
- * @callback lineReduceCallback
- * @param {*} previousValue The accumulated value previously returned in the last invocation
- * of the callback, or initialValue, if supplied.
- * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
- * @param {number} featureIndex The current index of the Feature being processed
- * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
- * @param {number} geometryIndex The current index of the Geometry being processed
- */
- /**
- * Reduce features in any GeoJSON object, similar to Array.reduce().
- *
- * @name lineReduce
- * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
- * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
- * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
- * @returns {*} The value that results from the reduction.
- * @example
- * var multiPoly = turf.multiPolygon([
- * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
- * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
- * ]);
- *
- * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- * //=previousValue
- * //=currentLine
- * //=featureIndex
- * //=multiFeatureIndex
- * //=geometryIndex
- * return currentLine
- * });
- */
- function lineReduce(geojson, callback, initialValue) {
- var previousValue = initialValue;
- lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
- if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
- else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
- });
- return previousValue;
- }
- /**
- * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- * Point & MultiPoint will always return null.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.segmentIndex=0] Segment Index
- * @param {Object} [options.properties={}] Translate Properties to output LineString
- * @param {BBox} [options.bbox={}] Translate BBox to output LineString
- * @param {number|string} [options.id={}] Translate Id to output LineString
- * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findSegment(multiLine);
- * // => Feature<LineString<[[10, 10], [50, 30]]>>
- *
- * // First Segment of 2nd Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: 1});
- * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
- *
- * // Last Segment of Last Multi Feature
- * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
- * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
- */
- function findSegment(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var segmentIndex = options.segmentIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find SegmentIndex
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
- return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
- return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
- return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
- return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- /**
- * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
- *
- * Negative indexes are permitted.
- *
- * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
- * @param {Object} [options={}] Optional parameters
- * @param {number} [options.featureIndex=0] Feature Index
- * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
- * @param {number} [options.geometryIndex=0] Geometry Index
- * @param {number} [options.coordIndex=0] Coord Index
- * @param {Object} [options.properties={}] Translate Properties to output Point
- * @param {BBox} [options.bbox={}] Translate BBox to output Point
- * @param {number|string} [options.id={}] Translate Id to output Point
- * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
- * @example
- * var multiLine = turf.multiLineString([
- * [[10, 10], [50, 30], [30, 40]],
- * [[-10, -10], [-50, -30], [-30, -40]]
- * ]);
- *
- * // First Segment (defaults are 0)
- * turf.findPoint(multiLine);
- * // => Feature<Point<[10, 10]>>
- *
- * // First Segment of the 2nd Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: 1});
- * // => Feature<Point<[-10, -10]>>
- *
- * // Last Segment of last Multi-Feature
- * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
- * // => Feature<Point<[-30, -40]>>
- */
- function findPoint(geojson, options) {
- // Optional Parameters
- options = options || {};
- if (!isObject(options)) throw new Error('options is invalid');
- var featureIndex = options.featureIndex || 0;
- var multiFeatureIndex = options.multiFeatureIndex || 0;
- var geometryIndex = options.geometryIndex || 0;
- var coordIndex = options.coordIndex || 0;
- // Find FeatureIndex
- var properties = options.properties;
- var geometry;
- switch (geojson.type) {
- case 'FeatureCollection':
- if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
- properties = properties || geojson.features[featureIndex].properties;
- geometry = geojson.features[featureIndex].geometry;
- break;
- case 'Feature':
- properties = properties || geojson.properties;
- geometry = geojson.geometry;
- break;
- case 'Point':
- case 'MultiPoint':
- return null;
- case 'LineString':
- case 'Polygon':
- case 'MultiLineString':
- case 'MultiPolygon':
- geometry = geojson;
- break;
- default:
- throw new Error('geojson is invalid');
- }
- // Find Coord Index
- if (geometry === null) return null;
- var coords = geometry.coordinates;
- switch (geometry.type) {
- case 'Point':
- return point(coords, properties, options);
- case 'MultiPoint':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- return point(coords[multiFeatureIndex], properties, options);
- case 'LineString':
- if (coordIndex < 0) coordIndex = coords.length + coordIndex;
- return point(coords[coordIndex], properties, options);
- case 'Polygon':
- if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
- return point(coords[geometryIndex][coordIndex], properties, options);
- case 'MultiLineString':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
- return point(coords[multiFeatureIndex][coordIndex], properties, options);
- case 'MultiPolygon':
- if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
- if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
- if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
- return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
- }
- throw new Error('geojson is invalid');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/bbox/main.es.js
- /**
- * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
- *
- * @name bbox
- * @param {GeoJSON} geojson any GeoJSON object
- * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
- * var bbox = turf.bbox(line);
- * var bboxPolygon = turf.bboxPolygon(bbox);
- *
- * //addToMap
- * var addToMap = [line, bboxPolygon]
- */
- function main_es_bbox(geojson) {
- var BBox = [Infinity, Infinity, -Infinity, -Infinity];
- coordEach(geojson, function (coord) {
- if (BBox[0] > coord[0]) BBox[0] = coord[0];
- if (BBox[1] > coord[1]) BBox[1] = coord[1];
- if (BBox[2] < coord[0]) BBox[2] = coord[0];
- if (BBox[3] < coord[1]) BBox[3] = coord[1];
- });
- return BBox;
- }
- /* harmony default export */ var main_es = (main_es_bbox);
- // CONCATENATED MODULE: ./node_modules/@turf/bbox-polygon/node_modules/@turf/helpers/main.es.js
- /**
- * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
- */
- var main_es_earthRadius = 6371008.8;
- /**
- * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
- */
- var main_es_factors = {
- meters: main_es_earthRadius,
- metres: main_es_earthRadius,
- millimeters: main_es_earthRadius * 1000,
- millimetres: main_es_earthRadius * 1000,
- centimeters: main_es_earthRadius * 100,
- centimetres: main_es_earthRadius * 100,
- kilometers: main_es_earthRadius / 1000,
- kilometres: main_es_earthRadius / 1000,
- miles: main_es_earthRadius / 1609.344,
- nauticalmiles: main_es_earthRadius / 1852,
- inches: main_es_earthRadius * 39.370,
- yards: main_es_earthRadius / 1.0936,
- feet: main_es_earthRadius * 3.28084,
- radians: 1,
- degrees: main_es_earthRadius / 111325,
- };
- /**
- * Units of measurement factors based on 1 meter.
- */
- var main_es_unitsFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000,
- millimetres: 1000,
- centimeters: 100,
- centimetres: 100,
- kilometers: 1 / 1000,
- kilometres: 1 / 1000,
- miles: 1 / 1609.344,
- nauticalmiles: 1 / 1852,
- inches: 39.370,
- yards: 1 / 1.0936,
- feet: 3.28084,
- radians: 1 / main_es_earthRadius,
- degrees: 1 / 111325,
- };
- /**
- * Area of measurement factors based on 1 square meter.
- */
- var main_es_areaFactors = {
- meters: 1,
- metres: 1,
- millimeters: 1000000,
- millimetres: 1000000,
- centimeters: 10000,
- centimetres: 10000,
- kilometers: 0.000001,
- kilometres: 0.000001,
- acres: 0.000247105,
- miles: 3.86e-7,
- yards: 1.195990046,
- feet: 10.763910417,
- inches: 1550.003100006
- };
- /**
- * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
- *
- * @name feature
- * @param {Geometry} geometry input geometry
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature} a GeoJSON Feature
- * @example
- * var geometry = {
- * "type": "Point",
- * "coordinates": [110, 50]
- * };
- *
- * var feature = turf.feature(geometry);
- *
- * //=feature
- */
- function main_es_feature(geometry, properties, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (geometry === undefined) throw new Error('geometry is required');
- if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
- if (bbox) main_es_validateBBox(bbox);
- if (id) main_es_validateId(id);
- // Main
- var feat = {type: 'Feature'};
- if (id) feat.id = id;
- if (bbox) feat.bbox = bbox;
- feat.properties = properties || {};
- feat.geometry = geometry;
- return feat;
- }
- /**
- * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
- * For GeometryCollection type use `helpers.geometryCollection`
- *
- * @name geometry
- * @param {string} type Geometry Type
- * @param {Array<number>} coordinates Coordinates
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
- * @returns {Geometry} a GeoJSON Geometry
- * @example
- * var type = 'Point';
- * var coordinates = [110, 50];
- *
- * var geometry = turf.geometry(type, coordinates);
- *
- * //=geometry
- */
- function helpers_main_es_geometry(type, coordinates, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- // Validation
- if (!type) throw new Error('type is required');
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (bbox) main_es_validateBBox(bbox);
- // Main
- var geom;
- switch (type) {
- case 'Point': geom = main_es_point(coordinates).geometry; break;
- case 'LineString': geom = main_es_lineString(coordinates).geometry; break;
- case 'Polygon': geom = main_es_polygon(coordinates).geometry; break;
- case 'MultiPoint': geom = main_es_multiPoint(coordinates).geometry; break;
- case 'MultiLineString': geom = main_es_multiLineString(coordinates).geometry; break;
- case 'MultiPolygon': geom = main_es_multiPolygon(coordinates).geometry; break;
- default: throw new Error(type + ' is invalid');
- }
- if (bbox) geom.bbox = bbox;
- return geom;
- }
- /**
- * Creates a {@link Point} {@link Feature} from a Position.
- *
- * @name point
- * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Point>} a Point feature
- * @example
- * var point = turf.point([-75.343, 39.984]);
- *
- * //=point
- */
- function main_es_point(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
- if (!main_es_isNumber(coordinates[0]) || !main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
- return main_es_feature({
- type: 'Point',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
- *
- * @name points
- * @param {Array<Array<number>>} coordinates an array of Points
- * @param {Object} [properties={}] Translate these properties to each Feature
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Point>} Point Feature
- * @example
- * var points = turf.points([
- * [-75, 39],
- * [-80, 45],
- * [-78, 50]
- * ]);
- *
- * //=points
- */
- function main_es_points(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_point(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
- *
- * @name polygon
- * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<Polygon>} Polygon Feature
- * @example
- * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
- *
- * //=polygon
- */
- function main_es_polygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- for (var i = 0; i < coordinates.length; i++) {
- var ring = coordinates[i];
- if (ring.length < 4) {
- throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
- }
- for (var j = 0; j < ring[ring.length - 1].length; j++) {
- // Check if first point of Polygon contains two numbers
- if (i === 0 && j === 0 && !main_es_isNumber(ring[0][0]) || !main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
- if (ring[ring.length - 1][j] !== ring[0][j]) {
- throw new Error('First and last Position are not equivalent.');
- }
- }
- }
- return main_es_feature({
- type: 'Polygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
- *
- * @name polygons
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
- * @example
- * var polygons = turf.polygons([
- * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
- * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
- * ]);
- *
- * //=polygons
- */
- function main_es_polygons(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_polygon(coords, properties);
- }), options);
- }
- /**
- * Creates a {@link LineString} {@link Feature} from an Array of Positions.
- *
- * @name lineString
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<LineString>} LineString Feature
- * @example
- * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
- * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
- *
- * //=linestring1
- * //=linestring2
- */
- function main_es_lineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
- // Check if first point of LineString contains two numbers
- if (!main_es_isNumber(coordinates[0][1]) || !main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
- return main_es_feature({
- type: 'LineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
- *
- * @name lineStrings
- * @param {Array<Array<number>>} coordinates an array of LinearRings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
- * @param {string|number} [options.id] Identifier associated with the FeatureCollection
- * @returns {FeatureCollection<LineString>} LineString FeatureCollection
- * @example
- * var linestrings = turf.lineStrings([
- * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
- * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
- * ]);
- *
- * //=linestrings
- */
- function main_es_lineStrings(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
- return main_es_featureCollection(coordinates.map(function (coords) {
- return main_es_lineString(coords, properties);
- }), options);
- }
- /**
- * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
- *
- * @name featureCollection
- * @param {Feature[]} features input features
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {FeatureCollection} FeatureCollection of Features
- * @example
- * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
- * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
- * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
- *
- * var collection = turf.featureCollection([
- * locationA,
- * locationB,
- * locationC
- * ]);
- *
- * //=collection
- */
- function main_es_featureCollection(features, options) {
- // Optional Parameters
- options = options || {};
- if (!main_es_isObject(options)) throw new Error('options is invalid');
- var bbox = options.bbox;
- var id = options.id;
- // Validation
- if (!features) throw new Error('No features passed');
- if (!Array.isArray(features)) throw new Error('features must be an Array');
- if (bbox) main_es_validateBBox(bbox);
- if (id) main_es_validateId(id);
- // Main
- var fc = {type: 'FeatureCollection'};
- if (id) fc.id = id;
- if (bbox) fc.bbox = bbox;
- fc.features = features;
- return fc;
- }
- /**
- * Creates a {@link Feature<MultiLineString>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiLineString
- * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiLineString>} a MultiLineString feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
- *
- * //=multiLine
- */
- function main_es_multiLineString(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiLineString',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPoint>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPoint
- * @param {Array<Array<number>>} coordinates an array of Positions
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPoint>} a MultiPoint feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPt = turf.multiPoint([[0,0],[10,10]]);
- *
- * //=multiPt
- */
- function main_es_multiPoint(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiPoint',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<MultiPolygon>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name multiPolygon
- * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<MultiPolygon>} a multipolygon feature
- * @throws {Error} if no coordinates are passed
- * @example
- * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
- *
- * //=multiPoly
- *
- */
- function main_es_multiPolygon(coordinates, properties, options) {
- if (!coordinates) throw new Error('coordinates is required');
- return main_es_feature({
- type: 'MultiPolygon',
- coordinates: coordinates
- }, properties, options);
- }
- /**
- * Creates a {@link Feature<GeometryCollection>} based on a
- * coordinate array. Properties can be added optionally.
- *
- * @name geometryCollection
- * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
- * @param {Object} [properties={}] an Object of key-value pairs to add as properties
- * @param {Object} [options={}] Optional Parameters
- * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
- * @param {string|number} [options.id] Identifier associated with the Feature
- * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
- * @example
- * var pt = {
- * "type": "Point",
- * "coordinates": [100, 0]
- * };
- * var line = {
- * "type": "LineString",
- * "coordinates": [ [101, 0], [102, 1] ]
- * };
- * var collection = turf.geometryCollection([pt, line]);
- *
- * //=collection
- */
- function main_es_geometryCollection(geometries, properties, options) {
- if (!geometries) throw new Error('geometries is required');
- if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
- return main_es_feature({
- type: 'GeometryCollection',
- geometries: geometries
- }, properties, options);
- }
- /**
- * Round number to precision
- *
- * @param {number} num Number
- * @param {number} [precision=0] Precision
- * @returns {number} rounded number
- * @example
- * turf.round(120.4321)
- * //=120
- *
- * turf.round(120.4321, 2)
- * //=120.43
- */
- function main_es_round(num, precision) {
- if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
- if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
- var multiplier = Math.pow(10, precision || 0);
- return Math.round(num * multiplier) / multiplier;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name radiansToLength
- * @param {number} radians in radians across the sphere
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} distance
- */
- function main_es_radiansToLength(radians, units) {
- if (radians === undefined || radians === null) throw new Error('radians is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return radians * factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @name lengthToRadians
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} radians
- */
- function main_es_lengthToRadians(distance, units) {
- if (distance === undefined || distance === null) throw new Error('distance is required');
- if (units && typeof units !== 'string') throw new Error('units must be a string');
- var factor = main_es_factors[units || 'kilometers'];
- if (!factor) throw new Error(units + ' units is invalid');
- return distance / factor;
- }
- /**
- * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
- *
- * @name lengthToDegrees
- * @param {number} distance in real units
- * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
- * @returns {number} degrees
- */
- function main_es_lengthToDegrees(distance, units) {
- return main_es_radiansToDegrees(main_es_lengthToRadians(distance, units));
- }
- /**
- * Converts any bearing angle from the north line direction (positive clockwise)
- * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
- *
- * @name bearingToAzimuth
- * @param {number} bearing angle, between -180 and +180 degrees
- * @returns {number} angle between 0 and 360 degrees
- */
- function main_es_bearingToAzimuth(bearing) {
- if (bearing === null || bearing === undefined) throw new Error('bearing is required');
- var angle = bearing % 360;
- if (angle < 0) angle += 360;
- return angle;
- }
- /**
- * Converts an angle in radians to degrees
- *
- * @name radiansToDegrees
- * @param {number} radians angle in radians
- * @returns {number} degrees between 0 and 360 degrees
- */
- function main_es_radiansToDegrees(radians) {
- if (radians === null || radians === undefined) throw new Error('radians is required');
- var degrees = radians % (2 * Math.PI);
- return degrees * 180 / Math.PI;
- }
- /**
- * Converts an angle in degrees to radians
- *
- * @name degreesToRadians
- * @param {number} degrees angle between 0 and 360 degrees
- * @returns {number} angle in radians
- */
- function main_es_degreesToRadians(degrees) {
- if (degrees === null || degrees === undefined) throw new Error('degrees is required');
- var radians = degrees % 360;
- return radians * Math.PI / 180;
- }
- /**
- * Converts a length to the requested unit.
- * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
- *
- * @param {number} length to be converted
- * @param {string} originalUnit of the length
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted length
- */
- function main_es_convertLength(length, originalUnit, finalUnit) {
- if (length === null || length === undefined) throw new Error('length is required');
- if (!(length >= 0)) throw new Error('length must be a positive number');
- return main_es_radiansToLength(main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
- }
- /**
- * Converts a area to the requested unit.
- * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
- * @param {number} area to be converted
- * @param {string} [originalUnit='meters'] of the distance
- * @param {string} [finalUnit='kilometers'] returned unit
- * @returns {number} the converted distance
- */
- function main_es_convertArea(area, originalUnit, finalUnit) {
- if (area === null || area === undefined) throw new Error('area is required');
- if (!(area >= 0)) throw new Error('area must be a positive number');
- var startFactor = main_es_areaFactors[originalUnit || 'meters'];
- if (!startFactor) throw new Error('invalid original units');
- var finalFactor = main_es_areaFactors[finalUnit || 'kilometers'];
- if (!finalFactor) throw new Error('invalid final units');
- return (area / startFactor) * finalFactor;
- }
- /**
- * isNumber
- *
- * @param {*} num Number to validate
- * @returns {boolean} true/false
- * @example
- * turf.isNumber(123)
- * //=true
- * turf.isNumber('foo')
- * //=false
- */
- function main_es_isNumber(num) {
- return !isNaN(num) && num !== null && !Array.isArray(num);
- }
- /**
- * isObject
- *
- * @param {*} input variable to validate
- * @returns {boolean} true/false
- * @example
- * turf.isObject({elevation: 10})
- * //=true
- * turf.isObject('foo')
- * //=false
- */
- function main_es_isObject(input) {
- return (!!input) && (input.constructor === Object);
- }
- /**
- * Validate BBox
- *
- * @private
- * @param {Array<number>} bbox BBox to validate
- * @returns {void}
- * @throws Error if BBox is not valid
- * @example
- * validateBBox([-180, -40, 110, 50])
- * //=OK
- * validateBBox([-180, -40])
- * //=Error
- * validateBBox('Foo')
- * //=Error
- * validateBBox(5)
- * //=Error
- * validateBBox(null)
- * //=Error
- * validateBBox(undefined)
- * //=Error
- */
- function main_es_validateBBox(bbox) {
- if (!bbox) throw new Error('bbox is required');
- if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
- if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
- bbox.forEach(function (num) {
- if (!main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
- });
- }
- /**
- * Validate Id
- *
- * @private
- * @param {string|number} id Id to validate
- * @returns {void}
- * @throws Error if Id is not valid
- * @example
- * validateId([-180, -40, 110, 50])
- * //=Error
- * validateId([-180, -40])
- * //=Error
- * validateId('Foo')
- * //=OK
- * validateId(5)
- * //=OK
- * validateId(null)
- * //=Error
- * validateId(undefined)
- * //=Error
- */
- function main_es_validateId(id) {
- if (!id) throw new Error('id is required');
- if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
- }
- // Deprecated methods
- function main_es_radians2degrees() {
- throw new Error('method has been renamed to `radiansToDegrees`');
- }
- function main_es_degrees2radians() {
- throw new Error('method has been renamed to `degreesToRadians`');
- }
- function main_es_distanceToDegrees() {
- throw new Error('method has been renamed to `lengthToDegrees`');
- }
- function main_es_distanceToRadians() {
- throw new Error('method has been renamed to `lengthToRadians`');
- }
- function main_es_radiansToDistance() {
- throw new Error('method has been renamed to `radiansToLength`');
- }
- function main_es_bearingToAngle() {
- throw new Error('method has been renamed to `bearingToAzimuth`');
- }
- function main_es_convertDistance() {
- throw new Error('method has been renamed to `convertLength`');
- }
- // CONCATENATED MODULE: ./node_modules/@turf/bbox-polygon/main.es.js
- /**
- * Takes a bbox and returns an equivalent {@link Polygon|polygon}.
- *
- * @name bboxPolygon
- * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
- * @returns {Feature<Polygon>} a Polygon representation of the bounding box
- * @example
- * var bbox = [0, 0, 10, 10];
- *
- * var poly = turf.bboxPolygon(bbox);
- *
- * //addToMap
- * var addToMap = [poly]
- */
- function bboxPolygon(bbox) {
- main_es_validateBBox(bbox);
- // Convert BBox positions to Numbers
- // No performance loss for including Number()
- // https://github.com/Turfjs/turf/issues/1119
- var west = Number(bbox[0]);
- var south = Number(bbox[1]);
- var east = Number(bbox[2]);
- var north = Number(bbox[3]);
- if (bbox.length === 6) throw new Error('@turf/bbox-polygon does not support BBox with 6 positions');
- var lowLeft = [west, south];
- var topLeft = [west, north];
- var topRight = [east, north];
- var lowRight = [east, south];
- return main_es_polygon([[
- lowLeft,
- lowRight,
- topRight,
- topLeft,
- lowLeft
- ]]);
- }
- /* harmony default export */ var bbox_polygon_main_es = (bboxPolygon);
- // CONCATENATED MODULE: ./node_modules/@turf/envelope/main.es.js
- /**
- * Takes any number of features and returns a rectangular {@link Polygon} that encompasses all vertices.
- *
- * @name envelope
- * @param {GeoJSON} geojson input features
- * @returns {Feature<Polygon>} a rectangular Polygon feature that encompasses all vertices
- * @example
- * var features = turf.featureCollection([
- * turf.point([-75.343, 39.984], {"name": "Location A"}),
- * turf.point([-75.833, 39.284], {"name": "Location B"}),
- * turf.point([-75.534, 39.123], {"name": "Location C"})
- * ]);
- *
- * var enveloped = turf.envelope(features);
- *
- * //addToMap
- * var addToMap = [features, enveloped];
- */
- function envelope(geojson) {
- return bbox_polygon_main_es(main_es(geojson));
- }
- /* harmony default export */ var envelope_main_es = __webpack_exports__["default"] = (envelope);
- /***/ }),
- /* 158 */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
- function _objectWithoutPropertiesLoose(source, excluded) {
- if (source == null) return {};
- var target = {};
- var sourceKeys = Object.keys(source);
- var key, i;
- for (i = 0; i < sourceKeys.length; i++) {
- key = sourceKeys[i];
- if (excluded.indexOf(key) >= 0) continue;
- target[key] = source[key];
- }
- return target;
- }
- // CONCATENATED MODULE: ./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _objectWithoutProperties; });
- function _objectWithoutProperties(source, excluded) {
- if (source == null) return {};
- var target = _objectWithoutPropertiesLoose(source, excluded);
- var key, i;
- if (Object.getOwnPropertySymbols) {
- var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
- for (i = 0; i < sourceSymbolKeys.length; i++) {
- key = sourceSymbolKeys[i];
- if (excluded.indexOf(key) >= 0) continue;
- if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
- target[key] = source[key];
- }
- }
- return target;
- }
- /***/ })
- /******/ ])["default"];
- });
|